diff --git a/src/tasks/day01.rs b/src/tasks/day01.rs index 1662125..ec7e19e 100644 --- a/src/tasks/day01.rs +++ b/src/tasks/day01.rs @@ -2,13 +2,10 @@ use std::collections::HashSet; use utils; pub fn task1() { - let contents = utils::read_file("input/day01.txt"); - - let mut frequency = 0; - for line in contents.split_whitespace() { - let number: i32 = line.parse().unwrap(); - frequency += number; - } + let frequency: i32 = utils::read_file("input/day01.txt") + .lines() + .map(|line| line.parse::().unwrap()) + .sum(); println!("Result: {}", frequency); } @@ -16,21 +13,23 @@ pub fn task1() { pub fn task2() { let contents = utils::read_file("input/day01.txt"); - let mut seen = HashSet::new(); - - let mut frequency = 0; - seen.insert(frequency); - let changes: Vec = contents.lines().map(|line| line.parse().unwrap()).collect(); - - loop { - for number in changes.iter() { - frequency += number; - if seen.contains(&frequency) { - println!("{} was there already!", frequency); - return; + let mut seen: HashSet = HashSet::new(); + seen.insert(0); + let start_state = (std::cell::RefCell::new(seen), std::cell::RefCell::new(0)); + let final_state = contents + .lines() + .map(|line| line.parse::().unwrap()) + .cycle() + .scan(&start_state, |(hash_set, current_freq), freq_change| { + *current_freq.borrow_mut() += freq_change; + if hash_set.borrow_mut().contains(¤t_freq.borrow()) { + Some((current_freq.borrow(), true)) + } else { + let value: i32 = *current_freq.borrow_mut(); + hash_set.borrow_mut().insert(value); + Some((current_freq.borrow(), false)) } + }).find(|state| state.1); - seen.insert(frequency); - } - } + println!("{:?} was there already!", final_state.unwrap().0); }