diff --git a/src/day9.rs b/src/day9.rs index 93f51ba..58f36af 100644 --- a/src/day9.rs +++ b/src/day9.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -fn find_next_value(line: Vec) -> i32 { +fn find_next_value(line: &Vec, front: bool) -> i32 { if line.iter().all(|i| *i == 0) { return 0; } @@ -11,45 +11,36 @@ fn find_next_value(line: Vec) -> i32 { .map(|(a, b)| b - a) .collect::>(); - line.last().unwrap() + find_next_value(next_row) -} - -fn find_prev_value(line: Vec) -> i32 { - if line.iter().all(|i| *i == 0) { - return 0; + if front { + line.first().unwrap() - find_next_value(&next_row, front) + } else { + line.last().unwrap() + find_next_value(&next_row, front) } +} - let next_row = line - .iter() - .tuple_windows() - .map(|(a, b)| b - a) - .collect::>(); - - line.first().unwrap() - find_prev_value(next_row) +fn parse(input: &str) -> Vec> { + input + .lines() + .map(|line| { + line.split(" ") + .map(|v| v.parse::().unwrap()) + .collect::>() + }) + .collect::>() } pub fn day9_part1(input: &str) -> String { - let lines = input.lines().map(|line| { - line.split(" ") - .map(|v| v.parse::().unwrap()) - .collect::>() - }); - - lines - .map(|line| find_next_value(line)) + parse(input) + .iter() + .map(|line| find_next_value(line, false)) .sum::() .to_string() } pub fn day9_part2(input: &str) -> String { - let lines = input.lines().map(|line| { - line.split(" ") - .map(|v| v.parse::().unwrap()) - .collect::>() - }); - - lines - .map(|line| find_prev_value(line)) + parse(input) + .iter() + .map(|line| find_next_value(line, true)) .sum::() .to_string() }