From: Jan "Yenya" Kasprzak Date: Sun, 3 Dec 2023 06:23:23 +0000 (+0100) Subject: Day 3 part 2: a bit tidier solution, but still... X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=aoc.git;a=commitdiff_plain;h=9a647a00c019cbc9a3bba2b3f4896febcfa60ca5 Day 3 part 2: a bit tidier solution, but still... --- diff --git a/2023/06.pl b/2023/06.pl index 12992b0..7297cfb 100755 --- a/2023/06.pl +++ b/2023/06.pl @@ -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;