]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 12: not very complicated BFS
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 13 Dec 2022 05:42:40 +0000 (06:42 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 13 Dec 2022 05:42:40 +0000 (06:42 +0100)
2022/23.pl [new file with mode: 0755]
2022/24.pl [new file with mode: 0755]

diff --git a/2022/23.pl b/2022/23.pl
new file mode 100755 (executable)
index 0000000..960e3ef
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my @m = map { chomp; [ split // ] } <>;
+
+my $xmax = $#{ $m[0] };
+my $ymax = $#m;
+
+my ($sx, $sy);
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               if ($m[$y][$x] eq 'S') {
+                       $sx = $x; $sy = $y;
+                       $m[$y][$x] = 'a';
+               }
+       }
+}
+
+my %seen;
+my @q = [ $sx, $sy ];
+
+while (@q) {
+       my $pt = shift @q;
+       my ($x, $y, @path) = @$pt;
+
+       say "walking ", join(' ', @$pt);
+
+       my $h = $m[$y][$x];
+
+       next if $seen{"$x,$y"}++;
+
+       if ($h eq 'E') {
+               say "FOUND";
+               say scalar @path, ': ', @path;
+               exit 0;
+       }
+
+       for my $pt1 ([-1, 0], [1, 0], [0, -1], [0, 1]) {
+               my ($dx, $dy) = @$pt1;
+               my ($nx, $ny) = ($x+$dx, $y+$dy);
+               next if $nx > $xmax || $nx < 0 || $ny > $ymax || $ny < 0;
+               my $h1 = $m[$ny][$nx];
+               $h1 = 'z' if $h1 eq 'E';
+               say "trying $nx $ny $h $h1";
+               next if ord($h1)-ord($h) > 1;
+               push @q, [ $nx, $ny, @path, " $nx,$ny" ];
+       }
+}
diff --git a/2022/24.pl b/2022/24.pl
new file mode 100755 (executable)
index 0000000..b63091a
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my @m = map { chomp; [ split // ] } <>;
+
+my $xmax = $#{ $m[0] };
+my $ymax = $#m;
+
+my ($sx, $sy);
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               if ($m[$y][$x] eq 'E') {
+                       $m[$y][$x] = 'z';
+                       $sx = $x; $sy = $y;
+               }
+               if ($m[$y][$x] eq 'S') {
+                       $m[$y][$x] = 'a';
+               }
+       }
+}
+
+my %seen;
+my @q = [ $sx, $sy ];
+
+my $minp;
+
+while (@q) {
+       my $pt = shift @q;
+       my ($x, $y, @path) = @$pt;
+
+       say "walking ", join(' ', @$pt);
+
+       my $h = $m[$y][$x];
+
+       next if $seen{"$x,$y"}++;
+
+       if ($h eq 'a') {
+               say "FOUND";
+               say scalar @path, ': ', @path;
+               exit 0;
+       }
+
+       for my $pt1 ([-1, 0], [1, 0], [0, -1], [0, 1]) {
+               my ($dx, $dy) = @$pt1;
+               my ($nx, $ny) = ($x+$dx, $y+$dy);
+               next if $nx > $xmax || $nx < 0 || $ny > $ymax || $ny < 0;
+               my $h1 = $m[$ny][$nx];
+               say "trying $nx $ny $h $h1";
+               next if ord($h1)-ord($h) < -1;
+               push @q, [ $nx, $ny, @path, " $nx,$ny" ];
+       }
+}
+
+say "Min: $minp";