aboutsummaryrefslogtreecommitdiff
path: root/src/2017/day15/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-02-09 17:01:36 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-02-09 17:01:36 +0800
commitd496215180f2e8999997c421507fb643fbff876e (patch)
tree0dc36fed97b5dbbd9f3d903403a4cd284bb07d96 /src/2017/day15/aoc.cpp
parent6e66e948fd41ad01ec853ee297add1e7fe554298 (diff)
downloadadvent-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.cpp57
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