Raku-Kurs / Anhang 🆕 / Arbeiten mit Daten / Text und Zeichenketten / Exercises / Lauflängenkodierung

Lösung: Lauflängenkodierung

Hier ist eine mögliche Lösung der Aufgabe.

Code

my $text = 'aaabbbbcc';

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

say $encoded;

🦋 Du findest den Quellcode in der Datei run-length.raku.

Ausgabe

a3b4c2

Kommentare

  1. Das Muster (.) $0* capturt ein Zeichen und trifft dann so viele weitere Kopien davon, wie folgen — ein ganzer Lauf je Treffer. m:g sammelt jeden Lauf ein.

  2. Für jeden Lauf ist $match[0] der wiederholte Buchstabe und $match.chars die Länge des Laufs, beides zusammen ergibt also Einträge wie a3.

  3. Den Treffer mit -> $match zu benennen ist freiwillig. Ohne das wird jeder Treffer zum Thema $_, und Sie können die Variable weglassen und die Methoden unmittelbar darauf aufrufen:

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

Kursnavigation

Lauflängenkodierung   |   Listen, Arrays und Hashes