Arrays 在perl中,如何从区间数组中获取补码区间?
解释我的疑问最简单的方法是举个例子。。。以下是: 我在perl中有一个数组,带有一组区间,我需要获得互补区间,换句话说,该区间的反映像。发件人: @ary1=qw(23-44 85-127 168-209) 打印间隔:23-44、85-127、168-209 将其转换为: …-22,45-84128-167210- 非常感谢您的考虑Arrays 在perl中,如何从区间数组中获取补码区间?,arrays,perl,intervals,Arrays,Perl,Intervals,解释我的疑问最简单的方法是举个例子。。。以下是: 我在perl中有一个数组,带有一组区间,我需要获得互补区间,换句话说,该区间的反映像。发件人: @ary1=qw(23-44 85-127 168-209) 打印间隔:23-44、85-127、168-209 将其转换为: …-22,45-84128-167210- 非常感谢您的考虑 如果间隔已排序且不重叠: #!/usr/bin/perl use warnings; use strict; use List::MoreUtils qw{ n
如果间隔已排序且不重叠:
#!/usr/bin/perl
use warnings;
use strict;
use List::MoreUtils qw{ natatime };
my @ary1 = qw(23-44 85-127 168-209);
my $diff = 1;
my $pair = natatime 2, '...',
map({ map { $diff *= -1; $_ + $diff }
split /-/
} @ary1),
'...';
my @compl;
while (my ($from, $to) = $pair->()) {
push @compl, "$from-$to";
}
print "@compl\n";
输出
...-22 45-84 128-167 210-...
[["...", 22], [45, 84], [128, 167], [210, "..."]]
...-22, 45-84, 128-167, 210-...
您可能更喜欢此解决方案,其工作原理与
@Choroba
中的答案类似
我已经使用Data::Dump
和print
显示了生成的@对
数组,前者显示了数组的内容,以防需要进一步处理,后者输出符合问题要求的文本
use strict;
use warnings;
my @input = qw/ 23-44 85-127 168-209 /;
my $begin;
my @pairs;
for (@input) {
next unless /(\d+)-(\d+)/;
push @pairs, [ $begin // '...', $1-1 ];
$begin = $2+1;
}
push @pairs, [ $begin, '...' ];
use Data::Dump;
dd \@pairs;
print join(', ', map join('-', @$_), @pairs), "\n";
输出
...-22 45-84 128-167 210-...
[["...", 22], [45, 84], [128, 167], [210, "..."]]
...-22, 45-84, 128-167, 210-...
如果给定的集合包含-Inf或+Inf,则所提供的解决方案都不起作用,例如:
(“…-22”、“45-84”、“128-167”、“210-…”)
如果间隔已排序且不重叠,且数据始终符合给定语法,则以下解决方案也适用于上述情况(与@Borodin
提供的解决方案非常相似):
说你没有关于该地区的信息,这似乎对我必须解决的一些具体案例是正确的,谢谢!