• Задача
  • Решение
  • Обсуждение

VisibleSymbols: ручная склейка кластеров

Для счётчика «видимых символов» без внешних зависимостей реализуйте visibleSymbols: продолжайте текущий кластер, если очередная руна — ZWJ (U+200D), вариационный селектор (U+FE0F), модификатор тона (U+1F3FB…U+1F3FF) или если предыдущая руна была ZWJ.

GolangРешение
func visibleSymbols(s string) []string {
	var clusters []string
	var cur []rune
	var prev rune
	flush := func() {
		if len(cur) > 0 {
			clusters = append(clusters, string(cur))
			cur = nil
		}
	}
	isExt := func(r rune) bool {
		return r == 0x200D || r == 0xFE0F || (r >= 0x1F3FB && r <= 0x1F3FF)
	}
	for _, r := range s {
		if len(cur) > 0 && (isExt(r) || prev == 0x200D) {
			cur = append(cur, r)
		} else {
			flush()
			cur = []rune{r}
		}
		prev = r
	}
	flush()
	return clusters
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

00:00:00
Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки