9 my ($class, $mem, $inputs) = @_;
16 $self->{inputs} = [ @$inputs ]
22 my ($class, $other) = @_;
24 mem => [ @{ $other->{mem} } ],
27 base => $other->{base},
34 my ($self, $off, $mode) = @_;
36 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off] ] // 0;
37 } elsif ($mode == 1) {
38 return $self->{mem}->[$self->{pc} + $off] // 0;
39 } elsif ($mode == 2) {
40 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off ] + $self->{base} ] // 0;
45 my ($self, $off, $mode) = @_;
47 return $self->{mem}->[$self->{pc} + $off];
48 } elsif ($mode == 2) {
49 return $self->{mem}->[$self->{pc} + $off] + $self->{base};
54 my ($self, @input) = @_;
55 push @{ $self->{inputs} }, @input;
59 my ($self, @input) = @_;
60 my $mem = $self->{mem};
62 push @{ $self->{inputs} }, @input;
63 if (defined $self->{want_input}) {
64 $mem->[$self->{want_input}] = shift @{ $self->{inputs} };
65 $self->{want_input} = undef;
69 my $opcode = $mem->[$self->{pc}];
70 # say "pc=", $self->{pc}, " opcode=$opcode";
71 # say "mem=", join(',', map { $_ // '_' } @{ $self->{mem} });
72 my $op = int($opcode % 100);
73 my $m1 = int($opcode / 100) % 10;
74 my $m2 = int($opcode / 1000) % 10;
75 my $m3 = int($opcode / 10000) % 10;
77 $mem->[ m2pos($self, 3, $m3) ]
78 = m2val($self, 1, $m1)
79 + m2val($self, 2, $m2);
82 $mem->[ m2pos($self, 3, $m3) ]
83 = m2val($self, 1, $m1)
84 * m2val($self, 2, $m2);
87 if (@{ $self->{inputs} }) {
88 $mem->[ m2pos($self, 1, $m1) ]
89 = shift @{ $self->{inputs} };
92 $self->{want_input} = m2pos($self, 1, $m1);
97 my $val = m2val($self, 1, $m1);
101 if (m2val($self, 1, $m1)) {
102 $self->{pc} = m2val($self, 2, $m2);
107 if (!m2val($self, 1, $m1)) {
108 $self->{pc} = m2val($self, 2, $m2);
113 $mem->[ m2pos($self, 3, $m3) ] =
115 < m2val($self, 2, $m2) ? 1 : 0;
118 $mem->[ m2pos($self, 3, $m3) ] =
120 == m2val($self, 2, $m2) ? 1 : 0;
123 $self->{base} += m2val($self, 1, $m1);
125 } elsif ($op == 99) {
133 chomp (my @mem = split /,/, <>);
145 my $comp = IntComp->new(\@mem, [ map { ord } split //, $input ]);
147 while (my $rv = $comp->run()) {