Mercurial > hg > aoc
changeset 19:6ee82d2c10fa
day 15
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Sat, 16 Dec 2017 21:23:52 -0500 |
parents | 70937ca0e7eb |
children | 8d1edc9efcb4 |
files | 2017/day15.d |
diffstat | 1 files changed, 35 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/2017/day15.d @@ -0,0 +1,35 @@ +import std.stdio; +import std.conv: to; +import std.range: generate, zip, take; +import std.algorithm: filter; +import std.array: array; + +auto generator(ulong val, ulong mult) { + return generate!(delegate(){ + val = (val * mult) % 2147483647; + return val; + }); +} + +auto countMatches( + bool delegate(ulong) filterA, + bool delegate(ulong) filterB +)(ulong valA, ulong valB, int patience) +{ + auto genA = generator(valA, 16807); + auto genB = generator(valB, 48271); + return zip( + genA.filter!(filterA), + genB.filter!(filterB) + ) + .take(patience) + .filter!( + x => (x[0] & 0xFFFF) == (x[1] & 0xFFFF) + ).array.length; +} + +void main(string[] args) { + auto valA = to!ulong(args[1]), valB = to!ulong(args[2]); + writeln(countMatches!(x => true, x => true)(valA, valB, 40_000_000)); + writeln(countMatches!(x => x%4 == 0, x => x%8 == 0)(valA, valB, 5_000_000)); +}