about summary refs log tree commit diff
path: root/day05.pl
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2019-12-06 16:03:12 +0100
committerLeah Neukirchen <leah@vuxu.org>2019-12-06 16:03:12 +0100
commitd8ec84595c1a908cd83672d765c57a64dd06b31f (patch)
treebc2f76cdcbb4181ebaec4be7fa7bbf1166e120d8 /day05.pl
parente2fca96cdb4778318cae541e0ebfc3a76370422a (diff)
downloadadventofcode2019-d8ec84595c1a908cd83672d765c57a64dd06b31f.tar.gz
adventofcode2019-d8ec84595c1a908cd83672d765c57a64dd06b31f.tar.xz
adventofcode2019-d8ec84595c1a908cd83672d765c57a64dd06b31f.zip
day05
Diffstat (limited to 'day05.pl')
-rw-r--r--day05.pl32
1 files changed, 32 insertions, 0 deletions
diff --git a/day05.pl b/day05.pl
new file mode 100644
index 0000000..e24b27c
--- /dev/null
+++ b/day05.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+use v5.16;
+
+use File::Slurper 'read_text';
+
+sub compute {
+    my @in = @_;
+    my @out = ();
+
+    my @d = split ",", read_text "day05";
+    
+    for (my $ip = 0; $d[$ip] != 99; ) {
+        my ($pm3, $pm2, $pm1, $op1, $op2) = split '', sprintf("%05d", $d[$ip]);
+        my $op = $op1 . $op2;
+        my $p1 = $pm1 ? $d[$ip+1] : $d[$d[$ip+1]];
+        my $p2 = $pm2 ? $d[$ip+2] : $d[$d[$ip+2]];
+        my $p3 = $pm3 ? $d[$ip+3] : $d[$d[$ip+3]];
+        if    ($op == 1) { $d[$d[$ip+3]] = $p1 + $p2;  $ip += 4; }
+        elsif ($op == 2) { $d[$d[$ip+3]] = $p1 * $p2;  $ip += 4; }
+        elsif ($op == 3) { $d[$d[$ip+1]] = shift @in;  $ip += 2; }
+        elsif ($op == 4) { push @out, $p1;             $ip += 2; }
+        elsif ($op == 5) { $ip =  $p1 ? $p2 :          $ip +  3; }
+        elsif ($op == 6) { $ip = !$p1 ? $p2 :          $ip +  3; }
+        elsif ($op == 7) { $d[$d[$ip+3]] = $p1 < $p2;  $ip += 4; }
+        elsif ($op == 8) { $d[$d[$ip+3]] = $p1 == $p2; $ip += 4; }
+    }
+
+    @out;
+}
+
+say((compute(1))[-1]);  # 13978427
+say compute(5);  # 11189491