]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 11: nice!
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 11 Dec 2022 05:20:08 +0000 (06:20 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 11 Dec 2022 05:20:08 +0000 (06:20 +0100)
2022/21.pl [new file with mode: 0755]
2022/22.pl [new file with mode: 0755]

diff --git a/2022/21.pl b/2022/21.pl
new file mode 100755 (executable)
index 0000000..6f9921b
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+local $/ = "\n\n";
+
+my (@queues, @ops, @divs, @ift, @iff, @steps);
+
+while (<>) {
+       my @lines = split /\n/;
+       push @queues, [ $lines[1] =~ /\d+/g ];
+       my ($op) = $lines[2] =~ /= (.*)/;
+       $op =~ s/old/\$old/g;
+       push @ops, $op;
+       push @divs, $lines[3] =~ /(\d+)/;
+       push @ift, $lines[4] =~ /(\d+)/;
+       push @iff, $lines[5] =~ /(\d+)/;
+}
+
+for (1 .. 20) {
+       for my $mk (0 .. $#queues) {
+               my $q = $queues[$mk];
+               while (my $old = shift @$q) {
+                       $steps[$mk]++;
+                       $old = eval $ops[$mk];
+                       $old = int($old / 3);
+                       if ($old % $divs[$mk]) {
+                               push @{ $queues[$iff[$mk]] }, $old;
+                       } else {
+                               push @{ $queues[$ift[$mk]] }, $old;
+                       }
+               }
+       }
+}
+
+@steps = sort { $b <=> $a } @steps;
+
+say $steps[0] * $steps[1];
+
diff --git a/2022/22.pl b/2022/22.pl
new file mode 100755 (executable)
index 0000000..4236c6e
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+use List::Util qw(reduce);
+
+local $/ = "\n\n";
+
+my (@queues, @ops, @divs, @ift, @iff, @steps);
+
+while (<>) {
+       my @lines = split /\n/;
+       push @queues, [ $lines[1] =~ /\d+/g ];
+       my ($op) = $lines[2] =~ /= (.*)/;
+       $op =~ s/old/\$old/g;
+       push @ops, $op;
+       push @divs, $lines[3] =~ /(\d+)/;
+       push @ift, $lines[4] =~ /(\d+)/;
+       push @iff, $lines[5] =~ /(\d+)/;
+}
+
+my $mod = reduce { $a*$b } @divs;
+
+for (1 .. 10_000) {
+       for my $mk (0 .. $#queues) {
+               my $q = $queues[$mk];
+               while (my $old = shift @$q) {
+                       $steps[$mk]++;
+                       $old = eval $ops[$mk];
+                       $old %= $mod;
+                       if ($old % $divs[$mk]) {
+                               push @{ $queues[$iff[$mk]] }, $old;
+                       } else {
+                               push @{ $queues[$ift[$mk]] }, $old;
+                       }
+               }
+       }
+}
+
+@steps = sort { $b <=> $a } @steps;
+
+say $steps[0] * $steps[1];
+