Genericify :)

This commit is contained in:
Sebastian Bugge 2024-12-04 08:56:04 +01:00
parent 0413fcdde5
commit 7a5127db8f
Signed by: kaholaz
GPG key ID: 2EFFEDEE03519691

View file

@ -28,7 +28,7 @@ my $xmas_count = 0;
my $mas_cross_count = 0; my $mas_cross_count = 0;
for my $y (0 .. $#wordgrid) { for my $y (0 .. $#wordgrid) {
for my $x (0 .. $#{$wordgrid[$y]}) { for my $x (0 .. $#{$wordgrid[$y]}) {
$xmas_count += grep { search_xmas([$x, $y], $_)} @directions; $xmas_count += grep { search_letters([$x, $y], $_, [split //, "XMAS"])} @directions;
$mas_cross_count++ if search_mas_cross([ $x, $y ]); $mas_cross_count++ if search_mas_cross([ $x, $y ]);
} }
} }
@ -36,46 +36,31 @@ for my $y (0 .. $#wordgrid) {
print "Part 1: ", $xmas_count, "\n"; print "Part 1: ", $xmas_count, "\n";
print "Part 2: ", $mas_cross_count, "\n"; print "Part 2: ", $mas_cross_count, "\n";
sub search_xmas { sub search_letters {
my ($start, $offsets) = @_; my ($start, $offsets, $letters) = @_;
my @letters = ("X", "M", "A", "S"); for my $i (0 .. $#{$letters}) {
for my $i (0 .. $#letters) {
my $cord = [$start->[0] + $offsets->[$i]->[0], $start->[1] + $offsets->[$i]->[1]]; my $cord = [$start->[0] + $offsets->[$i]->[0], $start->[1] + $offsets->[$i]->[1]];
return 0 if ( return 0 if (
$cord->[1] < 0 || $cord->[1] > $#wordgrid || $cord->[1] < 0 || $cord->[1] > $#wordgrid ||
$cord->[0] < 0 || $cord->[0] > $#{$wordgrid[$cord->[1]]} $cord->[0] < 0 || $cord->[0] > $#{$wordgrid[$cord->[1]]}
); );
return 0 if $wordgrid[$cord->[1]][$cord->[0]] ne $letters[$i]; return 0 if $wordgrid[$cord->[1]][$cord->[0]] ne $letters->[$i];
} }
return 1; return 1;
} }
sub search_mas_cross { sub search_mas_cross {
my $start = shift; my $start = shift;
my @mas = split //, "MAS";
return 0 if $wordgrid[$start->[1]][$start->[0]] ne "A"; return 0 if $wordgrid[$start->[1]][$start->[0]] ne "A";
return 0 if ( return 0 if (
!search_mas($start, \@diagonal) && !search_letters($start, \@diagonal, \@mas) &&
!search_mas($start, [reverse @diagonal]) !search_letters($start, [reverse @diagonal], \@mas)
); );
return 0 if ( return 0 if (
!search_mas($start, \@otherdiagonal) && !search_letters($start, \@otherdiagonal, \@mas) &&
!search_mas($start, [reverse @otherdiagonal]) !search_letters($start, [reverse @otherdiagonal], \@mas)
); );
return 1; return 1;
} }
sub search_mas {
my ($start, $offsets) = @_;
my @letters = ("M", "A", "S");
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;
}