Я тоже не очень разбираюсь в Ruby, но, как я заметил в другом комментарии, похоже, это работает для описанного алгоритма.
s = "mississippi"
s.split('').sort.join.gsub(/(.)\1{2,}/) { |s| s.length.to_s + s[0,1] }
Конечно, вам нужно убедиться, что слово строчное, не содержит цифр и т. Д.
По запросу я постараюсь объяснить код. Пожалуйста, прости меня, если я не понимаю всю терминологию Ruby или reg ex, но здесь все.
Я думаю, что разделить / отсортировать / объединить довольно просто. Интересная часть для меня начинается с звонка в gsub. Это заменит подстроку, которая соответствует регулярному выражению, возвращаемым значением из блока, следующего за ним. Reg ex находит любого персонажа и создает обратную ссылку. Это часть "(.)". Затем мы продолжаем процесс сопоставления, используя обратную ссылку "\ 1", которая оценивает любой символ, найденный в первой части совпадения. Мы хотим, чтобы этот символ был найден как минимум еще два раза для общего минимального числа вхождений три. Это делается с помощью квантификатора "{2,}".
Если совпадение найдено, соответствующая подстрока затем передается следующему блоку кода в качестве аргумента благодаря "| s |" часть. Наконец, мы используем строковый эквивалент длины совпадающей подстроки и добавляем к ней любой символ, составляющий эту подстроку (все они должны быть одинаковыми), и возвращаем объединенное значение. Возвращаемое значение заменяет исходную совпадающую подстроку. Весь процесс продолжается до тех пор, пока ничего не останется для сопоставления, поскольку это глобальная замена исходной строки.
Я прошу прощения, если это сбивает с толку. Как это часто бывает, мне проще визуализировать решение, чем четко его объяснить.