gpt4 book ai didi

raku - 在给定位置分割字符串

转载 作者:行者123 更新时间:2023-12-03 16:00:12 25 4
gpt4 key购买 nike

我如何很好地/惯用地在位置列表中分割字符串?

是)我有的:

.say for split-at( "0019ABX26002", (3, 4, 8) ); 

sub split-at( $s, @positions )
{
my $done = 0;

gather
{
for @positions -> $p
{
take $s.substr($done, $p - $done );
$done = $p;
}
take $s.substr( $done, * );
}
}

这是合理的。不过,我对此缺乏语言支持感到困惑。如果说“ split ”,那为什么不也“ split ”呢?我认为这应该是一项核心行动。我应该会写
.say for "0019ABX26002".split( :at(3, 4, 8) );

或者也许我正在忽略某些东西?

编辑:到目前为止我们所拥有的一些基准
O------------O---------O------------O--------O-------O-------O
| | Rate | array-push | holli | raiph | simon |
O============O=========O============O========O=======O=======O
| array-push | 15907/s | -- | -59% | -100% | -91% |
| holli | 9858/s | 142% | -- | -100% | -79% |
| raiph | 72.8/s | 50185% | 20720% | -- | 4335% |
| simon | 2901/s | 1034% | 369% | -98% | -- |
O------------O---------O------------O--------O-------O-------O

代码:
use Bench;

my $s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccddddddddddddddddddddddddddddddddddddefggggggggggggggggggg";
my @p = 29, 65, 69, 105, 106, 107;

Bench.new.cmpthese(1000, {
holli => sub { my @ = holli($s, @p); },
simon => sub { my @ = simon($s, @p); },
raiph => sub { my @ = raiph($s, @p); },
array-push => sub { my @ = array-push($s, @p); },
});

#say user($s, @p);


sub simon($str, *@idxs ) {
my @rotors = @idxs.map( { state $l = 0; my $o = $_ - $l; $l = $_; $o } );
$str.comb("").rotor( |@rotors,* ).map(*.join(""));
}

sub raiph($s, @p) {
$s.split( / <?{$/.pos == any(@p)}> / )
}

sub holli( $s, @positions )
{
my $done = 0;

gather
{
for @positions -> $p
{
take $s.substr($done, $p - $done );
$done = $p;
}
take $s.substr( $done, * );
}
}

sub array-push( $s, @positions )
{
my $done = 0;
my @result;

for @positions -> $p
{
@result.push: $s.substr($done, $p - $done );
$done = $p;
}
@result.push: $s.substr( $done, * );

@result;
}

最佳答案

我个人将其拆分为一个列表,使用rotor将列表划分并加入结果:

"0019ABX26002".comb().rotor(3,1,4,*).map(*.join)

如果要拆分功能(使用给定的索引):
sub split-at( $str, *@idxs ) { 
my @rotors = @idxs.map( { state $l = 0; my $o = $_ - $l; $l = $_; $o } );
$str.comb("").rotor( |@rotors,* ).map(*.join(""));
}

基本上,如果我想做列表类型的东西,我会使用列表。

从功能编程的角度来看,我想出了一个我真的很喜欢的版本:
sub split-at( $str, *@idxs ) {
(|@idxs, $str.codes)
==> map( { state $s = 0;my $e = $_ - $s;my $o = [$s,$e]; $s = $_; $o } )
==> map( { $str.substr(|$_) } );
}

它的工作原理要比另一个慢一些。

关于raku - 在给定位置分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59864867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com