Cursus Raku / Addendum 🆕 / Werken met gegevens / Tekst en strings / Exercises / Runlengtecodering

Oplossing: Runlengtecodering

Hier is een mogelijke oplossing voor de taak.

Code

my $text = 'aaabbbbcc';

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

say $encoded;

🦋 Je kunt de broncode vinden in het bestand run-length.raku.

Uitvoer

a3b4c2

Opmerkingen

  1. Het patroon (.) $0* captureert één teken en matcht daarna zoveel verdere kopieën ervan als erop volgen — één hele reeks per match. m:g verzamelt elke reeks.

  2. Voor elke reeks is $match[0] de herhaalde letter en $match.chars hoe lang de reeks is, dus samen geven de twee items als a3.

  3. De match met -> $match een naam geven is optioneel. Zonder dat wordt elke match het onderwerp $_, en kun je de variabele weglaten en de methoden er rechtstreeks op aanroepen:

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

Cursusnavigatie

Runlengtecodering   |   Lijsten, arrays en hashes