]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day09 - part 1
authoralex <null>
Sat, 9 Dec 2023 07:01:55 +0000 (08:01 +0100)
committeralex <null>
Sat, 9 Dec 2023 07:01:55 +0000 (08:01 +0100)
src/day09.rs [new file with mode: 0644]
src/main.rs

diff --git a/src/day09.rs b/src/day09.rs
new file mode 100644 (file)
index 0000000..241b648
--- /dev/null
@@ -0,0 +1,73 @@
+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());
+    }
+}
index a441260647919a34cdc4b755743229f74517934b..5dc80cc7fb9bd4871c7f009fcc0f671f1a1c5cdf 100644 (file)
@@ -11,6 +11,7 @@ pub mod day05;
 pub mod day06;
 pub mod day07;
 pub mod day08;
+pub mod day09;
 
 fn main() {
     let args: Vec<String> = env::args().collect();
@@ -37,6 +38,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box<dyn Error>> {
         "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(())