8 my ($class, $mem, $inputs) = @_;
14 $self->{inputs} = [ @$inputs ]
20 my ($self, $off, $mode) = @_;
22 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off] ];
23 } elsif ($mode == 1) {
24 return $self->{mem}->[$self->{pc} + $off];
29 my ($self, @input) = @_;
30 push @{ $self->{inputs} }, @input;
34 my ($self, @input) = @_;
35 my $mem = $self->{mem};
37 push @{ $self->{inputs} }, @input;
38 if (defined $self->{want_input}) {
39 $mem->[$self->{want_input}] = shift @{ $self->{inputs} };
40 $self->{want_input} = undef;
44 my $opcode = $mem->[$self->{pc}];
45 say "pc=", $self->{pc}, " opcode=$opcode";
46 say "mem=", join(',', @{ $self->{mem} });
47 my $op = int($opcode % 100);
48 my $m1 = int($opcode / 100) % 10;
49 my $m2 = int($opcode / 1000) % 10;
51 $mem->[ $mem->[$self->{pc}+3] ]
52 = m2val($self, 1, $m1)
53 + m2val($self, 2, $m2);
56 $mem->[ $mem->[$self->{pc}+3] ]
57 = m2val($self, 1, $m1)
58 * m2val($self, 2, $m2);
61 if (@{ $self->{inputs} }) {
62 $mem->[ $mem->[$self->{pc} + 1] ]
63 = shift @{ $self->{inputs} };
66 $self->{want_input} = $self->{pc} + 1;
71 my $val = m2val($self, 1, $m1);
75 if (m2val($self, 1, $m1)) {
76 $self->{pc} = m2val($self, 2, $m2);
81 if (!m2val($self, 1, $m1)) {
82 $self->{pc} = m2val($self, 2, $m2);
87 $mem->[ $mem->[$self->{pc}+3] ] =
89 < m2val($self, 2, $m2) ? 1 : 0;
92 $mem->[ $mem->[$self->{pc}+3] ] =
94 == m2val($self, 2, $m2) ? 1 : 0;
104 chomp (my @mem = split /,/, <>);
112 push @interps, IntComp->new(\@mem, [ $p ]);
119 say "Starting from 0";
120 for my $int (@interps) {
125 say "Interp returned ", $rv // '_';
126 next ROUND if !defined $rv && $int->{want_input};
129 say "Loop returned $rv";
133 last if !defined $rv;
140 my ($rem, $used) = @_;
141 for my $i (0 .. $#$rem) {
143 my @in = ($nr[$i], @$used);
149 say "Running with perm ", join(',', @in);
150 my $rv = run_all(@in);
152 $max = $rv if $max < $rv;
157 permute([ 5 .. 9 ], []);