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
}Записаться на разбор
10 000 ₽ · 60 минут · онлайн