--- /dev/null
+use std::io::Read;
+use std::error::Error;
+use std::fs::File;
+
+pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
+ let mut f = File::open(input_file)?;
+ let mut input = String::new();
+ f.read_to_string(&mut input)?;
+
+ let res = run_part1(&input)?;
+ println!("{res}");
+
+ let res = run_part2(&input)?;
+ println!("{res}");
+
+ Ok(())
+}
+
+fn run_part1(input: &str) -> Result<i32, Box<dyn Error>> {
+ println!("Running day09 - part 1");
+
+ fn compute_diff(values: Vec<i32>) -> Vec<i32> {
+ (1..values.len())
+ .map(|i| values[i] - values[i - 1])
+ .collect()
+ }
+
+ let res = input.lines()
+ .filter(|l| !l.is_empty())
+ .map(|l| {
+ let mut values: Vec<i32> = l.split(' ')
+ .map(|v| v.parse().unwrap())
+ .collect();
+ let mut next = values[values.len() - 1];
+ while values.iter().sum::<i32>() != 0 {
+ //dbg!(&values);
+ values = compute_diff(values);
+ let d = values[values.len() - 1];
+ next += d;
+ }
+ next
+ })
+ .sum();
+ Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<i32, Box<dyn Error>> {
+ println!("Running day09 - part 2");
+ let res = 0;
+ Ok(res)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ static TEXT_INPUT: &str = "\
+0 3 6 9 12 15
+1 3 6 10 15 21
+10 13 16 21 30 45";
+
+ #[test]
+ fn day09_part1() {
+ let res = run_part1(TEXT_INPUT);
+ assert_eq!(114, res.unwrap());
+ }
+
+ #[test]
+ fn day09_part2() {
+ let res = run_part2(TEXT_INPUT);
+ assert_eq!(0, res.unwrap());
+ }
+}
pub mod day06;
pub mod day07;
pub mod day08;
+pub mod day09;
fn main() {
let args: Vec<String> = env::args().collect();
"day06" => day06::run(input_file)?,
"day07" => day07::run(input_file)?,
"day08" => day08::run(input_file)?,
+ "day09" => day09::run(input_file)?,
_ => return Err(format!("unknown day \"{day}\"").into()),
}
Ok(())