mirror of
https://github.com/anthonyoteri/advent-of-code-2023.git
synced 2026-06-05 18:56:53 -04:00
+47
-3
@@ -1,18 +1,62 @@
|
|||||||
use crate::error::AocError;
|
use crate::error::AocError;
|
||||||
|
|
||||||
|
fn parse(input: &str) -> Vec<Vec<i32>> {
|
||||||
|
input
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
line.split_whitespace()
|
||||||
|
.map(|num| num.parse().unwrap())
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_next(input: Vec<i32>) -> i32 {
|
||||||
|
let input = input.clone();
|
||||||
|
|
||||||
|
if input.iter().all(|&v| v == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let next_vec = input[1..]
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(i, num)| input[i] - num)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
input.last().unwrap() - get_next(next_vec.clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_prev(input: Vec<i32>) -> i32 {
|
||||||
|
let mut input = input.clone();
|
||||||
|
input.reverse();
|
||||||
|
get_next(input)
|
||||||
|
}
|
||||||
|
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
pub fn process(input: &str) -> miette::Result<u64, AocError> {
|
pub fn process(input: &str) -> miette::Result<i64, AocError> {
|
||||||
Ok(0)
|
let input = parse(input);
|
||||||
|
Ok(input
|
||||||
|
.iter()
|
||||||
|
.map(|v| get_prev(v.clone()))
|
||||||
|
.map(i64::from)
|
||||||
|
.sum::<i64>())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test_log::test]
|
||||||
|
fn test_get_next() {
|
||||||
|
let input = vec![10, 13, 16, 21, 30, 45];
|
||||||
|
assert_eq!(get_prev(input), 5);
|
||||||
|
}
|
||||||
|
|
||||||
#[test_log::test]
|
#[test_log::test]
|
||||||
fn test_process() -> miette::Result<()> {
|
fn test_process() -> miette::Result<()> {
|
||||||
let input = include_str!("../test-input.txt");
|
let input = include_str!("../test-input.txt");
|
||||||
assert_eq!(0, process(input)?);
|
assert_eq!(2, process(input)?);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user