如何过滤掉序列中的连续重复?
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」)
我正在尝试生成 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」)