changeset 29:f2c11215006d

day 23
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Tue, 02 Jan 2018 16:21:28 -0500
parents 299a431ac582
children c64fab7ed515
files 2017/day23.d
diffstat 1 files changed, 84 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/2017/day23.d
@@ -0,0 +1,84 @@
+import std.stdio;
+import std.array: array;
+import std.string: split;
+import std.conv: to, ConvException;
+
+import std.math: sqrt;
+import std.range: iota, stride;
+import std.algorithm: filter;
+
+auto isComposite(long p) {
+  foreach(x; 2..sqrt(cast(double) p)) {
+    if (p % x == 0) {
+      return true;
+    }
+  }
+  return false;
+}
+
+auto runProgram(string[] opcodes, bool shortcircuit=false) {
+
+  long ip = 0;
+  long[char] regs;
+  long mult = 0;
+
+  if (shortcircuit) {
+    regs['a'] = 1;
+  }
+
+  while(0 <= ip && ip < opcodes.length) {
+    auto opcode = opcodes[ip].split;
+    auto op = opcode[0];
+    auto reg = opcode[1][0];
+    long val = 0;
+    if (opcode.length > 2) {
+      try {
+        val = to!long(opcode[2]);
+      }
+      catch(ConvException){
+        val = regs.get(opcode[2][0], 0);
+      }
+    }
+
+    if (ip > 7 && shortcircuit) {
+      auto low = regs['b'], hi = regs['c'];
+      auto step = -to!long(opcodes[30].split[2]);
+      return iota(low, hi+1).stride(step).filter!(isComposite).array.length;
+    }
+
+    switch(op) {
+    case "set":
+      regs[reg] = val;
+      goto default;
+    case "sub":
+      regs[reg] = regs.get(reg, 0) - val;
+      goto default;
+    case "mul":
+      regs[reg] = regs.get(reg, 0) * val;
+      mult++;
+      goto default;
+    case "jnz":
+      long cmp;
+      try {
+        cmp = to!long(opcode[1]);
+      }
+      catch(ConvException) {
+        cmp = regs.get(reg, 0);
+      }
+      if (cmp != 0) {
+        ip += val;
+        break;
+      }
+      goto default;
+    default:
+      ip++;
+    }
+  }
+  return(mult);
+}
+
+void main(string[] args) {
+  auto opcodes = File(args[1]).byLineCopy.array.dup;
+  writeln(runProgram(opcodes));
+  writeln(runProgram(opcodes, true));
+}