diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-02-09 17:01:36 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-02-09 17:01:36 +0800 |
commit | d496215180f2e8999997c421507fb643fbff876e (patch) | |
tree | 0dc36fed97b5dbbd9f3d903403a4cd284bb07d96 /src/2017/day15/aoc.cpp | |
parent | 6e66e948fd41ad01ec853ee297add1e7fe554298 (diff) | |
download | advent-of-code-d496215180f2e8999997c421507fb643fbff876e.tar.gz advent-of-code-d496215180f2e8999997c421507fb643fbff876e.zip |
2017 day16
Diffstat (limited to 'src/2017/day15/aoc.cpp')
-rw-r--r-- | src/2017/day15/aoc.cpp | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/src/2017/day15/aoc.cpp b/src/2017/day15/aoc.cpp index bf7b729..756ccdd 100644 --- a/src/2017/day15/aoc.cpp +++ b/src/2017/day15/aoc.cpp @@ -2,5 +2,60 @@ namespace aoc2017 { -std::pair<int64_t, int64_t> day15(line_view) { return {0, 0}; } +uint64_t generator(uint64_t x, uint64_t factor) { return x * factor % 2147483647; } + +bool lower16(uint64_t x) { + uint8_t i[8] = {0}; + memcpy(i, &x, 8); + return i[0] == 0 && i[1] == 0; +} + +int forty_million(uint64_t a, uint64_t b) { + int t{0}; + constexpr size_t mi = 40 * 1000000; + for (size_t i = 0; i < mi; i++) { + a = generator(a, 16807); + b = generator(b, 48271); + t += (int)lower16(a ^ b); + } + return t; +} + +int five_million(uint64_t a, uint64_t b) { + int t{0}; + constexpr size_t mi = 5 * 1000000; + size_t p{0}; + uint64_t n2[2] = {0, 0}; + while (p < mi) { + if (n2[0] == 0) { + a = generator(a, 16807); + if (a % 4 == 0) { + n2[0] = a; + } + } + if (n2[1] == 0) { + b = generator(b, 48271); + if (b % 8 == 0) { + n2[1] = b; + } + } + if (n2[0] > 0 && n2[1] > 0) { + t += (int)lower16(n2[0] ^ n2[1]); + n2[0] = 0; + n2[1] = 0; + p++; + } + } + return t; +} + +// Generator A starts with 873 +// Generator B starts with 583 +std::pair<int64_t, int64_t> day15(line_view) { + // uint64_t a = 65; + // uint64_t b = 8921; + uint64_t a = 873; + uint64_t b = 583; + return {forty_million(a, b), five_million(a, b)}; +} } // namespace aoc2017 |