]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 3 part 2: a bit tidier solution, but still...
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 3 Dec 2023 06:23:23 +0000 (07:23 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 3 Dec 2023 06:47:35 +0000 (07:47 +0100)
2023/06.pl

index 12992b0b9e2f30f348929c5a2b7934bf88e53809..7297cfb864c88d43a10019e3919acb7d90e5b132 100755 (executable)
@@ -1,59 +1,46 @@
 #!/usr/bin/perl -w
 
 use v5.38;
-use experimental 'multidimensional', 'for_list', 'builtin';
-use builtin 'indexed';
-use List::Util;
-use Y::AoC::Task;
+use experimental 'multidimensional';
 $; = ';';
-# t;
 
 my @map = map { chomp; [ split // ] } <>;
-my $xmax = @{ $map[0] };
-my $ymax = @map;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+sub get($x, $y) {
+       return $x < 0 || $x > $xmax || $y < 0 || $y > $ymax
+               ? '.' : $map[$y][$x];
+}
 
 my $sum;
-my %seen;
 my %gear;
 
-sub test_sym {
-       my ($prev, $x, $y, @d) = @_;
-       for my ($dx, $dy) (@d) {
-               my ($nx, $ny) = ($x+$dx, $y+$dy);
-               next if $nx < 0 || $nx >= $xmax || $ny < 0 || $ny >= $ymax;
-               if ($map[$ny][$nx] eq '*') {
-                       $$prev = [$nx, $ny];
+for my $y (0 .. $ymax) {
+       my $x = 0;
+       while ($x <= $xmax) {
+               my $n;
+               if (($n = get($x, $y)) !~ /\d/) {
+                       $x++; next;
+               }
+               my $dx;
+               while ((my $n1 = get($x + ++$dx, $y)) =~ /\d/) {
+                       $n .= $n1;
                }
+               for my $x1 ($x-1 .. $x+$dx) {
+                       for my $y1 ($y-1 .. $y+1) {
+                               next if (my $s = get($x1, $y1)) ne '*';
+                               push @{ $gear{$x1,$y1} }, $n;
+                               # say "star at $x1,$y1 for $n at $x+$dx,$y";
+                       }
+               }
+               $x += $dx;
        }
 }
 
-for my $y (0 .. $ymax-1) {
-for my $x (0 .. $xmax-1) {
-       my $n = $map[$y][$x];
-       next if $n !~ /\d/ || $seen{$x,$y}++;
-       my $dx = 1;
-       while ($x+$dx < $xmax && $map[$y][$x+$dx] =~ /\d/) {
-               $n*=10; $n+= $map[$y][$x+$dx];
-               $seen{$x+$dx,$y} = 1;
-               $dx++;
-               say "$n at $x..", $x+$dx, ", $y";
-       }
-       my $sym;
-       for my $x1 (-1 .. $dx) {
-               test_sym(\$sym, $x, $y, $x1, -1, $x1, 0, $x1, +1);
-       }
-       if (defined $sym) {
-               my ($sx, $sy) = @$sym;
-               push @{ $gear{$sx,$sy} }, $n;
-               say "Star at $sx, $sy";
-       }
-} }
-
-
-for my $k (keys %gear) {
-       my @coords = @{ $gear{$k} };
-       next if @coords != 2;
-       $sum += $coords[0] * $coords[1];
+for my $l (values %gear) {
+       next if @$l != 2;
+       $sum += $l->[0] * $l->[1];
 }
 
 say $sum;