From 0077fc29c954b97d03f9d3799bde41e81a15b79a Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Wed, 14 Dec 2022 08:05:00 +0100 Subject: [PATCH] Day 14: pretty straightforward --- 2022/27.pl | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2022/28.pl | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100755 2022/27.pl create mode 100755 2022/28.pl diff --git a/2022/27.pl b/2022/27.pl new file mode 100755 index 0000000..425f1e6 --- /dev/null +++ b/2022/27.pl @@ -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 index 0000000..4af8d29 --- /dev/null +++ b/2022/28.pl @@ -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; -- 2.43.0