Mercurial > hg > aoc
comparison 2017/day15.d @ 19:6ee82d2c10fa
day 15
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Sat, 16 Dec 2017 21:23:52 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
18:70937ca0e7eb | 19:6ee82d2c10fa |
---|---|
1 import std.stdio; | |
2 import std.conv: to; | |
3 import std.range: generate, zip, take; | |
4 import std.algorithm: filter; | |
5 import std.array: array; | |
6 | |
7 auto generator(ulong val, ulong mult) { | |
8 return generate!(delegate(){ | |
9 val = (val * mult) % 2147483647; | |
10 return val; | |
11 }); | |
12 } | |
13 | |
14 auto countMatches( | |
15 bool delegate(ulong) filterA, | |
16 bool delegate(ulong) filterB | |
17 )(ulong valA, ulong valB, int patience) | |
18 { | |
19 auto genA = generator(valA, 16807); | |
20 auto genB = generator(valB, 48271); | |
21 return zip( | |
22 genA.filter!(filterA), | |
23 genB.filter!(filterB) | |
24 ) | |
25 .take(patience) | |
26 .filter!( | |
27 x => (x[0] & 0xFFFF) == (x[1] & 0xFFFF) | |
28 ).array.length; | |
29 } | |
30 | |
31 void main(string[] args) { | |
32 auto valA = to!ulong(args[1]), valB = to!ulong(args[2]); | |
33 writeln(countMatches!(x => true, x => true)(valA, valB, 40_000_000)); | |
34 writeln(countMatches!(x => x%4 == 0, x => x%8 == 0)(valA, valB, 5_000_000)); | |
35 } |