Mercurial > hg > aoc
changeset 20:8d1edc9efcb4
day 16
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Sat, 16 Dec 2017 23:38:25 -0500 |
parents | 6ee82d2c10fa |
children | f1f0220b5f7c |
files | 2017/day16.d |
diffstat | 1 files changed, 49 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
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)); +}