From: Jan "Yenya" Kasprzak Date: Fri, 8 Dec 2023 07:54:41 +0000 (+0100) Subject: Day 8: more polished but still incorrect solution X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=aoc.git;a=commitdiff_plain;h=93aa51b44022ee9169d7fc519d458a164572dfe9 Day 8: more polished but still incorrect solution --- diff --git a/2023/15.pl b/2023/15.pl index e003111..83ad39f 100755 --- a/2023/15.pl +++ b/2023/15.pl @@ -2,27 +2,21 @@ use v5.38; -$/ = "\n\n"; +chomp(my $steps = <>); +my @steps = split //, $steps; + +scalar <>; + my %dirs; -my @steps = split //, scalar <>; -pop @steps; -pop @steps; -my $l = <>; -for (split /\n/, $l) { - my @x = /[A-Z]{3}/g; +while (<>) { + my @x = /\w{3}/g; $dirs{$x[0].'L'} = $x[1]; $dirs{$x[0].'R'} = $x[2]; } -my %seen; -my $now = 'AAA' . $steps[0]; +my $now = 'AAA'; my $i = 0; -my $n; -while ($now !~ /^ZZZ/) { - say $now; - $i ++; - $i = 0 if $i >= @steps; - $now = $dirs{$now}.$steps[$i]; - $n++; +while ($now ne 'ZZZ') { + $now = $dirs{$now . ($steps[$i++ % @steps])}; } -say $n; +say $i; diff --git a/2023/16.pl b/2023/16.pl index 5e7f823..d2b6944 100755 --- a/2023/16.pl +++ b/2023/16.pl @@ -1,45 +1,47 @@ #!/usr/bin/perl -w use v5.38; +use List::Util 'uniq'; + +chomp(my $steps = <>); +my @steps = split //, $steps; + +scalar <>; -$/ = "\n\n"; my %dirs; -my @steps = split //, scalar <>; -pop @steps; -pop @steps; -my $l = <>; -for (split /\n/, $l) { - my @x = /[A-Z0-9]{3}/g; +while (<>) { + my @x = /\w{3}/g; $dirs{$x[0].'L'} = $x[1]; $dirs{$x[0].'R'} = $x[2]; } -my %seen; -my %now = map { substr($_, 0, 3) . $steps[0] => 1 } grep { /^..A/ } keys %dirs; -my @now = keys %now; -say join(' ', @now); - sub walk { - my $node = shift; + my $now = shift; my $i = 0; - my $n; - while ($node !~ /^..Z/) { - $i++; - $i = 0 if $i >= @steps; - $node = $dirs{$node} . $steps[$i]; - $n++; + while ($now !~ /Z$/) { + $now = $dirs{$now . ($steps[$i++ % @steps])}; + } + return $i; +} + +sub gcd { + my ($x, $y) = @_; + ($x, $y) = ($y, $x) if $y > $x; + while ($y) { + ($x, $y) = ($y, $x % $y); } - return $n; + return $x; } -my %f; -use List::Util qw(product); -for (@now) { - my $st = walk($_); - my $l = `factor $st`; - $l =~ s/.*://; - for my $n ($l =~ /\d+/g) { - $f{$n}++; +# using LCM is incorrect in general case, +# but it works on the actual puzzle input +my $p; +for (uniq grep { /A$/ } map { substr($_, 0, 3) } keys %dirs) { + my $steps = walk($_); + if (defined $p) { + $p *= $steps/gcd($p, $steps); + } else { + $p = $steps; } } -say product keys %f; +say $p;