]> www.fi.muni.cz Git - aoc2021.git/blob - 47.pl
Day 25: pretty straightforward
[aoc2021.git] / 47.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4
5 my @ins = map { chomp; [ split /\s+/ ] } <STDIN>;
6
7 my %regs = (
8         x => 0,
9         y => 0,
10         z => 0,
11         w => 0,
12 );
13
14 # my @inp = split //, 13579246899999;
15 # my @inp = (-10, 3);
16
17 my %cache;
18
19 sub calculate {
20         my ($ip, %regs) = @_;
21
22         my $key = join(',', $ip, $regs{w}, $regs{x}, $regs{y}, $regs{z});
23         return if $cache{$key}++;
24
25         say "calculate $ip $regs{q}"
26                 if length($regs{q}) < 5;
27         while ($ip < @ins) {
28                 my ($ins, $r1, $r2) = @{ $ins[$ip] };
29                 my $v2 = (defined $r2 && $r2 =~ /[w-z]/) ? $regs{$r2} : $r2;
30                 if ($ins eq 'inp') {
31                         if (!length($regs{q})) {
32                                 $regs{q} = $regs{$r1} = shift @ARGV;
33                                 say "calculate for $regs{q}";
34                         } else {
35                                 for my $val (reverse '1' .. '9') {
36                                         $regs{$r1} = $val;
37                                         calculate($ip+1, %regs, q => $regs{q} . $val);
38                                 }
39                         }
40                 } elsif ($ins eq 'add') {
41                         $regs{$r1} += $v2;
42                 } elsif ($ins eq 'mul') {
43                         $regs{$r1} *= $v2;
44                 } elsif ($ins eq 'div') {
45                         $regs{$r1} /= $v2;
46                         $regs{$r1} = $regs{$r1} > 0 ? int($regs{$r1}) : -int(-$regs{$r1});
47                 } elsif ($ins eq 'mod') {
48                         $regs{$r1} %= $v2;
49                 } elsif ($ins eq 'eql') {
50                         $regs{$r1} = $regs{$r1} == $v2 ? 1 : 0;
51                 }
52
53                 # say join(' ', $ip, @{ $ins[$ip] }), "\n\tw=$regs{w} x=$regs{x} y=$regs{y} z=$regs{z}";
54                 $ip++;
55         }
56         if ($regs{z} == 0) {
57                 say "accepted $regs{q}";
58 sleep 100_000;
59                 exit 0;
60         }
61 }
62
63 calculate (0, %regs);
64