From 37bef8869f700073b526e1633b41541dd41f581d Mon Sep 17 00:00:00 2001 From: Wesley Moore Date: Sat, 9 Dec 2017 14:55:33 +1000 Subject: [PATCH] Add day 6 part 2 solution --- 2017/day/6/src/main.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/2017/day/6/src/main.rs b/2017/day/6/src/main.rs index 956ce4b..7a35cf3 100644 --- a/2017/day/6/src/main.rs +++ b/2017/day/6/src/main.rs @@ -1,7 +1,7 @@ use std::fs::File; use std::io::{Read}; use std::str::FromStr; -use std::collections::HashSet; +use std::collections::HashMap; fn main() { let mut buffer = String::new(); @@ -13,7 +13,8 @@ fn main() { .map(|digit| i32::from_str(&digit).unwrap()) .collect::>(); - println!("{}", redistribution_cycles(&mut banks)); + let result = redistribution_cycles(&mut banks); + println!("cycles = {}\nsize of loop = {}", result.0, result.1); } fn redistribute(banks: &mut Vec) { @@ -30,22 +31,25 @@ fn redistribute(banks: &mut Vec) { } } -fn redistribution_cycles(banks: &mut Vec) -> usize { - let mut seen_states = HashSet::new(); - seen_states.insert(banks.clone()); +fn redistribution_cycles(banks: &mut Vec) -> (usize, usize) { + let mut seen_states = HashMap::new(); + let mut loop_count: usize = 0; + seen_states.insert(banks.clone(), loop_count); loop { redistribute(banks); - if seen_states.insert(banks.clone()) == false { - break; + loop_count += 1; + if let Some(&seen_at_loop) = seen_states.get(banks) { + return (seen_states.len(), loop_count - seen_at_loop); + } + else { + seen_states.insert(banks.clone(), loop_count); } } - - seen_states.len() } #[test] fn test_example() { let mut banks = vec![0, 2, 7, 0]; - assert_eq!(redistribution_cycles(&mut banks), 5); + assert_eq!(redistribution_cycles(&mut banks), (5, 4)); }