9 my ($class, $mem, $inputs) = @_;
16 $self->{inputs} = [ @$inputs ]
22 my ($self, $off, $mode) = @_;
24 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off] ] // 0;
25 } elsif ($mode == 1) {
26 return $self->{mem}->[$self->{pc} + $off] // 0;
27 } elsif ($mode == 2) {
28 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off ] + $self->{base} ] // 0;
33 my ($self, $off, $mode) = @_;
35 return $self->{mem}->[$self->{pc} + $off];
36 } elsif ($mode == 2) {
37 return $self->{mem}->[$self->{pc} + $off] + $self->{base};
42 my ($self, @input) = @_;
43 push @{ $self->{inputs} }, @input;
47 my ($self, @input) = @_;
48 my $mem = $self->{mem};
50 push @{ $self->{inputs} }, @input;
51 if (defined $self->{want_input}) {
52 $mem->[$self->{want_input}] = shift @{ $self->{inputs} };
53 $self->{want_input} = undef;
57 my $opcode = $mem->[$self->{pc}];
58 # say "pc=", $self->{pc}, " opcode=$opcode";
59 # say "mem=", join(',', map { $_ // '_' } @{ $self->{mem} });
60 my $op = int($opcode % 100);
61 my $m1 = int($opcode / 100) % 10;
62 my $m2 = int($opcode / 1000) % 10;
63 my $m3 = int($opcode / 10000) % 10;
65 $mem->[ m2pos($self, 3, $m3) ]
66 = m2val($self, 1, $m1)
67 + m2val($self, 2, $m2);
70 $mem->[ m2pos($self, 3, $m3) ]
71 = m2val($self, 1, $m1)
72 * m2val($self, 2, $m2);
75 if (@{ $self->{inputs} }) {
76 $mem->[ m2pos($self, 1, $m1) ]
77 = shift @{ $self->{inputs} };
80 $self->{want_input} = m2pos($self, 1, $m1);
85 my $val = m2val($self, 1, $m1);
89 if (m2val($self, 1, $m1)) {
90 $self->{pc} = m2val($self, 2, $m2);
95 if (!m2val($self, 1, $m1)) {
96 $self->{pc} = m2val($self, 2, $m2);
101 $mem->[ m2pos($self, 3, $m3) ] =
103 < m2val($self, 2, $m2) ? 1 : 0;
106 $mem->[ m2pos($self, 3, $m3) ] =
108 == m2val($self, 2, $m2) ? 1 : 0;
111 $self->{base} += m2val($self, 1, $m1);
113 } elsif ($op == 99) {
121 chomp (my @mem = split /,/, <>);
123 my $comp = IntComp->new(\@mem, [2]);
124 print $_,'_' while defined ($_ = $comp->run);