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