# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1514928088 18000 # Node ID f2c11215006dcdf47aa62742afe03ad85657fd6f # Parent 299a431ac58208d26fdac9e7cc7ff8c46584fd51 day 23 diff --git a/2017/day23.d b/2017/day23.d 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)); +}