Курс по Raku / Приложение 🆕 / Работа с данни / Текст и низове / Exercises / Кодиране по дължина на серии

Решение: Кодиране по дължина на серии

Ето едно възможно решение на задачата.

Код

my $text = 'aaabbbbcc';

my $encoded = '';
for $text ~~ m:g/ (.) $0* / -> $match {
    $encoded ~= $match[0] ~ $match.chars;
}

say $encoded;

🦋 Намерете програмата във файла run-length.raku.

Изход

a3b4c2

Коментари

  1. Шаблонът (.) $0* прихваща един знак, а после съпоставя толкова негови следващи копия, колкото има — по цяла серия на съвпадение. m:g събира всяка серия.

  2. За всяка серия $match[0] е повтарящата се буква, а $match.chars е дължината на серията, така че двете заедно дават записи като a3.

  3. Именуването на съвпадението с -> $match е незадължително. Без него всяко съвпадение става темата $_ и можете да махнете променливата, като извиквате методите направо върху нея:

    my $text = 'aaabbbbcc';
    my $encoded = '';
    
    for $text ~~ m:g/ (.) $0* / {
        $encoded ~= .[0] ~ .chars;
    }
    
    say $encoded;

Навигация в курса

Кодиране по дължина на серии   |   Списъци, масиви и хешове