Курс языка программирования Raku / Приложение 🆕 / Работа с данными / Текст и строки / Exercises / Кодирование длин серий
Решение: Кодирование длин серий
Вот один из возможных вариантов решения задачи.
Код
my $text = 'aaabbbbcc';
my $encoded = '';
for $text ~~ m:g/ (.) $0* / -> $match {
$encoded ~= $match[0] ~ $match.chars;
}
say $encoded;🦋 Исходный код можно найти в файле run-length.raku.
Вывод
a3b4c2Комментарии
Шаблон
(.) $0*захватывает один символ, а затем сопоставляется со всеми его копиями, идущими следом, — одна целая серия на совпадение.m:gсобирает все серии.Для каждой серии
$match[0]— это повторяющаяся буква, а$match.chars— её длина, так что вместе они дают записи вродеa3.Именовать совпадение через
-> $matchнеобязательно. Без этого каждое совпадение становится текущим значением$_, и переменную можно опустить, вызывая методы прямо на нём:my $text = 'aaabbbbcc'; my $encoded = ''; for $text ~~ m:g/ (.) $0* / { $encoded ~= .[0] ~ .chars; } say $encoded;