]> www.fi.muni.cz Git - aoc2020.git/blobdiff - 46.pl
Day 23
[aoc2020.git] / 46.pl
diff --git a/46.pl b/46.pl
new file mode 100755 (executable)
index 0000000..b9744b8
--- /dev/null
+++ b/46.pl
@@ -0,0 +1,75 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my $rounds;
+($rounds, $_) = @ARGV;
+
+my @cups_nums = split //;
+my @cups_pos;
+my $i;
+for (@cups_nums) {
+       $cups_pos[$_] = $i++;
+}
+
+my $max = 1_000_000;
+
+my ($prev, @cups, $one);
+for (@cups_nums, 10 .. $max) {
+       my $cup = {
+               num => $_,
+               prev_num => $prev,
+               next => undef,
+       };
+       push @cups, $cup;
+       $one = $cup if $cup->{num} == 1;
+       $prev = $cup;
+}
+
+$prev = $cups[-1];
+for my $cup (@cups) {
+       $cup->{prev_num} = $cups[$cups_pos[$cup->{num}-1]]
+               if $cup->{num} > 1 && $cup->{num} <= 10;
+       $cup->{prev_num} = $cups[-1]
+               if $cup->{num} == 1;
+       $prev->{next} = $cup;
+       $prev = $cup;
+}
+
+# for my $cup (@cups) {
+#      print $cup->{num}, ": >", $cup->{next}->{num}, " <", $cup->{prev_num}->{num}, "\n";
+# }
+
+my $cur = $cups[0];
+
+while ($rounds--) {
+       my @pickup;
+       my $cup = $cur->{next};
+       my $dest = $cur->{prev_num};
+       my %num_seen;
+       # print "pickup: ";
+       for (1..3) {
+               push @pickup, $cup;
+               $num_seen{ $cup->{num} } = 1;
+               # print $cup->{num}, ' ';
+               $cup = $cup->{next};
+       }
+       $dest = $dest->{prev_num} while $num_seen{$dest->{num}};
+       # print " dest: ", $dest->{num}, "\n";
+       $cur->{next} = $cup;
+       my $end = $dest->{next};
+       $dest->{next} = $pickup[0];
+       $pickup[-1]->{next} = $end;
+
+       $cur = $cur->{next};
+       # $end = $cur;
+       # do {
+       #       print $end->{num}, ',';
+       #       $end = $end->{next};
+       # } while ($end->{num} != $cur->{num});
+       # print "\n";
+       print "round $rounds\n" if $rounds % 100_000 == 0;
+}
+
+print "one -> ", $one->{next}->{num}, '*', $one->{next}->{next}->{num},
+       "=", $one->{next}->{num} * $one->{next}->{next}->{num}, "\n";