5 chomp (my @mem = split /,/, <>);
8 my ($mref, $addr, $mode) = @_;
10 return $mref->[ $mref->[$addr] ];
11 } elsif ($mode == 1) {
12 return $mref->[$addr];
17 my ($mref, $iref) = @_;
23 my $opcode = $mem[$pc];
24 my $op = int($opcode % 100);
25 my $m1 = int($opcode / 100) % 10;
26 my $m2 = int($opcode / 1000) % 10;
28 $mem[ $mem[$pc+3] ] = m2val(\@mem, $pc+1, $m1)
29 + m2val(\@mem, $pc+2, $m2);
32 $mem[ $mem[$pc+3] ] = m2val(\@mem, $pc+1, $m1)
33 * m2val(\@mem, $pc+2, $m2);
36 $mem[ $mem[$pc+1] ] = shift @inputs;
39 push @out, m2val(\@mem, $pc+1, $m1);
42 if (m2val(\@mem, $pc+1, $m1)) {
43 $pc = m2val(\@mem, $pc+2, $m2);
48 if (!m2val(\@mem, $pc+1, $m1)) {
49 $pc = m2val(\@mem, $pc+2, $m2);
55 m2val(\@mem, $pc+1, $m1)
56 < m2val(\@mem, $pc+2, $m2) ? 1 : 0;
60 m2val(\@mem, $pc+1, $m1)
61 == m2val(\@mem, $pc+2, $m2) ? 1 : 0;
72 my ($remaining, $input) = @_;
73 for my $i (0 .. $#$remaining) {
75 my @in = ($nr[$i], @$input);
76 say "running with ", join(',', @in);
78 my @rv = run(\@mem, \@in);
83 $max = $rv[0] if $max < $rv[0];
88 permute([ 0 .. 4 ], [0]);