]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 10: simplex method
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 10 Dec 2025 18:09:53 +0000 (19:09 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 10 Dec 2025 18:09:53 +0000 (19:09 +0100)
2025/19.pl [new file with mode: 0755]
2025/20.pl [new file with mode: 0755]

diff --git a/2025/19.pl b/2025/19.pl
new file mode 100755 (executable)
index 0000000..8c28c03
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+
+use v5.42;
+
+my $sum;
+
+while (<>) {
+       /(?<=\[).*?(?=\])/;
+       my $state = $&;
+       my @btns = map { [ /\d+/g ] } /\(.*?\)/g;
+
+       my @q = [ $state, 0, -1 ];
+       while (my $f = shift @q) {
+               my ($state, $n, $b, @rest) = @$f;
+               if ($state !~ /#/) {
+                       $sum += $n;
+                       last;
+               }
+               $n++;
+               for my $btn ($b+1 .. $#btns) {
+                       my $b = $btns[$btn];
+                       my $nstate = $state;
+                       for my $i (@$b) {
+                               substr($nstate, $i, 1) =~ y/#./.#/;
+                       }
+                       push @q, [ $nstate, $n, $btn, @rest, $btn ];
+               }
+       }
+       
+}
+       
+say $sum;
diff --git a/2025/20.pl b/2025/20.pl
new file mode 100755 (executable)
index 0000000..11fb8be
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+# Run as
+# ./20.pl input.txt  > x.py && python3 x.py  | perl -lnE '$sum += $_ }{ say $sum'
+
+use v5.42;
+use List::Util qw(max);
+
+say "import z3";
+say "sum = 0";
+
+while (<>) {
+       /(?<=\{).*?(?=\})/;
+       my @state = split /,/, $&;
+       my @btns = map { [ /\d+/g ] } /\(.*?\)/g;
+
+       my $m;
+       my $max = max @state;
+       push @$m, [ (0) x @btns, $_ ] for @state;
+       for my ($i, $btn) (indexed @btns) {
+               $m->[$_][$i] = 1 for @$btn;
+       }
+       say "s = z3.Optimize()";
+       say join(', ', map { "x$_" } 0 .. $#btns), " = z3.Ints('",
+               join(' ', map { "x$_" } 0 .. $#btns), "')";
+       say "s.add(x$_ >= 0)" for 0 .. $#btns;
+       for my $row (@$m) {
+               say "s.add(", join(' + ', map { "x$_" } grep { $row->[$_] } 0 .. $#$row - 1), ' == ', $row->[-1], ")"
+       }
+       say "s.minimize(", join(' + ', map { "x$_" } 0 .. $#btns), ")";
+       say "s.check()";
+       say "m = s.model()";
+       say "val = m.eval(", join(' + ', map { "x$_" } 0 .. $#btns), ")";
+       say "print(val)";
+       say "sum = sum + val";
+       say "";
+}
+say "print(sum)"