]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 14: pretty straightforward
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 14 Dec 2022 07:05:00 +0000 (08:05 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 14 Dec 2022 07:47:33 +0000 (08:47 +0100)
2022/27.pl [new file with mode: 0755]
2022/28.pl [new file with mode: 0755]

diff --git a/2022/27.pl b/2022/27.pl
new file mode 100755 (executable)
index 0000000..425f1e6
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my @map;
+
+sub sgn($x) { $x > 0 ? 1 : $x < 0 ? -1 : 0 };
+
+my $maxy;
+while (<>) {
+       my ($x0, $y0);
+       my @list = /(\d+)/g;
+
+       for my ($x, $y) (@list) {
+               if (!defined $x0) {
+                       $x0 = $x; $y0 = $y;
+                       $map[$y][$x] = 1;
+               } else {
+                       while ($x0 != $x || $y0 != $y) {
+                               $x0 += sgn($x-$x0);
+                               $y0 += sgn($y-$y0);
+                               $map[$y0][$x0] = 1;
+                               $maxy = $y if !defined $maxy || $y > $maxy;
+                       }
+               }
+       }
+}
+
+my $units = 0;
+while (1) {
+       my ($sx, $sy) = (500, 0);
+
+       while ($sy <= $maxy) {
+               say "at $sx $sy";
+               if (!$map[$sy+1][$sx]) {
+                       $sy++;
+               } elsif (!$map[$sy+1][$sx-1]) {
+                       $sx--;
+                       $sy++;
+               } elsif (!$map[$sy+1][$sx+1]) {
+                       $sx++;
+                       $sy++;
+               } else {
+                       $map[$sy][$sx] = 2;
+                       last;
+               }
+       }
+       say "stopped at $sx, $sy";
+       last if $sy > $maxy;
+       $units++;
+}
+
+say $units;
diff --git a/2022/28.pl b/2022/28.pl
new file mode 100755 (executable)
index 0000000..4af8d29
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my @map;
+
+sub sgn($x) { $x > 0 ? 1 : $x < 0 ? -1 : 0 };
+
+my $maxy;
+while (<>) {
+       my ($x0, $y0);
+       my @list = /(\d+)/g;
+
+       for my ($x, $y) (@list) {
+               if (!defined $x0) {
+                       $x0 = $x; $y0 = $y;
+                       $map[$y][$x] = 1;
+               } else {
+                       while ($x0 != $x || $y0 != $y) {
+                               $x0 += sgn($x-$x0);
+                               $y0 += sgn($y-$y0);
+                               $map[$y0][$x0] = 1;
+                               $maxy = $y if !defined $maxy || $y > $maxy;
+                       }
+               }
+       }
+}
+
+my $units = 0;
+UNIT:
+while (1) {
+       my ($sx, $sy) = (500, 0);
+
+       while (1) {
+               if ($sy >= $maxy + 1) {
+                       $map[$sy][$sx] = 2;
+                       last;
+               } elsif (!$map[$sy+1][$sx]) {
+                       $sy++;
+               } elsif (!$map[$sy+1][$sx-1]) {
+                       $sx--;
+                       $sy++;
+               } elsif (!$map[$sy+1][$sx+1]) {
+                       $sx++;
+                       $sy++;
+               } else {
+                       last UNIT if $map[$sy][$sx];            
+                       $map[$sy][$sx] = 2;
+                       last;
+               }
+       }
+       $units++;
+       last if $sy == 0;
+}
+
+say $units;