]> www.fi.muni.cz Git - aoc.git/blob - 2022/27.pl
Day 14: pretty straightforward
[aoc.git] / 2022 / 27.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 while (1) {
33         my ($sx, $sy) = (500, 0);
34
35         while ($sy <= $maxy) {
36                 say "at $sx $sy";
37                 if (!$map[$sy+1][$sx]) {
38                         $sy++;
39                 } elsif (!$map[$sy+1][$sx-1]) {
40                         $sx--;
41                         $sy++;
42                 } elsif (!$map[$sy+1][$sx+1]) {
43                         $sx++;
44                         $sy++;
45                 } else {
46                         $map[$sy][$sx] = 2;
47                         last;
48                 }
49         }
50         say "stopped at $sx, $sy";
51         last if $sy > $maxy;
52         $units++;
53 }
54
55 say $units;