]> www.fi.muni.cz Git - aoc.git/blob - 2022/33.pl
Day 25: examining the input
[aoc.git] / 2022 / 33.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5
6 $_ = <>;
7 my @moves = /(\S)/g;
8
9 my @units = (
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
15 );
16
17 my @map;
18 my $w = 7;
19 my $h = 0;
20
21 my $units = 0;
22 my $move = 0;
23
24 sub can_move($unit, $vect) {
25         # say "can_move $vect->[0] $vect->[1]";
26         for my $pt (@$unit) {
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]];
31         }
32         return 1;
33 }
34
35 sub dump_map {
36         for my $y (reverse 0 .. $h) {
37                 for my $x (0 .. $w-1) {
38                         print $map[$y][$x] ? '#' : ' ';
39                 }
40                 print "\n";
41         }
42         say "---- $h ----";
43 }
44
45 while ($units < 2022) {
46         my $u = $units[$units % @units];
47         my ($x, $y) = (2, $h+3);
48         while (1) {     
49                 my $m = $moves[$move++];
50                 $move = 0 if $move > $#moves;
51                 if ($m eq '>') {
52                         $x++ if can_move($u, [$x+1, $y]);
53                 } else {
54                         $x-- if can_move($u, [$x-1, $y]);
55                 }
56                 if (can_move($u, [$x, $y-1])) {
57                         $y--;
58                         next;
59                 }
60                 last;
61         }
62         for my $pt (@$u) {
63                 $map[$y + $pt->[1]][$x + $pt->[0]] = 1;
64                 $h = 1 + $y + $pt->[1] if $h < 1 + $y + $pt->[1];
65         }
66         # dump_map();
67         $units++;
68 }
69
70 say $h;