]> www.fi.muni.cz Git - aoc.git/blob - 2018/38.pl
Year 2018
[aoc.git] / 2018 / 38.pl
1 #!/usr/bin/perl -w
2
3 use v5.30;
4 use strict;
5
6 my @code;
7 my @regs = (1, (0) x 5);
8 my $ip_reg;
9
10 while(<STDIN>) {
11         if (/\A#ip (\d+)/) {
12                 $ip_reg = $1;
13                 next;
14         }
15         chomp;
16         push @code, [ split /\s+/ ];
17 }
18
19 my $ip = 0;
20 while ($ip < @code) {
21         my ($op, $a, $b, $c) = @{ $code[$ip] };
22
23         $regs[$ip_reg] = $ip;
24
25         if ($op eq 'addr') {
26                 $regs[$c] = $regs[$a] + $regs[$b];
27         } elsif ($op eq 'addi') {
28                 $regs[$c] = $regs[$a] + $b;
29         } elsif ($op eq 'mulr') {
30                 $regs[$c] = $regs[$a] * $regs[$b];
31         } elsif ($op eq 'muli') {
32                 $regs[$c] = $regs[$a] * $b;
33         } elsif ($op eq 'banr') {
34                 $regs[$c] = $regs[$a] & $regs[$b];
35         } elsif ($op eq 'bani') {
36                 $regs[$c] = $regs[$a] & $b;
37         } elsif ($op eq 'borr') {
38                 $regs[$c] = $regs[$a] | $regs[$b];
39         } elsif ($op eq 'bori') {
40                 $regs[$c] = $regs[$a] | $b;
41         } elsif ($op eq 'setr') {
42                 $regs[$c] = $regs[$a];
43         } elsif ($op eq 'seti') {
44                 $regs[$c] = $a;
45         } elsif ($op eq 'gtrr') {
46                 $regs[$c] = $regs[$a] > $regs[$b] ? 1 : 0;
47         } elsif ($op eq 'eqrr') {
48                 $regs[$c] = $regs[$a] == $regs[$b] ? 1 : 0;
49         } elsif ($op eq 'nop') {
50                 
51         } else {
52                 die "Unknown op $ op at $ip";
53         }
54         say join(' ', $ip, "\t", @{ $code[$ip] }, "\t", @regs);
55         # $regs[3] = $ARGV[0] if $ip == 35;
56         $ip = $regs[$ip_reg] + 1;
57 }
58
59 say $regs[0];
60