my @delim = ( ["A", -3, "C"], ["C", -4, "B"] );
my @data = (
["A", -4, "A"],
["A", -1, "C"],
["C", -4, "D"],
["D", -4, "B"],
["B", -3, "C"],
["C", -2, "B"],
["B", -1, "E"]
);
####
#!/usr/bin/perl -l
use Algorithm::Loops 'NestedLoops';
my @delim = ...
my @data = ...
my $N = $#data;
my $D = $#delim;
NestedLoops(
[ [0 .. $N], sub {[$_ .. $N]},
( sub {[$_+1 .. $N]}, sub {[$_ .. $N]} ) x $D
],
{ OnlyWhen => sub {
return 0 if @_ < 2*@delim;
for my $d (0 .. $D) {
return 0 if $data[ $_[ $d*2 ] ][0] ne $delim[$d][0]
or $data[ $_[ $d*2 + 1 ] ][2] ne $delim[$d][2]
}
return 1;
} },
sub {
my @ranges = map { [@data[ $_[2*$_] .. $_[2*$_+1] ]] } 0 .. $D;
print join " / ",
map { my $range = $_; join " ", map "[@$_]", @$range } @ranges;
}
);
####
NestedLoops(
[ [0 .. $N], sub {[$_ .. $N]},
( sub {[$_+1 .. $N]}, sub {[$_ .. $N]} ) x $D
],
####
for my $i0 ( 0 .. $N ) {
for my $i1 ( $i0 .. $N ) {
for my $i2 ( $i1+1 .. $N ) {
for my $i3 ( $i2 .. $N ) {
...
####
{ OnlyWhen => sub {
return 0 if @_ < 2*@delim;
for my $d (0 .. $D) {
return 0 if $data[ $_[ $d*2 ] ][0] ne $delim[$d][0]
or $data[ $_[ $d*2 + 1 ] ][2] ne $delim[$d][2]
}
return 1;
} },
####
sub {
my @ranges = map { [@data[ $_[2*$_] .. $_[2*$_+1] ]] } 0 .. $D;
print join " / ",
map { my $range = $_; join " ", map "[@$_]", @$range } @ranges;
}
####
[A -4 A] [A -1 C] / [C -4 D] [D -4 B]
[A -4 A] [A -1 C] / [C -4 D] [D -4 B] [B -3 C] [C -2 B]
[A -4 A] [A -1 C] / [C -2 B]
[A -4 A] [A -1 C] [C -4 D] [D -4 B] [B -3 C] / [C -2 B]
[A -1 C] / [C -4 D] [D -4 B]
[A -1 C] / [C -4 D] [D -4 B] [B -3 C] [C -2 B]
[A -1 C] / [C -2 B]
[A -1 C] [C -4 D] [D -4 B] [B -3 C] / [C -2 B]
####
my @intervals = NestedLoops(
..
sub {
return [ map { [@data[ $_[2*$_] .. $_[2*$_+1] ]] } 0 .. $D ]
}
);