]> www.fi.muni.cz Git - aoc.git/blob - 2019/13.pl
Day 25: examining the input
[aoc.git] / 2019 / 13.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 sub run {
17         my ($mref, $iref) = @_;
18         my @mem = @$mref;
19         my @inputs = @$iref;
20         my $pc = 0;
21         my @out;
22         while (1) {
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;
27                 if ($op == 1) {
28                         $mem[ $mem[$pc+3] ] = m2val(\@mem, $pc+1, $m1)
29                                 + m2val(\@mem, $pc+2, $m2);
30                         $pc += 4;
31                 } elsif ($op == 2) {
32                         $mem[ $mem[$pc+3] ] = m2val(\@mem, $pc+1, $m1)
33                                 * m2val(\@mem, $pc+2, $m2);
34                         $pc += 4;
35                 } elsif ($op == 3) {
36                         $mem[ $mem[$pc+1] ] = shift @inputs;
37                         $pc += 2;
38                 } elsif ($op == 4) {
39                         push @out, m2val(\@mem, $pc+1, $m1);
40                         $pc += 2;
41                 } elsif ($op == 5) {
42                         if (m2val(\@mem, $pc+1, $m1)) {
43                                 $pc = m2val(\@mem, $pc+2, $m2);
44                         } else {
45                                 $pc += 3;
46                         }
47                 } elsif ($op == 6) {
48                         if (!m2val(\@mem, $pc+1, $m1)) {
49                                 $pc = m2val(\@mem, $pc+2, $m2);
50                         } else {
51                                 $pc += 3;
52                         }
53                 } elsif ($op == 7) {
54                         $mem[ $mem[$pc+3] ] =
55                                 m2val(\@mem, $pc+1, $m1)
56                                 < m2val(\@mem, $pc+2, $m2) ? 1 : 0;
57                         $pc += 4;
58                 } elsif ($op == 8) {
59                         $mem[ $mem[$pc+3] ] =
60                                 m2val(\@mem, $pc+1, $m1)
61                                 == m2val(\@mem, $pc+2, $m2) ? 1 : 0;
62                         $pc += 4;
63                 } elsif ($op == 99) {
64                         last;
65                 }
66         }
67         return @out;
68 }
69
70 my $max = 0;
71 sub permute {
72         my ($remaining, $input) = @_;
73         for my $i (0 .. $#$remaining) {
74                 my @nr = @$remaining;
75                 my @in = ($nr[$i], @$input);
76                 say "running with ", join(',', @in);
77                 splice(@nr, $i, 1);
78                 my @rv = run(\@mem, \@in);
79                 if (@nr) {
80                         permute(\@nr, \@rv);
81                 } else {
82                         say @rv;
83                         $max = $rv[0] if $max < $rv[0];
84                 }
85         }
86 }
87
88 permute([ 0 .. 4 ], [0]);
89
90 say $max;
91