8 while (/(\w+) gener/g) {
11 while (/(\w+)-compat/g) {
16 my @q = ([ 0, 0, 1, \%items ]);
20 my %g_cur = map { substr($_, 1) => 1 }
21 grep { $_ =~ /^G/ && $itm->{$_} == $f } keys %$itm;
22 return 1 if !keys %g_cur;
23 for my $c (grep { $_ =~ /^M/ && $itm->{$_} == $f } keys %$itm) {
24 return undef if !$g_cur{ substr($c, 1) };
29 my @sorted = sort keys %items;
34 my ($w, $steps, $floor, $itm) = @$entry;
36 my $key = join('|', $floor, map { $itm->{$_} } @sorted);
38 next if $seen{$key}++;
41 next ENTRY if !valid_f($_, $itm);
45 if (!grep { $itm->{$_} != 4 } keys %$itm) {
50 for my $nf ($floor+1, $floor-1) {
51 next if $nf < 1 || $nf > 4;
52 for my $i (0 .. $#sorted) {
53 my $itm_i = $sorted[$i];
54 next if $itm->{$itm_i} != $floor;
55 for my $j ($i .. $#sorted) {
56 my $itm_j = $sorted[$j];
57 next if $itm->{$itm_j} != $floor;
59 say "moving $itm_i $itm_j from $floor to $nf steps $steps+1";
62 push @q, [ 0, $steps+1, $nf, \%nitm ];