8 my @is_op = (65535) x 16;
16 my @before = @nums[0..3];
17 my ($op, $a, $b, $c) = @nums[4..7];
18 my @after = @nums[8..11];
21 print join(' ', @nums), "\n";
23 $is_op[$op] &= ~(1 << 0) unless ($before[$a] + $before[$b] == $after[$c]);
25 $is_op[$op] &= ~(1 << 1) unless ($before[$a] + $b == $after[$c]);
27 $is_op[$op] &= ~(1 << 2) unless ($before[$a] * $before[$b] == $after[$c]);
29 $is_op[$op] &= ~(1 << 3) unless ($before[$a] * $b == $after[$c]);
31 $is_op[$op] &= ~(1 << 4) unless (($before[$a] & $before[$b]) == $after[$c]);
33 $is_op[$op] &= ~(1 << 5) unless (($before[$a] & $b) == $after[$c]);
35 $is_op[$op] &= ~(1 << 6) unless (($before[$a] | $before[$b]) == $after[$c]);
37 $is_op[$op] &= ~(1 << 7) unless (($before[$a] | $b) == $after[$c]);
39 $is_op[$op] &= ~(1 << 8) unless ($before[$a] == $after[$c]);
41 $is_op[$op] &= ~(1 << 9) unless ($a == $after[$c]);
43 $is_op[$op] &= ~(1 << 10) unless (($a > $before[$b] ? 1 : 0) == $after[$c]);
45 $is_op[$op] &= ~(1 << 11) unless (($before[$a] > $b ? 1 : 0) == $after[$c]);
47 $is_op[$op] &= ~(1 << 12) unless (($before[$a] > $before[$b] ? 1 : 0) == $after[$c]);
49 $is_op[$op] &= ~(1 << 13) unless (($a == $before[$b] ? 1 : 0) == $after[$c]);
51 $is_op[$op] &= ~(1 << 14) unless (($before[$a] == $b ? 1 : 0) == $after[$c]);
53 $is_op[$op] &= ~(1 << 15) unless (($before[$a] == $before[$b] ? 1 : 0) == $after[$c]);
54 print join(' ', map { sprintf("%04x", $_) } @is_op), "\n";
57 my %is_2n = map { (1 << $_) => 1 } 0 .. 15;
62 say join(" ", map { sprintf("%04x", $_) } @is_op);
64 for my $try (0 .. 15) {
65 next if $done_2n{$try};
66 next if !$is_2n{$is_op[$try]};
67 print "Unique: $try: $is_op[$try]\n";
70 for my $other (0 .. 15) {
71 next if $done_2n{$other};
72 $is_op[$other] &= ~$is_op[$try];
78 for my $op (0 .. 15) {
80 next if (1 << $l) != $is_op[$op];
89 my ($op, $a, $b, $c) = /(\d+)/g;
90 say "$op $a $b $c ", join(' ', @regs);
93 $regs[$c] = $regs[$a] + $regs[$b] if $op_trans[$op] == 0;
95 $regs[$c] = $regs[$a] + $b if $op_trans[$op] == 1;
97 $regs[$c] = $regs[$a] * $regs[$b] if $op_trans[$op] == 2;
99 $regs[$c] = $regs[$a] * $b if $op_trans[$op] == 3;
101 $regs[$c] = ($regs[$a] & $regs[$b]) if $op_trans[$op] == 4;
103 $regs[$c] = ($regs[$a] & $b) if $op_trans[$op] == 5;
105 $regs[$c] = ($regs[$a] | $regs[$b]) if $op_trans[$op] == 6;
107 $regs[$c] = ($regs[$a] | $b) if $op_trans[$op] == 7;
109 $regs[$c] = $regs[$a] if $op_trans[$op] == 8;
111 $regs[$c] = $a if $op_trans[$op] == 9;
113 $regs[$c] = ($a > $regs[$b] ? 1 : 0) if $op_trans[$op] == 10;
115 $regs[$c] = ($regs[$a] > $b ? 1 : 0) if $op_trans[$op] == 11;
117 $regs[$c] = ($regs[$a] > $regs[$b] ? 1 : 0) if $op_trans[$op] == 12;
119 $regs[$c] = ($a == $regs[$b] ? 1 : 0) if $op_trans[$op] == 13;
121 $regs[$c] = ($regs[$a] == $b ? 1 : 0) if $op_trans[$op] == 14;
123 $regs[$c] = ($regs[$a] == $regs[$b] ? 1 : 0) if $op_trans[$op] == 15;