From 2d64eefc095beae91e9c208569804f94752a824f Mon Sep 17 00:00:00 2001 From: Johannes Date: Sat, 1 Dec 2018 15:13:16 +0100 Subject: [PATCH] day01 redone in a more functional way in task2, RefCell is used since the passed state in 'scan' seems to be immutable, although it shouldn't. --- src/tasks/day01.rs | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) 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); }