]> www.fi.muni.cz Git - aoc.git/blob - 2023/05.pl
Day 3: quite ugly code
[aoc.git] / 2023 / 05.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
17 my %seen;
18
19 for my $y (0 .. $ymax-1) {
20 for my $x (0 .. $xmax-1) {
21         my $n = $map[$y][$x];
22         next if $n !~ /\d/ || $seen{$x,$y}++;
23         my $dx = 1;
24         my $is_neigh = 0;
25         if ($x > 0) {
26                 if ($y > 0 && $map[$y-1][$x-1] !~ /\./) { $is_neigh = 1; }
27                 if ($map[$y][$x-1] !~ /\./) { $is_neigh = 1; }
28                 if ($y < $ymax-1 && $map[$y+1][$x-1] !~ /\./) { $is_neigh = 1; }
29         }
30         say "First $is_neigh";
31         if ($y > 0 && $map[$y-1][$x] !~ /\./) { $is_neigh = 1; }
32         if ($y < $ymax-1 && $map[$y+1][$x] !~ /\./) { $is_neigh = 1; }
33         while ($x+$dx < $xmax && $map[$y][$x+$dx] =~ /\d/) {
34                 $n*=10; $n+= $map[$y][$x+$dx];
35                 say "First $is_neigh at ", $x+$dx;
36                 if ($y > 0 && $map[$y-1][$x+$dx] !~ /\./) { say $y-1, " ", $x+$dx; $is_neigh = 1; }
37                 if ($y < $ymax-1 && $map[$y+1][$x+$dx] !~ /\./) { $is_neigh = 1; }
38                 $seen{$x+$dx,$y} = 1;
39                 $dx++;
40         }
41         say "Before last $is_neigh at ", $x+$dx;
42         if ($x + $dx < $xmax) {
43                 if ($y > 0 && $map[$y-1][$x+$dx] !~ /\./) { say $y-1, " ", $x+$dx; $is_neigh = 1; }
44                 if ($y < $ymax-1 && $map[$y+1][$x+$dx] !~ /\./) { $is_neigh = 1; }
45                 if ($x+$dx < $xmax-1 && $map[$y][$x+$dx] !~ /\./) { $is_neigh = 1; }
46         }
47         $sum += $n if $is_neigh;
48         if ($is_neigh) { say "$n at $x,$y" }
49 } }
50
51 say $sum;