X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=2023%2F31.pl;fp=2023%2F31.pl;h=bf4af156557830e7a1a57da3f5cb10cf91581631;hb=c625ef21531660d86c3af99c0003c1db7b104a2a;hp=0000000000000000000000000000000000000000;hpb=f141c1ae1581135db4bc9f68aa677c7c499f4956;p=aoc.git diff --git a/2023/31.pl b/2023/31.pl new file mode 100755 index 0000000..bf4af15 --- /dev/null +++ b/2023/31.pl @@ -0,0 +1,43 @@ +#!/usr/bin/perl -w + +use v5.38; +use experimental 'multidimensional'; +$; = ';'; + +my @map = map { chomp; [ split // ] } <>; +my $xmax = $#{ $map[0] }; +my $ymax = $#map; + +my @dirs = ([1, 0], [0, 1], [-1, 0], [0, -1]); + +my %seen; +my @q = [-1, 0, 0]; + +my @slash = (3, 2, 1, 0); +my @bs = (1, 0, 3, 2); + +while (@q) { + my ($x, $y, $dir) = @{ shift @q }; + my ($dx, $dy) = @{ $dirs[$dir] }; + + $x += $dx; $y += $dy; + next if $x < 0 || $y < 0 || $x > $xmax || $y > $ymax; + + next if $seen{$x,$y} && ($seen{$x,$y} & (1 << $dir)); + $seen{$x,$y} |= (1 << $dir); + + my $pt = $map[$y][$x]; + if ($pt eq '-' && ($dir == 1 || $dir == 3)) { + push @q, [$x, $y, 0], [$x, $y, 2]; + } elsif ($pt eq '|' && ($dir == 0 || $dir == 2)) { + push @q, [$x, $y, 1], [$x, $y, 3]; + } elsif ($pt eq '/') { + push @q, [$x, $y, $slash[$dir]]; + } elsif ($pt eq '\\') { + push @q, [$x, $y, $bs[$dir]]; + } else { + push @q, [$x, $y, $dir]; + } +} + +say scalar keys %seen;