diff --git a/day04.pl b/day04.pl index e395723..7e25a9c 100644 --- a/day04.pl +++ b/day04.pl @@ -28,7 +28,7 @@ my $xmas_count = 0; my $mas_cross_count = 0; for my $y (0 .. $#wordgrid) { 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 ]); } } @@ -36,46 +36,31 @@ for my $y (0 .. $#wordgrid) { print "Part 1: ", $xmas_count, "\n"; print "Part 2: ", $mas_cross_count, "\n"; -sub search_xmas { - my ($start, $offsets) = @_; +sub search_letters { + 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]]; 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 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_mas($start, \@diagonal) && - !search_mas($start, [reverse @diagonal]) + !search_letters($start, \@diagonal, \@mas) && + !search_letters($start, [reverse @diagonal], \@mas) ); return 0 if ( - !search_mas($start, \@otherdiagonal) && - !search_mas($start, [reverse @otherdiagonal]) + !search_letters($start, \@otherdiagonal, \@mas) && + !search_letters($start, [reverse @otherdiagonal], \@mas) ); 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; -}