##
for my $i (0 .. $#A) {
$h{ $A[$i] } = [ @B[ grep { my $m = $_ % (2 * @A);
grep $_ == $m, $i, 2 * @A - $i - 1
} 0 .. $#B ] ];
}
##
##
my $iter = do {
my ($pos, $step) = ('0E0', 1);
sub {
my $r = $H{ $A[$pos] } ||= [];
if ($pos % $#A || $pos =~ /E/) {
$pos += $step;
} else {
$pos .= 'E0';
$step *= -1;
}
return $r
}
};
push @{ $iter->() }, $_ for @B;