4 use experimental 'multidimensional', 'for_list', 'builtin';
11 my @map = map { chomp; [ split // ] } <>;
12 my $xmax = @{ $map[0] };
20 my ($prev, $x, $y, @d) = @_;
21 for my ($dx, $dy) (@d) {
22 my ($nx, $ny) = ($x+$dx, $y+$dy);
23 next if $nx < 0 || $nx >= $xmax || $ny < 0 || $ny >= $ymax;
24 if ($map[$ny][$nx] eq '*') {
30 for my $y (0 .. $ymax-1) {
31 for my $x (0 .. $xmax-1) {
33 next if $n !~ /\d/ || $seen{$x,$y}++;
35 while ($x+$dx < $xmax && $map[$y][$x+$dx] =~ /\d/) {
36 $n*=10; $n+= $map[$y][$x+$dx];
39 say "$n at $x..", $x+$dx, ", $y";
42 for my $x1 (-1 .. $dx) {
43 test_sym(\$sym, $x, $y, $x1, -1, $x1, 0, $x1, +1);
46 my ($sx, $sy) = @$sym;
47 push @{ $gear{$sx,$sy} }, $n;
48 say "Star at $sx, $sy";
53 for my $k (keys %gear) {
54 my @coords = @{ $gear{$k} };
56 $sum += $coords[0] * $coords[1];