]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 8: more polished but still incorrect solution
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 8 Dec 2023 07:54:41 +0000 (08:54 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 8 Dec 2023 07:55:42 +0000 (08:55 +0100)
2023/15.pl
2023/16.pl

index e00311186f5cd5769716794f8bb88d434382fbf2..83ad39f39b4509b9024b9dd577cce546e5663b71 100755 (executable)
@@ -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;
index 5e7f823048c19a355d98e478850dfbea26230c22..d2b694452cd4495de53f8268f288a766e7775616 100755 (executable)
@@ -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;