P08 - 消除列表元素中的连续重复项。

作者:Johan Viklund

我们定义了一个名为“compress”的中缀运算符,以便

'a' compress 'a' gives 'a'
'a' compress 'b' gives ('a','b')
(@a,'a') compress 'a' gives ( @a,'a')
(@a,'a') compress 'b' gives ( @a,'a','b')

现在我们需要做的就是拆分数组并插入 compress。

given <a a b c c d> we want:
'a' compress 'a' compress 'b' compress 'c' compress 'c' compress 'd'

reduce 元运算符正是这样做的。 例如

[+] (1,2,3,4,5) == 1 + 2 + 3 + 4 + 5 == 15
[~] <a b c d e> eq 'a' ~ 'b' ~ 'c' ~ 'd' ~ 'e' eq 'abcde'

规范

P08 (**) Eliminate consecutive duplicates of list elements.
    If a list contains repeated elements they should be replaced with a
    single copy of the element. The order of the elements should not be
    changed.

示例

> say [compress] <a a a a b c c a a d e e e e>
a b c a d e

源代码: P08-viklund.pl

use v6;

multi infix:<compress> ( $a, $b ) { $a      ~~ $b ?? $a !! ( $a, $b ) }
multi infix:<compress> ( @a, $b ) { @a[*-1] ~~ $b ?? @a !! ( @a, $b ).flat }

say ([compress] <a a a a b c c a a d e e e e>).perl;