Perl在序列中递增的点插入
我有个问题,我希望有人能帮我解决 使用以下命令Perl在序列中递增的点插入,perl,loops,increment,Perl,Loops,Increment,我有个问题,我希望有人能帮我解决 使用以下命令 my @sequence = (1..9); my $newSequence = join " - ", @sequence; …我可以打印以连字符分隔的数字序列1-2-3-4-5-6-7-8-9 我遇到的问题是,在每次迭代中,循环递增变量字符串在数字序列中的位置(以产生如下所示的输出),但我不太知道解决这个问题的最佳逻辑方法 我希望实现的输出: DOG - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 1 - DOG - 3
my @sequence = (1..9);
my $newSequence = join " - ", @sequence;
…我可以打印以连字符分隔的数字序列1-2-3-4-5-6-7-8-9
我遇到的问题是,在每次迭代中,循环递增变量字符串在数字序列中的位置(以产生如下所示的输出),但我不太知道解决这个问题的最佳逻辑方法
我希望实现的输出:
DOG - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9
1 - DOG - 3 - 4 - 5 - 6 - 7 - 8 - 9
1 - 2 - DOG - 4 - 5 - 6 - 7 - 8 - 9
1 - 2 - 3 - DOG - 5 - 6 - 7 - 8 - 9
1 - 2 - 3 - 4 - DOG - 6 - 7 - 8 - 9
1 - 2 - 3 - 4 - 5 - DOG - 7 - 8 - 9
1 - 2 - 3 - 4 - 5 - 6 - DOG - 8 - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - DOG - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - DOG
这样做的最佳方式是什么?
非常感谢您的帮助,非常感谢使用阵列切片的解决方案:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw(say);
my $size = 9;
my @sequence = 1 .. $size;
for my $pos (0 .. $size - 1) {
say join ' - ', @sequence[ 0 .. $pos - 1 ],
'DOG',
@sequence[ $pos + 1 .. $size - 1 ];
}
使用阵列切片的解决方案:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw(say);
my $size = 9;
my @sequence = 1 .. $size;
for my $pos (0 .. $size - 1) {
say join ' - ', @sequence[ 0 .. $pos - 1 ],
'DOG',
@sequence[ $pos + 1 .. $size - 1 ];
}
我错过什么了吗?当然,这就是所需要的一切
use strict;
use warnings;
my @sequence = 1 .. 9;
for my $i (0 .. $#sequence) {
my @newseq = @sequence;
$newseq[$i] = 'DOG';
print join(' - ', @newseq), "\n";
}
输出
DOG - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9
1 - DOG - 3 - 4 - 5 - 6 - 7 - 8 - 9
1 - 2 - DOG - 4 - 5 - 6 - 7 - 8 - 9
1 - 2 - 3 - DOG - 5 - 6 - 7 - 8 - 9
1 - 2 - 3 - 4 - DOG - 6 - 7 - 8 - 9
1 - 2 - 3 - 4 - 5 - DOG - 7 - 8 - 9
1 - 2 - 3 - 4 - 5 - 6 - DOG - 8 - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - DOG - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - DOG
更新 对于那些一心想增加CPU空闲时间的人来说,这里有一个替代方案。我之所以提供它,是因为它比目前提出的任何一种解决方案都更清晰、更快。输出是相同的
use strict;
use warnings;
my @sequence = 1 .. 9;
for my $i (0 .. $#sequence) {
local $sequence[$i] = 'DOG';
my $s = join(' - ', @sequence);
}
我错过什么了吗?当然,这就是所需要的一切
use strict;
use warnings;
my @sequence = 1 .. 9;
for my $i (0 .. $#sequence) {
my @newseq = @sequence;
$newseq[$i] = 'DOG';
print join(' - ', @newseq), "\n";
}
输出
DOG - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9
1 - DOG - 3 - 4 - 5 - 6 - 7 - 8 - 9
1 - 2 - DOG - 4 - 5 - 6 - 7 - 8 - 9
1 - 2 - 3 - DOG - 5 - 6 - 7 - 8 - 9
1 - 2 - 3 - 4 - DOG - 6 - 7 - 8 - 9
1 - 2 - 3 - 4 - 5 - DOG - 7 - 8 - 9
1 - 2 - 3 - 4 - 5 - 6 - DOG - 8 - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - DOG - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - DOG
更新 对于那些一心想增加CPU空闲时间的人来说,这里有一个替代方案。我之所以提供它,是因为它比目前提出的任何一种解决方案都更清晰、更快。输出是相同的
use strict;
use warnings;
my @sequence = 1 .. 9;
for my $i (0 .. $#sequence) {
local $sequence[$i] = 'DOG';
my $s = join(' - ', @sequence);
}
在0+0处插入,然后在10+1处插入,然后在20+2处插入。。。换句话说,您将有两个计数器,一个以十为单位递增,另一个以一为单位递增。甚至是一个每次递增一的计数器,并在
$c*10+$c
处插入,例如,在0+0处插入,然后在10+1处插入,然后在20+2处插入。。。换句话说,您将有两个计数器,一个以十为单位递增,另一个以一为单位递增。甚至一个每次递增一的计数器,并在$c*10+$c
处插入。您在那里无缘无故地复制了许多数组。@gbtimmon我向您挑战,希望您做得更好。上面的代码大致完成了O(n²)SV
拷贝(数组拷贝)和O(n²)
SV*
拷贝(@newseq
元素作为堆栈上的连接
的参数),以及一些不相关的线性因子。我无法访问chorobas解决方案,因为我不知道切片是如何实现的,但如果切片中的范围产生SV
s,那么我们的复杂性肯定是相同的。@gbtimmon:它的工作方式是代码,(运行,优化,如果需要)*。不是优化,代码,run@Borodin*滚动眼睛*在复杂度较高且您试图将开发复杂度保持在最低水平时,开发大型流程和程序是有意义的。编写这样的未优化的简单函数只是懒惰。同样简单(但经过优化)的解决方案已经出现在本页上,并且很容易找到。如果不需要太多额外的脑力就可以开始优化,为什么不这样做呢?@gbtimmon:我很抱歉你的眼睛有问题,但我完全不同意。优化每件事所需的时间远远超过节省的时间,除非您处理的数据非常庞大。众所周知,在编程方面,懒惰是一种美德,高级语言本身就是这种懒惰的产物。如果你除了寻找最清晰的解决方案之外,你甚至不应该考虑使用Perl。你在那里毫无理由地复制了很多数组。上面的代码大致完成了O(n²)SV
拷贝(数组拷贝)和O(n²)
SV*
拷贝(@newseq
元素作为堆栈上的连接
的参数),以及一些不相关的线性因子。我无法访问chorobas解决方案,因为我不知道切片是如何实现的,但如果切片中的范围产生SV
s,那么我们的复杂性肯定是相同的。@gbtimmon:它的工作方式是代码,(运行,优化,如果需要)*。不是优化,代码,run@Borodin*滚动眼睛*在复杂度较高且您试图将开发复杂度保持在最低水平时,开发大型流程和程序是有意义的。编写这样的未优化的简单函数只是懒惰。同样简单(但经过优化)的解决方案已经出现在本页上,并且很容易找到。如果不需要太多额外的脑力就可以开始优化,为什么不这样做呢?@gbtimmon:我很抱歉你的眼睛有问题,但我完全不同意。优化每件事所需的时间远远超过节省的时间,除非您处理的数据非常庞大。众所周知,在编程方面,懒惰是一种美德,高级语言本身就是这种懒惰的产物。如果你除了寻找最清晰的解决方案之外,你甚至不应该考虑使用Perl。