10 my ($class, $mem, $inputs) = @_;
17 $self->{inputs} = [ @$inputs ]
23 my ($self, $off, $mode) = @_;
25 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off] ] // 0;
26 } elsif ($mode == 1) {
27 return $self->{mem}->[$self->{pc} + $off] // 0;
28 } elsif ($mode == 2) {
29 return $self->{mem}->[ $self->{mem}->[$self->{pc} + $off ] + $self->{base} ] // 0;
34 my ($self, $off, $mode) = @_;
36 return $self->{mem}->[$self->{pc} + $off];
37 } elsif ($mode == 2) {
38 return $self->{mem}->[$self->{pc} + $off] + $self->{base};
43 my ($self, @input) = @_;
44 push @{ $self->{inputs} }, @input;
48 my ($self, @input) = @_;
49 my $mem = $self->{mem};
51 push @{ $self->{inputs} }, @input;
52 if (defined $self->{want_input}) {
53 $mem->[$self->{want_input}] = shift @{ $self->{inputs} };
54 $self->{want_input} = undef;
58 my $opcode = $mem->[$self->{pc}];
59 # say "pc=", $self->{pc}, " opcode=$opcode";
60 # say "mem=", join(',', map { $_ // '_' } @{ $self->{mem} });
61 my $op = int($opcode % 100);
62 my $m1 = int($opcode / 100) % 10;
63 my $m2 = int($opcode / 1000) % 10;
64 my $m3 = int($opcode / 10000) % 10;
66 $mem->[ m2pos($self, 3, $m3) ]
67 = m2val($self, 1, $m1)
68 + m2val($self, 2, $m2);
71 $mem->[ m2pos($self, 3, $m3) ]
72 = m2val($self, 1, $m1)
73 * m2val($self, 2, $m2);
76 if (@{ $self->{inputs} }) {
77 $mem->[ m2pos($self, 1, $m1) ]
78 = shift @{ $self->{inputs} };
81 $self->{want_input} = m2pos($self, 1, $m1);
86 my $val = m2val($self, 1, $m1);
90 if (m2val($self, 1, $m1)) {
91 $self->{pc} = m2val($self, 2, $m2);
96 if (!m2val($self, 1, $m1)) {
97 $self->{pc} = m2val($self, 2, $m2);
102 $mem->[ m2pos($self, 3, $m3) ] =
104 < m2val($self, 2, $m2) ? 1 : 0;
107 $mem->[ m2pos($self, 3, $m3) ] =
109 == m2val($self, 2, $m2) ? 1 : 0;
112 $self->{base} += m2val($self, 1, $m1);
114 } elsif ($op == 99) {
122 chomp (my @mem = split /,/, <>);
131 my $comp = IntComp->new(\@mem);
133 my @chars = (' ', '#', 'x', '=', 'o');
134 my ($p_x, $b_x, $b_dir);
138 while (defined(my $rv = $comp->run)) {
141 if ($out[0] == -1 && $out[1] == 0) {
145 $maxx = $out[0] if !defined $maxx || $maxx < $out[0];
146 $maxy = $out[1] if !defined $maxy || $maxy < $out[1];
147 $m{$out[0],$out[1]} = $out[2];
148 $b_x = $out[0] if $out[2] == 4;
149 $p_x = $out[0] if $out[2] == 3;
154 last if !$comp->{want_input};
155 for my $y (0 .. $maxy) {
156 for my $x (0 .. $maxx) {
157 print $chars[ $m{$x,$y} // 0 ];
164 } elsif ($p_x < $b_x) {
171 say "Final score: $score";