From: Jan "Yenya" Kasprzak Date: Tue, 13 Dec 2022 05:42:40 +0000 (+0100) Subject: Day 12: not very complicated BFS X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=aoc.git;a=commitdiff_plain;h=6001297e1823f21b5320c1e4a596db630705f9d0 Day 12: not very complicated BFS --- diff --git a/2022/23.pl b/2022/23.pl new file mode 100755 index 0000000..960e3ef --- /dev/null +++ b/2022/23.pl @@ -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 index 0000000..b63091a --- /dev/null +++ b/2022/24.pl @@ -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";