在 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 代码):
- 仅返回最长的 运行(s) 个重复数字,同时删除单个数字(使用
m:g
副词组合):
> put $/ if m:g/ \d**2..* % <same> / given '12334555611';
33 555 11
- 或者,根据您对原始问题的解释,返回 重叠的 运行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
我正在尝试查找数字中的重复数字组,例如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 代码):
- 仅返回最长的 运行(s) 个重复数字,同时删除单个数字(使用
m:g
副词组合):
> put $/ if m:g/ \d**2..* % <same> / given '12334555611';
33 555 11
- 或者,根据您对原始问题的解释,返回 重叠的 运行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