16 push @code, [ split /\s+/ ];
19 my $nmachines = shift @ARGV;
21 # push @machines, [ ($_, ((0) x 6)) ] for 0 .. $nmachines;
22 push @machines, [ (10961197, ((0) x 6)) ];
28 my ($op, $a, $b, $c) = @{ $code[$ip] };
30 $regs->[$ip_reg] = $ip;
33 $regs->[$c] = $regs->[$a] + $regs->[$b];
34 } elsif ($op eq 'addi') {
35 $regs->[$c] = $regs->[$a] + $b;
36 } elsif ($op eq 'mulr') {
37 $regs->[$c] = $regs->[$a] * $regs->[$b];
38 } elsif ($op eq 'muli') {
39 $regs->[$c] = $regs->[$a] * $b;
40 } elsif ($op eq 'banr') {
41 $regs->[$c] = $regs->[$a] & $regs->[$b];
42 } elsif ($op eq 'bani') {
43 $regs->[$c] = $regs->[$a] & $b;
44 } elsif ($op eq 'borr') {
45 $regs->[$c] = $regs->[$a] | $regs->[$b];
46 } elsif ($op eq 'bori') {
47 $regs->[$c] = $regs->[$a] | $b;
48 } elsif ($op eq 'setr') {
49 $regs->[$c] = $regs->[$a];
50 } elsif ($op eq 'seti') {
52 } elsif ($op eq 'gtrr') {
53 $regs->[$c] = $regs->[$a] > $regs->[$b] ? 1 : 0;
54 } elsif ($op eq 'gtir') {
55 $regs->[$c] = $a > $regs->[$b] ? 1 : 0;
56 } elsif ($op eq 'eqrr') {
57 $regs->[$c] = $regs->[$a] == $regs->[$b] ? 1 : 0;
58 } elsif ($op eq 'eqri') {
59 $regs->[$c] = $regs->[$a] == $b ? 1 : 0;
60 } elsif ($op eq 'nop') {
63 die "Unknown op $ op at $ip";
65 say join(' ', @{ $code[$ip] }, "\t", @$regs);
66 # $regs->[3] = $ARGV[0] if $ip == 35;
67 $regs->[6] = $regs->[$ip_reg] + 1;
69 # if ($seen{join(',', @$regs)}++) {
74 if ($regs->[6] >= @code) {
85 for my $m (0 .. $#machines) {
86 next if $machines[$m]->[6] == -1;
88 if (one_step($machines[$m])) {
89 say "Machine $m halts after ste $step";