summary refs log tree commit diff homepage
path: root/2017
diff options
context:
space:
mode:
Diffstat (limited to '2017')
-rw-r--r--2017/src/bin/day15.rs56
1 files changed, 53 insertions, 3 deletions
diff --git a/2017/src/bin/day15.rs b/2017/src/bin/day15.rs
index dbf041a..9816c55 100644
--- a/2017/src/bin/day15.rs
+++ b/2017/src/bin/day15.rs
@@ -22,18 +22,62 @@ impl Iterator for GenB {
     }
 }
 
-fn judge(a: u64, b: u64) -> usize {
+struct GenA2(u64);
+
+impl Iterator for GenA2 {
+    type Item = u64;
+
+    fn next(&mut self) -> Option<u64> {
+        loop {
+            self.0 = self.0.wrapping_mul(16807) % 2147483647;
+            if self.0 % 4 == 0 {
+                return Some(self.0);
+            }
+        }
+    }
+}
+
+struct GenB2(u64);
+
+impl Iterator for GenB2 {
+    type Item = u64;
+
+    fn next(&mut self) -> Option<u64> {
+        loop {
+            self.0 = self.0.wrapping_mul(48271) % 2147483647;
+            if self.0 % 8 == 0 {
+                return Some(self.0);
+            }
+        }
+    }
+}
+
+fn judge1(a: u64, b: u64) -> usize {
     GenA(a).zip(GenB(b))
         .take(40_000_000)
         .filter(|&(a, b)| a & 0xFFFF == b & 0xFFFF)
         .count()
 }
 
+fn judge2(a: u64, b: u64) -> usize {
+    GenA2(a).zip(GenB2(b))
+        .take(5_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)
+    judge1(a, b)
+}
+
+fn solve2(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();
+    judge2(a, b)
 }
 
 fn main() {
@@ -41,9 +85,15 @@ fn main() {
     io::stdin().read_to_string(&mut input).unwrap();
 
     println!("Part 1: {}", solve1(input.trim()));
+    println!("Part 2: {}", solve2(input.trim()));
 }
 
 #[test]
 fn part1() {
-    assert_eq!(588, judge(65, 8921));
+    assert_eq!(588, judge1(65, 8921));
+}
+
+#[test]
+fn part2() {
+    assert_eq!(309, judge2(65, 8921));
 }