如何解决如何过滤掉序列中的连续重复?
我正在尝试生成一个 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 ... )
解决方法
我怎样才能实现我的目标?
我相信 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)
为什么以这种方式使用 grep 会导致嵌套对?
因为 grep
(和 map
也是)在具有大于 1 的数量的东西上将通过将列表分成该大小的块来工作。因此给定 A B C D
,对 grep
块的第一次调用得到 A B
,第二次 C D
,依此类推。然而,在这种情况下真正需要的是滞后值。可以在传递给 state
的块中使用 grep
变量来实现这一点,但是对于这个问题,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」)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。