X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=2023%2F45.pl;fp=2023%2F45.pl;h=28185b89dcdc6098d7a0273b93d32d50d8005464;hb=16e2246c542d001a5466401527213299847899b6;hp=0000000000000000000000000000000000000000;hpb=d52f1d0570aa59e6dc7ff4034936ca3c1f85b664;p=aoc.git diff --git a/2023/45.pl b/2023/45.pl new file mode 100755 index 0000000..28185b8 --- /dev/null +++ b/2023/45.pl @@ -0,0 +1,41 @@ +#!/usr/bin/perl -w + +use v5.38; +use experimental 'multidimensional'; +$; = ','; + +my @map = map { chomp; [ split // ] } <>; +my $xmax = $#{ $map[0] }; +my $ymax = $#map; + +my @dx = (1, 0, -1, 0); +my @dy = (0, 1, 0, -1); + +my %seen; +my @q = [ 1, 1, 1, [1, 1] ]; +while (@q) { + my ($x, $y, $steps, @path) = @{ shift @q }; + + next if $seen{$x,$y} && $seen{$x,$y} > $steps; + $seen{$x,$y} = $steps; + if ($x == $xmax-1 && $y == $ymax) { + say "at $x,$y, $steps, ", join(' ', map { "[$_->[0],$_->[1]]" } @path); + say "path len $steps"; + next; + } + my %visited; + $visited{$_->[0],$_->[1]} = 1 for @path; + for my $d (0 .. 3) { + my $nx = $x + $dx[$d]; + my $ny = $y + $dy[$d]; + next if $map[$ny][$nx] eq '#'; + next if $ny == 0; + next if $visited{$nx,$ny}; + next if $d != 0 && $map[$y][$x] eq '>'; + next if $d != 1 && $map[$y][$x] eq 'v'; + next if $d != 2 && $map[$y][$x] eq '<'; + next if $d != 3 && $map[$y][$x] eq '^'; + push @q, [ $nx, $ny, $steps+1, @path, [ $nx, $ny ] ]; + } +} +