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 /,/, <>);
139 push @comps, IntComp->new(\@mem, [ $_ ]);
143 push @queues, [] for 1 .. 50;
150 for my $i (0 .. 49) {
154 say "$i wants input";
156 if (defined $q->[0]) {
159 say "$i received @$in";
162 say "$i queue empty";
166 my ($x, $y) = ($c->run, $c->run);
168 say "$i sends $dst $x $y";
173 my $q = $queues[$dst];
179 say "all idle, sending ", join(' ', @nat), " to 0";
180 $comps[0]->input(@nat);
181 if (defined $prev_y && $nat[1] == $prev_y) {
182 say "$prev_y sent second time";