--- /dev/null
+#!/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;
--- /dev/null
+#!/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)"