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 /,/, <>);
137 sub back { my $x = shift; return 1 + (($x-1) ^ 1); }
139 my $c = IntComp->new(\@mem);
141 $map{10000,10000} = $c;
142 my @q = ([10_000, 10_000]);
143 while (my $pos = shift @q) {
146 my $orig_comp = $map{$x,$y};
147 for ([0, -1], [0, 1], [-1, 0], [1, 0]) {
148 my $nx = $x + $_->[0];
149 my $ny = $y + $_->[1];
151 next if defined $map{$nx,$ny};
152 my $comp = IntComp->clone($orig_comp);
153 my $rv = $comp->run($cmd);
154 say "moving from $x, $y to $nx, $ny $cmd: $rv";
158 $comp->{steps} = 1 + $orig_comp->{steps};
159 $map{$nx,$ny} = $comp;
160 push @q, [ $nx, $ny ];
162 say "found at $nx, $ny after ", 1 + $orig_comp->{steps},
167 say "map has ", scalar keys %map, " fields";