]> www.fi.muni.cz Git - aoc.git/blob - 2018/37.pl
Day 19: not bad, but too slow to write
[aoc.git] / 2018 / 37.pl
1 #!/usr/bin/perl -w
2
3 use v5.30;
4 use strict;
5
6 my @code;
7 my @regs = ((0) x 6);
8 my $ip_reg;
9
10 while(<>) {
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 'andr') {
34                 $regs[$c] = $regs[$a] & $regs[$b];
35         } elsif ($op eq 'andi') {
36                 $regs[$c] = $regs[$a] & $b;
37         } elsif ($op eq 'orr') {
38                 $regs[$c] = $regs[$a] | $regs[$b];
39         } elsif ($op eq 'ori') {
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         }
50         $ip = $regs[$ip_reg] + 1;
51 }
52
53 say $regs[0];
54