]> www.fi.muni.cz Git - aoc.git/blobdiff - 2018/38.pl
Year 2018
[aoc.git] / 2018 / 38.pl
diff --git a/2018/38.pl b/2018/38.pl
new file mode 100755 (executable)
index 0000000..1e18937
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/perl -w
+
+use v5.30;
+use strict;
+
+my @code;
+my @regs = (1, (0) x 5);
+my $ip_reg;
+
+while(<STDIN>) {
+       if (/\A#ip (\d+)/) {
+               $ip_reg = $1;
+               next;
+       }
+       chomp;
+       push @code, [ split /\s+/ ];
+}
+
+my $ip = 0;
+while ($ip < @code) {
+       my ($op, $a, $b, $c) = @{ $code[$ip] };
+
+       $regs[$ip_reg] = $ip;
+
+       if ($op eq 'addr') {
+               $regs[$c] = $regs[$a] + $regs[$b];
+       } elsif ($op eq 'addi') {
+               $regs[$c] = $regs[$a] + $b;
+       } elsif ($op eq 'mulr') {
+               $regs[$c] = $regs[$a] * $regs[$b];
+       } elsif ($op eq 'muli') {
+               $regs[$c] = $regs[$a] * $b;
+       } elsif ($op eq 'banr') {
+               $regs[$c] = $regs[$a] & $regs[$b];
+       } elsif ($op eq 'bani') {
+               $regs[$c] = $regs[$a] & $b;
+       } elsif ($op eq 'borr') {
+               $regs[$c] = $regs[$a] | $regs[$b];
+       } elsif ($op eq 'bori') {
+               $regs[$c] = $regs[$a] | $b;
+       } elsif ($op eq 'setr') {
+               $regs[$c] = $regs[$a];
+       } elsif ($op eq 'seti') {
+               $regs[$c] = $a;
+       } elsif ($op eq 'gtrr') {
+               $regs[$c] = $regs[$a] > $regs[$b] ? 1 : 0;
+       } elsif ($op eq 'eqrr') {
+               $regs[$c] = $regs[$a] == $regs[$b] ? 1 : 0;
+       } elsif ($op eq 'nop') {
+               
+       } else {
+               die "Unknown op $ op at $ip";
+       }
+       say join(' ', $ip, "\t", @{ $code[$ip] }, "\t", @regs);
+       # $regs[3] = $ARGV[0] if $ip == 35;
+       $ip = $regs[$ip_reg] + 1;
+}
+
+say $regs[0];
+