16 push @code, [ split /\s+/ ];
19 my $nmachines = shift @ARGV;
21 # push @machines, [ ($_, ((0) x 6)) ] for 0 .. $nmachines;
22 push @machines, [ (10961198, ((0) x 6)) ];
29 my ($op, $a, $b, $c) = @{ $code[$ip] };
31 $regs->[$ip_reg] = $ip;
34 $regs->[$c] = $regs->[$a] + $regs->[$b];
35 } elsif ($op eq 'addi') {
36 $regs->[$c] = $regs->[$a] + $b;
37 } elsif ($op eq 'mulr') {
38 $regs->[$c] = $regs->[$a] * $regs->[$b];
39 } elsif ($op eq 'muli') {
40 $regs->[$c] = $regs->[$a] * $b;
41 } elsif ($op eq 'banr') {
42 $regs->[$c] = $regs->[$a] & $regs->[$b];
43 } elsif ($op eq 'bani') {
44 $regs->[$c] = $regs->[$a] & $b;
45 } elsif ($op eq 'borr') {
46 $regs->[$c] = $regs->[$a] | $regs->[$b];
47 } elsif ($op eq 'bori') {
48 $regs->[$c] = $regs->[$a] | $b;
49 } elsif ($op eq 'setr') {
50 $regs->[$c] = $regs->[$a];
51 } elsif ($op eq 'seti') {
53 } elsif ($op eq 'gtrr') {
54 $regs->[$c] = $regs->[$a] > $regs->[$b] ? 1 : 0;
55 } elsif ($op eq 'gtir') {
56 $regs->[$c] = $a > $regs->[$b] ? 1 : 0;
57 } elsif ($op eq 'eqrr') {
58 $regs->[$c] = $regs->[$a] == $regs->[$b] ? 1 : 0;
59 } elsif ($op eq 'eqri') {
60 $regs->[$c] = $regs->[$a] == $b ? 1 : 0;
61 } elsif ($op eq 'nop') {
64 die "Unknown op $ op at $ip";
66 # say join(' ', @{ $code[$ip] }, "\t", @$regs);
67 # $regs->[3] = $ARGV[0] if $ip == 35;
68 $regs->[6] = $regs->[$ip_reg] + 1;
70 if ($regs->[6] == 28) {
71 if ($seen{$regs->[4]}++) {
72 say "$regs->[4] already seen";
75 say "halts at $regs->[4]\t", sprintf("%08x", $regs->[4]);
76 $prev_halting = $regs->[4];
79 # if ($seen{join(',', @$regs)}++) {
84 if ($regs->[6] >= @code) {
95 # say "step ", ++$step;
96 for my $m (0 .. $#machines) {
97 next if $machines[$m]->[6] == -1;
99 if (one_step($machines[$m])) {
100 say "Machine $m halts after step $step prev $prev_halting";