2023-09: Solve part 2
This commit is contained in:
parent
cd66aca007
commit
793241a355
|
@ -0,0 +1,11 @@
|
||||||
|
pub fn parse_line(s: &str) -> Vec<i32> {
|
||||||
|
s.split_whitespace().map(|x| x.parse().unwrap()).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_differences(nums: Vec<i32>) -> Vec<i32> {
|
||||||
|
nums.windows(2).map(|w| w[1] - w[0]).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn all_zeros(nums: Vec<i32>) -> bool {
|
||||||
|
nums.iter().all(|&x| x == 0)
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
pub mod part_one;
|
pub mod part_one;
|
||||||
// pub mod part_two;
|
pub mod part_two;
|
||||||
|
pub mod common;
|
||||||
|
|
||||||
use crate::utils::solution::Solution;
|
use crate::utils::solution::Solution;
|
||||||
use crate::utils::input_reader;
|
use crate::utils::input_reader;
|
||||||
|
@ -8,16 +9,12 @@ use crate::utils::input_reader;
|
||||||
pub struct Day9Solution;
|
pub struct Day9Solution;
|
||||||
|
|
||||||
impl Solution for Day9Solution {
|
impl Solution for Day9Solution {
|
||||||
|
|
||||||
fn part_one(&self) -> String {
|
fn part_one(&self) -> String {
|
||||||
// Implementation for part one of day 1
|
|
||||||
// ...
|
|
||||||
input_reader::read_input_file("input/2023/day_09/input.txt", part_one::part_one)
|
input_reader::read_input_file("input/2023/day_09/input.txt", part_one::part_one)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part_two(&self) -> String {
|
fn part_two(&self) -> String {
|
||||||
// Implementation for part two of day 1
|
input_reader::read_input_file("input/2023/day_09/input.txt", part_two::part_two)
|
||||||
// ...
|
|
||||||
String::from("Not implemented")
|
|
||||||
// part_two::part_two()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use super::common::{parse_line, get_differences, all_zeros};
|
||||||
|
|
||||||
pub fn part_one(input_lines: Vec<String>) -> String {
|
pub fn part_one(input_lines: Vec<String>) -> String {
|
||||||
let mut result: i32 = 0;
|
let mut result: i32 = 0;
|
||||||
|
|
||||||
|
@ -19,16 +21,4 @@ pub fn part_one(input_lines: Vec<String>) -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
result.to_string()
|
result.to_string()
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_line(s: &str) -> Vec<i32> {
|
|
||||||
s.split_whitespace().map(|x| x.parse().unwrap()).collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_differences(nums: Vec<i32>) -> Vec<i32> {
|
|
||||||
nums.windows(2).map(|w| w[1] - w[0]).collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn all_zeros(nums: Vec<i32>) -> bool {
|
|
||||||
nums.iter().all(|&x| x == 0)
|
|
||||||
}
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
use super::common::{parse_line, get_differences, all_zeros};
|
||||||
|
|
||||||
|
pub fn part_two(input_lines: Vec<String>) -> String {
|
||||||
|
let mut result: i32 = 0;
|
||||||
|
|
||||||
|
for line in input_lines {
|
||||||
|
let nums = parse_line(&line);
|
||||||
|
|
||||||
|
let mut first: Vec<i32> = Vec::new();
|
||||||
|
first.push(nums.first().unwrap().clone());
|
||||||
|
|
||||||
|
let mut diffs = get_differences(nums.clone());
|
||||||
|
first.push(diffs.first().unwrap().clone());
|
||||||
|
|
||||||
|
while !all_zeros(diffs.clone()) {
|
||||||
|
diffs = get_differences(diffs.clone());
|
||||||
|
first.push(diffs.first().unwrap().clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
first.reverse();
|
||||||
|
|
||||||
|
let mut res = 0;
|
||||||
|
res = first.iter().fold(res, |acc, &x| x - acc);
|
||||||
|
|
||||||
|
result += res;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.to_string()
|
||||||
|
}
|
Loading…
Reference in New Issue