From c3e72963ed6c77c8c3bdcc2deb86f895b5221a9c Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Sun, 24 Dec 2017 11:08:00 -0500 Subject: Day 15, part 2 --- 2017/src/bin/day15.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) (limited to '2017') 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 { + 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 { + 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)); } -- cgit 1.4.1