# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1513485505 18000 # Node ID 8d1edc9efcb4b426a2c6b3a248ba6788161cd700 # Parent 6ee82d2c10fadb382d1cf8c7b944d39818bd94c0 day 16 diff --git a/2017/day16.d b/2017/day16.d new file mode 100644 --- /dev/null +++ b/2017/day16.d @@ -0,0 +1,49 @@ +import std.stdio; +import std.algorithm: swap, bringToFront, map, find, canFind; +import std.string: split, indexOf; +import std.conv: to; +import std.range: iota, join, zip; +import std.array: array; + +auto parseOps(string[] ops, string progsin) { + // ubyte[] not char[] because https://issues.dlang.org/show_bug.cgi?id=16959 + auto progs = cast(ubyte[]) progsin.dup; + foreach(op; ops) { + switch(op[0]) { + case 's': + auto rot = to!int(op[1..$]); + bringToFront(progs[rot..$], progs[0..rot]); + break; + case 'x': + auto idx = op[1..$].split("/").map!(to!int); + swap(progs[idx[0]], progs[idx[1]]); + break; + case 'p': + auto AB = op[1..$].split("/"); + swap(find(progs, AB[0])[0], find(progs, AB[1])[0]); + break; + default: + } + } + return cast(string) progs.idup; +} + +auto iteratePerm(string[] ops, string progs) { + string[] seenprogs = [progs]; + string result = progs; + while(true) { + result = ops.parseOps(result); + if(seenprogs.canFind(result)) { + break; + } + seenprogs ~= result; + } + return seenprogs[1_000_000_000 % seenprogs.length]; +} + +void main(string[] args){ + auto ops = File(args[1]).byLineCopy.front.split(","); + auto progs = "abcdefghijklmnop"; + writeln(ops.parseOps(progs)); + writeln(ops.iteratePerm(progs)); +}