4 use experimental 'multidimensional';
6 my @bricks = map { [ /\d+/g ] } <>;
11 for my $x ($b->[0] .. $b->[3]) {
12 for my $y ($b->[1] .. $b->[4]) {
13 for my $z ($b->[2] .. $b->[5]) {
21 for my $x ($b->[0] .. $b->[3]) {
22 for my $y ($b->[1] .. $b->[4]) {
23 for my $z ($b->[2] .. $b->[5]) {
24 undef $seen{$x,$y,$z};
31 return undef if !$b->[5];
34 for my $x ($b->[0] .. $b->[3]) {
35 for my $y ($b->[1] .. $b->[4]) {
36 return undef if $seen{$x,$y,$b->[2]-1};
41 set_brick($_) for @bricks;
48 next if !can_fall($b);
49 # say "falling $i (@$b)";
53 # say "fallen $i (@$b)";
60 my (%supported, %supports);
61 for my $bi0 (0 .. $#bricks) {
62 my $b0 = $bricks[$bi0];
65 for my $bi1 (0 .. $#bricks) {
67 my $b1 = $bricks[$bi1];
68 # say "possibly supports $bi0 (@$b0) $bi1 (@$b1)";
69 next if $b1->[2] != $b0->[5]+1;
70 for my $x0 ($b0->[0] .. $b0->[3]) {
71 for my $x1 ($b1->[0] .. $b1->[3]) {
73 for my $y0 ($b0->[1] .. $b0->[4]) {
74 for my $y1 ($b1->[1] .. $b1->[4]) {
76 $supports{$bi0}->{$bi1}++;
77 $supported{$bi1}->{$bi0}++;
84 for my $bi0 (0 .. $#bricks) {
85 for my $bi1 (keys %{ $supports{$bi0} }) {
86 next SBRICK if keys(%{ $supported{$bi1} }) == 1;