在 Raku 中查找重复数字的优雅方式(née Perl 6)

Elegant way to find repeated digits in Raku (née Perl 6)

我正在尝试查找数字中的重复数字组,例如12334555611 变成 (1 2 33 4 555 6 11).

这个有效:

$n.comb(/ 0+ | 1+ | 2+ | 3+ | 4+ | 5+ | 6+ | 7+ | 8+ | 9+ /)

但不是很优雅

有更好的方法吗?

您可以使用

$n.comb(/(.) [=10=]*/)

(.) 创建一个捕获组并将任何字符捕获到组 1 中,然后在 Perl6 正则表达式中有一个对组 1 的反向引用 [=12=]* 量词与第 1 组中相同字符的零次或多次匹配。

如果您只需要匹配重复的数字,请将 . 替换为 \d 以匹配任何数字。

看到一个Perl6 demo online

'12334555611'.comb(/\d+ % <same>/)

Please check the answer of the first task of Perl Weekly Challenge

如果有人导航到这里想要删除单个数字(下面的 Raku REPL 代码):

  1. 仅返回最长的 运行(s) 个重复数字,同时删除单个数字(使用 m:g 副词组合):

    > put $/ if m:g/ \d**2..* % <same> / given '12334555611';
    33 555 11

  1. 或者,根据您对原始问题的解释,返回 重叠的 运行s 重复数字(使用 m:ov 副词组合):

    > put $/ if m:ov/ \d**2..* % <same> / given '12334555611';
    33 555 55 11

随着重复 运行s 变长,两个版本之间的差异特别显着:


    > given '122333444455555666666' {put $/ if m:g/ \d**2..* % <same> /};
    22 333 4444 55555 666666

    > given '122333444455555666666' {put $/ if m:ov/ \d**2..* % <same> /};
    22 333 33 4444 444 44 55555 5555 555 55 666666 66666 6666 666 66