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:
@@ -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(¤t_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);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user