Alexey Dorokhov il y a 2 ans
Parent
commit
3083c6dfae
8 fichiers modifiés avec 266 ajouts et 0 suppressions
  1. 1 0
      day_9a/.gitignore
  2. 32 0
      day_9a/Cargo.lock
  3. 9 0
      day_9a/Cargo.toml
  4. 90 0
      day_9a/src/main.rs
  5. 1 0
      day_9b/.gitignore
  6. 32 0
      day_9b/Cargo.lock
  7. 9 0
      day_9b/Cargo.toml
  8. 92 0
      day_9b/src/main.rs

+ 1 - 0
day_9a/.gitignore

@@ -0,0 +1 @@
+target

+ 32 - 0
day_9a/Cargo.lock

@@ -0,0 +1,32 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "day_9a"
+version = "0.1.0"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]

+ 9 - 0
day_9a/Cargo.toml

@@ -0,0 +1,9 @@
+[package]
+name = "day_9a"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+nom = "7"

+ 90 - 0
day_9a/src/main.rs

@@ -0,0 +1,90 @@
+use std::fs;
+use std::env;
+
+use nom::IResult;
+use nom::multi::many1;
+use nom::character::complete::i64;
+use nom::sequence::terminated;
+use nom::character::complete::space0;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Node {
+    name: String,
+    left_child_name: String,
+    right_child_name: String,
+    left_child_offset: usize,
+    right_child_offset: usize,
+}
+
+fn are_all_same(numbers: &Vec<i64>) -> bool {
+    if numbers.is_empty() {
+        return true;
+    }
+
+    let first = numbers[0];
+
+    for number in numbers {
+        if *number != first {
+            return false;
+        }
+    }
+
+    true
+}
+
+fn calc_derivative(numbers: &Vec<i64>) -> Vec<i64> {
+    if numbers.len() < 2 {
+        return Vec::new();
+    }
+
+    let mut derivative = Vec::new();
+    for i in 1..numbers.len() {
+        derivative.push(numbers[i] - numbers[i-1]);
+    }
+    derivative
+}
+
+fn parse_numbers(input: &str) -> IResult<&str, Vec<i64>> {
+    many1(terminated(i64, space0))(input)
+}
+
+fn parse_line(input: &str) -> Result<Vec<i64>, String> {
+    match parse_numbers(input) {
+        Ok((rest, data)) => if rest == "" {
+            Ok(data)
+        } else {
+            Err(format!("Incomplete parse, remaining: {}", rest))
+        },
+        Err(error) => Err(error.to_string()),
+    }
+
+}
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+    let file_path = &args[1];
+    let input_data = fs::read_to_string(file_path).unwrap_or_else(
+        |_|{panic!("Can't read file {}", file_path)});
+
+    let mut result:i64 = 0;
+
+
+    for line in input_data.lines() {
+        let numbers = parse_line(line).unwrap_or_else(
+            |e|panic!("Failed to parse line: {}", e));
+        let mut derivatives:Vec<Vec<i64>> = Vec::new();
+        derivatives.push(numbers);
+        loop {
+            if are_all_same(derivatives.last().unwrap()) {
+                break;
+            }
+            derivatives.push(calc_derivative(derivatives.last().unwrap()));
+        }
+
+        for d in derivatives {
+            result += *d.last().unwrap();
+        }
+    }
+
+    println!("{result}");
+}

+ 1 - 0
day_9b/.gitignore

@@ -0,0 +1 @@
+target

+ 32 - 0
day_9b/Cargo.lock

@@ -0,0 +1,32 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "day_9b"
+version = "0.1.0"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]

+ 9 - 0
day_9b/Cargo.toml

@@ -0,0 +1,9 @@
+[package]
+name = "day_9b"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+nom = "7"

+ 92 - 0
day_9b/src/main.rs

@@ -0,0 +1,92 @@
+use std::fs;
+use std::env;
+
+use nom::IResult;
+use nom::multi::many1;
+use nom::character::complete::i64;
+use nom::sequence::terminated;
+use nom::character::complete::space0;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Node {
+    name: String,
+    left_child_name: String,
+    right_child_name: String,
+    left_child_offset: usize,
+    right_child_offset: usize,
+}
+
+fn are_all_same(numbers: &Vec<i64>) -> bool {
+    if numbers.is_empty() {
+        return true;
+    }
+
+    let first = numbers[0];
+
+    for number in numbers {
+        if *number != first {
+            return false;
+        }
+    }
+
+    true
+}
+
+fn calc_derivative(numbers: &Vec<i64>) -> Vec<i64> {
+    if numbers.len() < 2 {
+        return Vec::new();
+    }
+
+    let mut derivative = Vec::new();
+    for i in 1..numbers.len() {
+        derivative.push(numbers[i] - numbers[i-1]);
+    }
+    derivative
+}
+
+fn parse_numbers(input: &str) -> IResult<&str, Vec<i64>> {
+    many1(terminated(i64, space0))(input)
+}
+
+fn parse_line(input: &str) -> Result<Vec<i64>, String> {
+    match parse_numbers(input) {
+        Ok((rest, data)) => if rest == "" {
+            Ok(data)
+        } else {
+            Err(format!("Incomplete parse, remaining: {}", rest))
+        },
+        Err(error) => Err(error.to_string()),
+    }
+
+}
+
+fn main() {
+    let args: Vec<String> = env::args().collect();
+    let file_path = &args[1];
+    let input_data = fs::read_to_string(file_path).unwrap_or_else(
+        |_|{panic!("Can't read file {}", file_path)});
+
+    let mut result:i64 = 0;
+
+
+    for line in input_data.lines() {
+        let numbers = parse_line(line).unwrap_or_else(
+            |e|panic!("Failed to parse line: {}", e));
+        let mut derivatives:Vec<Vec<i64>> = Vec::new();
+        derivatives.push(numbers);
+        loop {
+            if are_all_same(derivatives.last().unwrap()) {
+                break;
+            }
+            derivatives.push(calc_derivative(derivatives.last().unwrap()));
+        }
+
+        let mut r = *derivatives.last().unwrap().first().unwrap();
+        for i in (0..derivatives.len()-1).rev() {
+            r = *derivatives[i].first().unwrap() - r;
+        }
+        result += r;
+    }
+
+    println!("{result}");
+}