4 use experimental 'multidimensional';
7 my @bricks = map { [ /\d+/g ] } <>;
12 for my $x ($b->[0] .. $b->[3]) {
13 for my $y ($b->[1] .. $b->[4]) {
14 for my $z ($b->[2] .. $b->[5]) {
22 for my $x ($b->[0] .. $b->[3]) {
23 for my $y ($b->[1] .. $b->[4]) {
24 for my $z ($b->[2] .. $b->[5]) {
25 undef $seen{$x,$y,$z};
32 return undef if !$b->[2];
35 for my $x ($b->[0] .. $b->[3]) {
36 for my $y ($b->[1] .. $b->[4]) {
37 return undef if $seen{$x,$y,$z};
42 set_brick($_) for @bricks;
49 next if !can_fall($b);
50 # say "falling $i (@$b)";
54 # say "fallen $i (@$b)";
62 for my $bi0 (0 .. $#bricks) {
63 my @bricks1 = map { [ @$_ ] } @bricks;
64 splice @bricks1, $bi0, 1;
66 set_brick($_) for @bricks1;
71 for my $bi1 (0 .. $#bricks1) {
72 my $b1 = $bricks1[$bi1];
73 next if !can_fall($b1);
74 # say "falling $i (@$b1)";
76 $b1->[2]--; $b1->[5]--;
78 # say "fallen $bi1 (@$b1)";
84 # say "falling $bi0 (@{ $bricks[$bi0] }) falls ", join(',',sort keys %f);