]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 10: graph walking. Nice.
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 10 Dec 2024 05:27:09 +0000 (06:27 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 10 Dec 2024 05:27:09 +0000 (06:27 +0100)
2024/19.pl [new file with mode: 0755]
2024/20.pl [new file with mode: 0755]

diff --git a/2024/19.pl b/2024/19.pl
new file mode 100755 (executable)
index 0000000..5b9476b
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+use experimental 'for_list';
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               walk($x, $y, {}) if !$map[$y][$x];
+       }
+}
+say $sum;
+
+sub walk {
+       my ($x, $y, $seen) = @_;
+       return if $seen->{"$x,$y"}++;
+
+       my $now = $map[$y][$x];
+       if ($now == 9) {
+               $sum++;
+               return;
+       }
+
+       for my ($dx, $dy) (
+               -1, 0,
+               1, 0,
+               0, -1,
+               0, 1,
+       ) {
+               my ($nx, $ny) = ($x+$dx, $y+$dy);
+               next if $nx < 0 || $nx > $xmax || $ny < 0 || $ny > $ymax;
+               next if $map[$ny][$nx] != $now + 1;
+               walk($nx, $ny, $seen);
+       }
+}
diff --git a/2024/20.pl b/2024/20.pl
new file mode 100755 (executable)
index 0000000..a6ec2b1
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+use experimental 'for_list';
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               walk($x, $y) if !$map[$y][$x];
+       }
+}
+say $sum;
+
+sub walk {
+       my ($x, $y) = @_;
+
+       my $now = $map[$y][$x];
+       if ($now == 9) {
+               $sum++;
+               return;
+       }
+
+       for my ($dx, $dy) (
+               -1, 0,
+               1, 0,
+               0, -1,
+               0, 1,
+       ) {
+               my ($nx, $ny) = ($x+$dx, $y+$dy);
+               next if $nx < 0 || $nx > $xmax || $ny < 0 || $ny > $ymax;
+               next if $map[$ny][$nx] != $now + 1;
+               walk($nx, $ny);
+       }
+}