如何过滤掉序列中的连续重复?

How can I filter out consecutive repeats in a sequence?

我正在尝试生成 Seq 随机选项,其中不允许连续重复:

> (<F R U>.roll(*).grep(* ne *))[^10]
((R F) (F U) (R F) (F R) (U R) (R F) (R F) (U F) (R U) (U R))

为什么以这种方式使用 grep 会导致嵌套对?我怎样才能实现我正在寻找的东西?使用上面的 .flat 仍然允许连续重复。

( R U F U F U R F R U ... )

how can I achieve what I'm looking for?

我相信 squish 方法会满足您的要求:

say <F R U>.roll(*).squish.head(20)

这会产生:

(U R F U F R F R F U F R U R F U R U R F)

Why does using grep in this way result in nested pairs?

因为 grep(和 map 也是)在 arity 大于 1 的东西上将通过将列表分成该大小的块来工作。因此给定 A B C D,对 grep 块的第一次调用得到 A B,第二个调用 C D,依此类推。然而,在这种情况下真正需要的是滞后值。可以在传递给 grep 的块中使用 state 变量来实现这一点,但是对于这个问题 squish 是一个更简单的解决方案。

您可以使用 <same> 零宽度匹配器来使用简单的正则表达式。在 Raku REPL 下方:

> my $a = (<F R U>.roll(*))[^20].comb(/\w/).join; say $a;
RRFUURFFFFRRFRFUFUUU

> say $/ if  $a ~~ m:g/ \w <!same> /;
(「R」 「F」 「U」 「R」 「F」 「R」 「F」 「R」 「F」 「U」 「F」 「U」)

https://docs.raku.org/language/regexes#Predefined_Regexes