]> www.fi.muni.cz Git - aoc.git/blob - 2022/28.pl
4af8d295fad90360bfb030f44824330100bb3bf3
[aoc.git] / 2022 / 28.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5 use experimental 'multidimensional';
6
7 my @map;
8
9 sub sgn($x) { $x > 0 ? 1 : $x < 0 ? -1 : 0 };
10
11 my $maxy;
12 while (<>) {
13         my ($x0, $y0);
14         my @list = /(\d+)/g;
15
16         for my ($x, $y) (@list) {
17                 if (!defined $x0) {
18                         $x0 = $x; $y0 = $y;
19                         $map[$y][$x] = 1;
20                 } else {
21                         while ($x0 != $x || $y0 != $y) {
22                                 $x0 += sgn($x-$x0);
23                                 $y0 += sgn($y-$y0);
24                                 $map[$y0][$x0] = 1;
25                                 $maxy = $y if !defined $maxy || $y > $maxy;
26                         }
27                 }
28         }
29 }
30
31 my $units = 0;
32 UNIT:
33 while (1) {
34         my ($sx, $sy) = (500, 0);
35
36         while (1) {
37                 if ($sy >= $maxy + 1) {
38                         $map[$sy][$sx] = 2;
39                         last;
40                 } elsif (!$map[$sy+1][$sx]) {
41                         $sy++;
42                 } elsif (!$map[$sy+1][$sx-1]) {
43                         $sx--;
44                         $sy++;
45                 } elsif (!$map[$sy+1][$sx+1]) {
46                         $sx++;
47                         $sy++;
48                 } else {
49                         last UNIT if $map[$sy][$sx];            
50                         $map[$sy][$sx] = 2;
51                         last;
52                 }
53         }
54         $units++;
55         last if $sy == 0;
56 }
57
58 say $units;