]> www.fi.muni.cz Git - aoc.git/blob - 2023/06.pl
12992b0b9e2f30f348929c5a2b7934bf88e53809
[aoc.git] / 2023 / 06.pl
1 #!/usr/bin/perl -w
2
3 use v5.38;
4 use experimental 'multidimensional', 'for_list', 'builtin';
5 use builtin 'indexed';
6 use List::Util;
7 use Y::AoC::Task;
8 $; = ';';
9 # t;
10
11 my @map = map { chomp; [ split // ] } <>;
12 my $xmax = @{ $map[0] };
13 my $ymax = @map;
14
15 my $sum;
16 my %seen;
17 my %gear;
18
19 sub test_sym {
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 '*') {
25                         $$prev = [$nx, $ny];
26                 }
27         }
28 }
29
30 for my $y (0 .. $ymax-1) {
31 for my $x (0 .. $xmax-1) {
32         my $n = $map[$y][$x];
33         next if $n !~ /\d/ || $seen{$x,$y}++;
34         my $dx = 1;
35         while ($x+$dx < $xmax && $map[$y][$x+$dx] =~ /\d/) {
36                 $n*=10; $n+= $map[$y][$x+$dx];
37                 $seen{$x+$dx,$y} = 1;
38                 $dx++;
39                 say "$n at $x..", $x+$dx, ", $y";
40         }
41         my $sym;
42         for my $x1 (-1 .. $dx) {
43                 test_sym(\$sym, $x, $y, $x1, -1, $x1, 0, $x1, +1);
44         }
45         if (defined $sym) {
46                 my ($sx, $sy) = @$sym;
47                 push @{ $gear{$sx,$sy} }, $n;
48                 say "Star at $sx, $sy";
49         }
50 } }
51
52
53 for my $k (keys %gear) {
54         my @coords = @{ $gear{$k} };
55         next if @coords != 2;
56         $sum += $coords[0] * $coords[1];
57 }
58
59 say $sum;