aoc24/day04.pl
2024-12-04 08:56:04 +01:00

66 lines
1.6 KiB
Perl

#!/usr/bin/env perl
use strict;
use warnings;
my @wordgrid = ();
while (<>) {
next if /^\s*$/;
chomp;
push @wordgrid, [ split //, $_ ];
}
my @directions = (
[[0, 0], [1, 1], [2, 2], [3, 3]],
[[0, 0], [-1, 1], [-2, 2], [-3, 3]],
[[0, 0], [0, 1], [0, 2], [0, 3]],
[[0, 0], [1, 0], [2, 0], [3, 0]],
[[0, 0], [-1, -1], [-2, -2], [-3, -3]],
[[0, 0], [1, -1], [2, -2], [3, -3]],
[[0, 0], [-1, 0], [-2, 0], [-3, 0]],
[[0, 0], [0, -1], [0, -2], [0, -3]],
);
my @diagonal = ([-1, -1], [0, 0], [1, 1]);
my @otherdiagonal = ([1, -1], [0, 0], [-1, 1]);
my $xmas_count = 0;
my $mas_cross_count = 0;
for my $y (0 .. $#wordgrid) {
for my $x (0 .. $#{$wordgrid[$y]}) {
$xmas_count += grep { search_letters([$x, $y], $_, [split //, "XMAS"])} @directions;
$mas_cross_count++ if search_mas_cross([ $x, $y ]);
}
}
print "Part 1: ", $xmas_count, "\n";
print "Part 2: ", $mas_cross_count, "\n";
sub search_letters {
my ($start, $offsets, $letters) = @_;
for my $i (0 .. $#{$letters}) {
my $cord = [$start->[0] + $offsets->[$i]->[0], $start->[1] + $offsets->[$i]->[1]];
return 0 if (
$cord->[1] < 0 || $cord->[1] > $#wordgrid ||
$cord->[0] < 0 || $cord->[0] > $#{$wordgrid[$cord->[1]]}
);
return 0 if $wordgrid[$cord->[1]][$cord->[0]] ne $letters->[$i];
}
return 1;
}
sub search_mas_cross {
my $start = shift;
my @mas = split //, "MAS";
return 0 if $wordgrid[$start->[1]][$start->[0]] ne "A";
return 0 if (
!search_letters($start, \@diagonal, \@mas) &&
!search_letters($start, [reverse @diagonal], \@mas)
);
return 0 if (
!search_letters($start, \@otherdiagonal, \@mas) &&
!search_letters($start, [reverse @otherdiagonal], \@mas)
);
return 1;
}