]> www.fi.muni.cz Git - aoc.git/blob - 2019/09.pl
First half of Year 2019
[aoc.git] / 2019 / 09.pl
1 #!/usr/bin/perl -w
2
3 use v5.16;
4
5 chomp (my @mem = split /,/, <>);
6
7 sub m2val {
8         my ($mref, $addr, $mode) = @_;
9         if ($mode == 0) {
10                 return $mref->[ $mref->[$addr] ];
11         } elsif ($mode == 1) {
12                 return $mref->[$addr];
13         }
14 }
15         
16         
17         
18 sub run {
19         my ($mref, $iref) = @_;
20         my @mem = @$mref;
21         my @inputs = @$iref;
22         my $pc = 0;
23         while (1) {
24                 my $opcode = $mem[$pc];
25                 my $op = int($opcode % 100);
26                 my $m1 = int($opcode / 100) % 10;
27                 my $m2 = int($opcode / 1000) % 10;
28                 if ($op == 1) {
29                         $mem[ $mem[$pc+3] ] = m2val(\@mem, $pc+1, $m1)
30                                 + m2val(\@mem, $pc+2, $m2);
31                         $pc += 4;
32                 } elsif ($op == 2) {
33                         $mem[ $mem[$pc+3] ] = m2val(\@mem, $pc+1, $m1)
34                                 * m2val(\@mem, $pc+2, $m2);
35                         $pc += 4;
36                 } elsif ($op == 3) {
37                         $mem[ $mem[$pc+1] ] = shift @inputs;
38                         $pc += 2;
39                 } elsif ($op == 4) {
40                         say m2val(\@mem, $pc+1, $m1);
41                         $pc += 2;
42                 } elsif ($op == 99) {
43                         last;
44                 }
45         }
46 }
47
48 run(\@mem, [ 1 ]);