]> www.fi.muni.cz Git - aoc.git/blob - 2023/06.pl
Day 25: examining the input
[aoc.git] / 2023 / 06.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional';
5 $; = ';';
6
7 my @map = map { chomp; [ split // ] } <>;
8 my $xmax = $#{ $map[0] };
9 my $ymax = $#map;
10
11 sub get($x, $y) {
12         return $x < 0 || $x > $xmax || $y < 0 || $y > $ymax
13                 ? '.' : $map[$y][$x];
14 }
15
16 my $sum;
17 my %gear;
18
19 for my $y (0 .. $ymax) {
20         my $x = 0;
21         while ($x <= $xmax) {
22                 my $n;
23                 if (($n = get($x, $y)) !~ /\d/) {
24                         $x++; next;
25                 }
26                 my $dx;
27                 while ((my $n1 = get($x + ++$dx, $y)) =~ /\d/) {
28                         $n .= $n1;
29                 }
30                 for my $x1 ($x-1 .. $x+$dx) {
31                         for my $y1 ($y-1 .. $y+1) {
32                                 next if (my $s = get($x1, $y1)) ne '*';
33                                 push @{ $gear{$x1,$y1} }, $n;
34                                 # say "star at $x1,$y1 for $n at $x+$dx,$y";
35                         }
36                 }
37                 $x += $dx;
38         }
39 }
40
41 for my $l (values %gear) {
42         next if @$l != 2;
43         $sum += $l->[0] * $l->[1];
44 }
45
46 say $sum;