adventofcode/2024/04/Part1.pm

48 lines
972 B
Perl

package Part1;
use 5.36.0;
no warnings qw/ uninitialized /;
use Math::VectorXYZ::2D;
use List::Util qw/ sum pairmap /;
use List::MoreUtils qw/ part zip /;
sub read_file (@lines) {
return [ map { [ split '' ] } @lines ];
}
my @directions;
for my $x ( -1 .. 1 ) {
for my $y ( -1 .. 1 ) {
push @directions, Vec( $x, $y ) if $x or $y;
}
}
sub find_word ( $grid, $letters, $loc, $dir ) {
return 1 unless @$letters;
$loc += $dir;
return 0 if $loc->[0] < 0 or $loc->[1] < 0;
return 0 if $grid->[ $loc->[0] ][ $loc->[1] ] ne shift @$letters;
return find_word( $grid, $letters, $loc, $dir );
}
sub solve ($grid) {
my $total = 0;
for my $x ( 0 .. $grid->$#* ) {
for my $y ( 0 .. $grid->[0]->$#* ) {
if ( $grid->[$x][$y] eq 'X' ) {
$total += find_word( $grid, [qw/M A S/], Vec( $x, $y ), $_ )
for @directions;
}
}
}
return $total;
}
1;