Kurso de Raku / Aldono 🆕 / Labori kun datumoj / Teksto kaj ĉenoj / Exercises / Kodado laŭ serilongo

Solvo: Kodado laŭ serilongo

Jen ebla solvo de la tasko.

Kodo

my $text = 'aaabbbbcc';

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

say $encoded;

🦋 Vi povas trovi la fontkodon en la dosiero run-length.raku.

Eligo

a3b4c2

Komentoj

  1. La ŝablono (.) $0* kaptas unu signon kaj poste kongruas kun tiom da pliaj kopioj de ĝi, kiom sekvas — unu tuta serio por ĉiu kongruo. m:g kolektas ĉiun serion.

  2. Por ĉiu serio, $match[0] estas la ripetita litero kaj $match.chars estas, kiom longa la serio estas, do la du kune donas erojn kiel a3.

  3. Nomi la kongruon per -> $match estas laŭvola. Sen tio, ĉiu kongruo fariĝas la temo $_, kaj vi povas forlasi la variablon kaj voki la metodojn sur ĝi rekte:

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

Kursa navigado

Kodado laŭ serilongo   |   Listoj, tabeloj kaj haketmapoj