48 lines
972 B
Perl
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;
|