diff options
author | June McEnroe <programble@gmail.com> | 2017-12-24 11:08:00 -0500 |
---|---|---|
committer | June McEnroe <programble@gmail.com> | 2017-12-24 11:08:00 -0500 |
commit | c3e72963ed6c77c8c3bdcc2deb86f895b5221a9c (patch) | |
tree | 855687fedc68ef03872b1ac2f7c5b15a43f162d3 /2017 | |
parent | Day 15 (diff) | |
download | aoc-c3e72963ed6c77c8c3bdcc2deb86f895b5221a9c.tar.gz aoc-c3e72963ed6c77c8c3bdcc2deb86f895b5221a9c.zip |
Day 15, part 2
Diffstat (limited to '')
-rw-r--r-- | 2017/src/bin/day15.rs | 56 |
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)); } |