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.
This commit is contained in:
Johannes
2018-12-01 15:13:16 +01:00
parent cebb80763a
commit 2d64eefc09

View File

@@ -2,13 +2,10 @@ use std::collections::HashSet;
use utils; use utils;
pub fn task1() { pub fn task1() {
let contents = utils::read_file("input/day01.txt"); let frequency: i32 = utils::read_file("input/day01.txt")
.lines()
let mut frequency = 0; .map(|line| line.parse::<i32>().unwrap())
for line in contents.split_whitespace() { .sum();
let number: i32 = line.parse().unwrap();
frequency += number;
}
println!("Result: {}", frequency); println!("Result: {}", frequency);
} }
@@ -16,21 +13,23 @@ pub fn task1() {
pub fn task2() { pub fn task2() {
let contents = utils::read_file("input/day01.txt"); let contents = utils::read_file("input/day01.txt");
let mut seen = HashSet::new(); let mut seen: HashSet<i32> = HashSet::new();
seen.insert(0);
let mut frequency = 0; let start_state = (std::cell::RefCell::new(seen), std::cell::RefCell::new(0));
seen.insert(frequency); let final_state = contents
let changes: Vec<i32> = contents.lines().map(|line| line.parse().unwrap()).collect(); .lines()
.map(|line| line.parse::<i32>().unwrap())
loop { .cycle()
for number in changes.iter() { .scan(&start_state, |(hash_set, current_freq), freq_change| {
frequency += number; *current_freq.borrow_mut() += freq_change;
if seen.contains(&frequency) { if hash_set.borrow_mut().contains(&current_freq.borrow()) {
println!("{} was there already!", frequency); Some((current_freq.borrow(), true))
return; } 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);
}
}
} }