summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--2017/input/day15.txt2
-rw-r--r--2017/src/bin/day15.rs49
2 files changed, 51 insertions, 0 deletions
diff --git a/2017/input/day15.txt b/2017/input/day15.txt
new file mode 100644
index 0000000..fdc2fa8
--- /dev/null
+++ b/2017/input/day15.txt
@@ -0,0 +1,2 @@
+Generator A starts with 883
+Generator B starts with 879
\ No newline at end of file
diff --git a/2017/src/bin/day15.rs b/2017/src/bin/day15.rs
new file mode 100644
index 0000000..dbf041a
--- /dev/null
+++ b/2017/src/bin/day15.rs
@@ -0,0 +1,49 @@
+use std::io::{self, Read};
+
+struct GenA(u64);
+
+impl Iterator for GenA {
+    type Item = u64;
+
+    fn next(&mut self) -> Option<u64> {
+        self.0 = self.0.wrapping_mul(16807) % 2147483647;
+        Some(self.0)
+    }
+}
+
+struct GenB(u64);
+
+impl Iterator for GenB {
+    type Item = u64;
+
+    fn next(&mut self) -> Option<u64> {
+        self.0 = self.0.wrapping_mul(48271) % 2147483647;
+        Some(self.0)
+    }
+}
+
+fn judge(a: u64, b: u64) -> usize {
+    GenA(a).zip(GenB(b))
+        .take(40_000_000)
+        .filter(|&(a, b)| a & 0xFFFF == b & 0xFFFF)
+        .count()
+}
+
+fn solve1(input: &str) -> usize {
+    let mut iter = input.split_whitespace();
+    let a = iter.clone().nth(4).unwrap().parse().unwrap();
+    let b = iter.nth(9).unwrap().parse().unwrap();
+    judge(a, b)
+}
+
+fn main() {
+    let mut input = String::new();
+    io::stdin().read_to_string(&mut input).unwrap();
+
+    println!("Part 1: {}", solve1(input.trim()));
+}
+
+#[test]
+fn part1() {
+    assert_eq!(588, judge(65, 8921));
+}