10 [ [0, 0], [1, 0], [2, 0], [3, 0] ], # horiz i
11 [ [0, 1], [1, 1], [2, 1], [1, 0], [1, 2] ], # x
12 [ [0, 0], [1, 0], [2, 0], [2, 1], [2, 2] ], # v
13 [ [0, 0], [0, 1], [0, 2], [0, 3] ], # vert i
14 [ [0, 0], [0, 1], [1, 0], [1, 1] ], # o
24 sub can_move($unit, $vect) {
25 # say "can_move $vect->[0] $vect->[1]";
27 my @dst = ($pt->[0] + $vect->[0], $pt->[1] + $vect->[1]);
28 return 0 if $dst[0] < 0 || $dst[0] >= $w;
29 return 0 if $dst[1] < 0;
30 return 0 if $map[$dst[1]][$dst[0]];
36 for my $y (reverse 0 .. $h) {
37 for my $x (0 .. $w-1) {
38 print $map[$y][$x] ? '#' : ' ';
45 while ($units < 2022) {
46 my $u = $units[$units % @units];
47 my ($x, $y) = (2, $h+3);
49 my $m = $moves[$move++];
50 $move = 0 if $move > $#moves;
52 $x++ if can_move($u, [$x+1, $y]);
54 $x-- if can_move($u, [$x-1, $y]);
56 if (can_move($u, [$x, $y-1])) {
63 $map[$y + $pt->[1]][$x + $pt->[0]] = 1;
64 $h = 1 + $y + $pt->[1] if $h < 1 + $y + $pt->[1];