--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.30;
+use strict;
+
+my @code;
+my @regs = ((0) x 6);
+my $ip_reg;
+
+while(<>) {
+ 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 'andr') {
+ $regs[$c] = $regs[$a] & $regs[$b];
+ } elsif ($op eq 'andi') {
+ $regs[$c] = $regs[$a] & $b;
+ } elsif ($op eq 'orr') {
+ $regs[$c] = $regs[$a] | $regs[$b];
+ } elsif ($op eq 'ori') {
+ $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;
+ }
+ $ip = $regs[$ip_reg] + 1;
+}
+
+say $regs[0];
+