P13 - 列表的行程编码(直接解法)。

作者:Philip Potter

我们使用 gather 作为循环修饰符,在所有循环迭代中收集列表

规范

P13 (**) Run-length encoding of a list (direct solution).
    Implement the so-called run-length encoding data compression method
    directly. I.e. don't explicitly create the sublists containing the
    duplicates, as in problem P09, but only count them. As in problem P11,
    simplify the result list by replacing the singletons [1,X] by X.

示例

> encode_direct(<a a a a b c c a a d e e e e>).perl.say
([4, "a"], "b", [2, "c"], [2, "a"], "d", [4, "e"])

源代码: P13-rhebus.pl

use v6;

sub runlength (@a) {
    gather {
        last if [email protected];

        my $val = @a.shift;
        my $num = 1;
        while @a[0] ~~ $val { @a.shift; $num++; }
        take $num == 1 ?? $val !! [$num,$val];
    }
}

my @l = <a a a a b c c a a d e e e e>;

say ~@l;
runlength(@l).list.perl.say;