Курс Raku / Додаток 🆕 / Робота з даними / Текст і рядки / Вправи / Кодування довжин серій

Розв’язання: Кодування довжин серій

Ось одне з можливих розв’язань задачі.

Код

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;

Навігація курсом

Кодування довжин серій   |   Списки, масиви та хеші