Mercurial > hg > aoc
changeset 29:f2c11215006d
day 23
author | Jordi GutiƩrrez Hermoso <jordigh@octave.org> |
---|---|
date | Tue, 02 Jan 2018 16:21:28 -0500 (2018-01-02) |
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)); +}