Genericify :)
This commit is contained in:
parent
0413fcdde5
commit
7a5127db8f
1 changed files with 10 additions and 25 deletions
35
day04.pl
35
day04.pl
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue