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 /,/, <>);
124 my @dirs = ([0, -1], [1, 0], [0, 1], [-1, 0]);
125 my ($x, $y, $dir) = (0, 0, 0);
127 my $comp = IntComp->new(\@mem, [ 0 ]);
133 last if !$comp->{want_input};
134 $comp->input($board{$x,$y} ? 1 : 0);
136 last if !defined $rv;
138 say "Painted $x,$y = $rv";
141 last if !$comp->{want_input};
142 $comp->input($board{$x,$y} ? 1 : 0);
144 last if !defined $rv;
147 $dir = 0 if $dir > 3;
150 $dir = 3 if $dir < 0;
152 $x += $dirs[$dir]->[0];
153 $y += $dirs[$dir]->[1];
154 say "rotated ", $rv ? 'right' : 'left', " and moved to $x, $y";
157 say "painted ", scalar keys %board, " fields";