Procházet zdrojové kódy

Solved day 2 and day 3

Alexey Dorokhov před 2 roky
rodič
revize
6d62265768

+ 1 - 0
day_2a/.gitignore

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

+ 32 - 0
day_2a/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_2a"
+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_2a/Cargo.toml

@@ -0,0 +1,9 @@
+[package]
+name = "day_2a"
+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"

+ 5 - 0
day_2a/example.txt

@@ -0,0 +1,5 @@
+Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
+Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
+Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
+Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
+Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green

+ 100 - 0
day_2a/input.txt

@@ -0,0 +1,100 @@
+Game 1: 1 blue, 8 green; 14 green, 15 blue; 3 green, 9 blue; 8 green, 8 blue, 1 red; 1 red, 9 green, 10 blue
+Game 2: 3 blue, 1 green, 2 red; 2 red, 2 green, 5 blue; 3 green, 10 blue; 8 red, 1 blue; 3 red, 1 green, 5 blue; 1 blue, 5 red, 3 green
+Game 3: 4 green, 1 blue; 6 blue, 5 green, 1 red; 11 green, 10 blue
+Game 4: 12 blue, 12 green, 3 red; 15 blue, 1 green, 10 red; 8 blue, 3 red, 2 green; 14 red, 8 blue
+Game 5: 7 blue, 8 red, 5 green; 15 blue, 16 red, 14 green; 3 blue, 14 red, 10 green
+Game 6: 4 blue, 13 red; 1 green, 13 blue, 11 red; 4 red, 19 blue; 18 blue, 10 red, 1 green
+Game 7: 8 green, 3 blue, 3 red; 2 red, 7 green, 10 blue; 6 green, 11 red, 3 blue
+Game 8: 10 red, 6 green, 1 blue; 15 green, 10 red, 3 blue; 8 red, 10 green, 5 blue
+Game 9: 2 green, 8 blue, 1 red; 6 blue, 10 red; 13 blue, 12 red, 7 green
+Game 10: 2 blue, 8 red, 10 green; 1 green, 2 blue; 1 red, 1 green; 7 red, 2 blue, 1 green
+Game 11: 8 green, 1 blue; 6 green; 2 green, 1 blue; 2 blue, 11 green; 1 red, 12 green
+Game 12: 3 red, 2 green, 15 blue; 1 blue, 1 green, 4 red; 1 green, 12 blue, 3 red; 1 red, 10 blue; 3 red, 2 green, 14 blue; 3 red, 13 blue
+Game 13: 7 blue, 5 red; 7 red, 3 green, 9 blue; 9 green, 7 blue, 7 red; 6 blue, 8 red; 11 red; 3 green, 7 blue, 8 red
+Game 14: 4 blue, 6 green, 7 red; 8 red, 4 green, 11 blue; 3 green, 9 red, 13 blue
+Game 15: 3 green, 1 blue, 5 red; 2 red; 1 red, 4 green
+Game 16: 1 green, 7 blue; 3 red, 5 blue; 1 green, 5 blue; 5 blue, 1 green; 1 green, 1 red, 13 blue
+Game 17: 4 blue, 2 red, 4 green; 1 blue, 7 red, 4 green; 4 red, 4 green, 10 blue; 1 blue, 4 red, 14 green
+Game 18: 7 blue, 5 green; 4 blue, 3 green; 1 red, 6 green, 7 blue
+Game 19: 10 blue, 3 red, 6 green; 3 blue, 4 red, 17 green; 19 green, 3 red, 3 blue; 19 green, 3 blue; 4 red, 7 green, 7 blue; 10 blue, 13 green, 1 red
+Game 20: 3 blue, 6 red, 1 green; 6 green, 7 red, 18 blue; 1 green, 5 red, 14 blue; 1 green, 12 blue, 8 red
+Game 21: 16 blue, 7 green, 13 red; 11 red, 7 blue, 5 green; 4 green, 3 blue
+Game 22: 14 blue, 6 red, 1 green; 9 red, 1 green, 11 blue; 3 red, 13 blue; 6 red, 10 blue; 13 red, 1 green, 2 blue
+Game 23: 17 red, 1 blue, 13 green; 19 green, 1 blue, 3 red; 7 red, 19 green; 16 red, 10 green; 16 red, 12 green, 1 blue
+Game 24: 1 green, 2 blue; 10 green, 4 blue; 8 blue, 11 green, 14 red
+Game 25: 9 blue, 10 red; 2 red, 7 green, 5 blue; 4 green, 10 red, 5 blue; 6 red, 6 blue; 12 blue, 4 green
+Game 26: 9 red, 2 blue, 5 green; 3 red, 4 green, 1 blue; 5 red, 2 blue, 13 green
+Game 27: 1 green, 14 blue, 2 red; 9 red, 7 blue, 7 green; 9 blue, 10 red, 7 green; 1 blue, 5 red, 3 green; 1 blue, 4 red; 9 red, 1 green
+Game 28: 11 red, 13 blue, 12 green; 8 blue, 4 green, 6 red; 2 blue, 9 green
+Game 29: 5 green, 16 red, 1 blue; 6 blue, 3 green, 2 red; 1 green, 7 blue, 9 red
+Game 30: 1 green, 2 blue, 2 red; 7 blue, 5 red; 2 red, 1 blue; 6 red, 1 green, 6 blue
+Game 31: 5 green, 7 blue, 14 red; 19 red, 9 green, 9 blue; 4 green, 8 red, 12 blue; 20 red, 12 green; 10 red, 3 green, 6 blue; 5 blue, 17 red, 8 green
+Game 32: 6 blue, 6 red, 8 green; 6 blue, 3 green, 7 red; 4 red, 6 green, 4 blue; 5 green, 3 blue, 5 red; 8 blue, 6 red, 5 green
+Game 33: 5 red, 15 green, 3 blue; 4 green, 8 red; 6 blue, 17 green, 2 red
+Game 34: 12 blue, 1 green; 3 red, 14 blue, 1 green; 1 green, 16 blue, 3 red
+Game 35: 2 red, 16 blue; 17 blue, 5 green; 10 blue, 3 green; 1 blue, 2 green; 4 blue, 4 green
+Game 36: 7 blue, 8 red, 4 green; 3 red, 13 green, 14 blue; 17 green, 2 blue, 8 red; 2 red, 13 blue, 2 green; 12 blue, 1 red, 9 green; 12 green, 10 blue
+Game 37: 5 green; 3 green, 14 red; 2 red, 1 blue; 11 green, 1 blue; 8 green, 18 red, 1 blue; 1 blue, 16 red
+Game 38: 5 red; 9 green, 11 blue, 7 red; 2 blue, 2 green, 1 red; 3 blue, 7 red; 5 red, 8 blue
+Game 39: 1 blue, 7 green, 6 red; 18 green, 2 red; 1 blue, 19 green, 6 red; 2 green, 3 blue, 9 red; 14 green, 4 red, 3 blue; 16 green, 4 red, 1 blue
+Game 40: 14 red, 2 green, 2 blue; 2 blue, 2 red, 4 green; 8 red, 2 blue; 1 green, 17 red; 10 red; 2 green, 3 red
+Game 41: 11 green, 1 red, 1 blue; 2 blue, 18 green, 3 red; 2 blue, 2 green, 8 red; 7 red, 1 blue, 17 green; 14 green, 2 blue; 2 blue, 14 red, 18 green
+Game 42: 2 red, 3 green, 15 blue; 3 green, 18 blue; 9 blue, 2 red
+Game 43: 4 green, 2 blue; 10 blue, 2 red, 14 green; 13 green, 1 red, 11 blue; 9 green, 10 blue; 14 green, 8 red, 8 blue
+Game 44: 10 red; 3 red, 8 blue, 1 green; 10 red, 2 blue, 1 green; 5 green, 7 blue, 17 red; 3 green, 18 red, 6 blue; 3 green, 11 blue, 3 red
+Game 45: 10 blue, 5 green; 14 blue, 5 green; 10 green, 14 blue, 1 red; 1 red, 5 green, 18 blue; 5 green, 5 blue, 1 red; 17 blue, 12 green, 1 red
+Game 46: 2 blue, 2 green; 1 green, 1 blue; 2 blue, 3 green; 1 red; 2 green
+Game 47: 6 blue, 1 red, 12 green; 2 red, 3 green, 4 blue; 1 blue, 13 green, 6 red; 12 green, 4 blue, 5 red
+Game 48: 4 green, 5 red; 19 green, 1 blue, 11 red; 4 red, 8 green; 10 red, 1 blue, 16 green
+Game 49: 12 red, 2 blue; 6 green; 1 green, 9 red
+Game 50: 1 green, 1 blue, 17 red; 1 blue, 14 red, 1 green; 2 blue, 6 red
+Game 51: 12 green, 9 blue, 1 red; 6 green, 2 blue, 1 red; 14 green, 5 blue; 1 green, 2 red, 12 blue; 4 green, 2 red, 8 blue; 1 green, 5 blue
+Game 52: 1 green, 7 blue, 3 red; 6 blue, 5 red, 5 green; 7 green; 5 blue, 1 green, 6 red
+Game 53: 3 blue, 1 red; 1 blue, 3 green; 2 green, 5 blue; 4 blue, 3 green; 1 green; 2 green, 5 blue, 1 red
+Game 54: 13 blue, 3 red; 17 blue, 1 green, 8 red; 2 green, 2 red, 11 blue; 2 green, 1 red, 4 blue; 8 red
+Game 55: 1 green; 3 blue, 5 red; 1 blue, 1 green, 4 red; 1 red, 10 blue; 4 red, 17 blue
+Game 56: 4 blue, 12 green, 12 red; 6 green, 10 blue, 2 red; 8 green, 11 red, 3 blue; 6 green, 10 red, 10 blue; 7 red, 5 green
+Game 57: 2 green, 8 blue, 3 red; 17 blue, 1 green, 9 red; 4 red, 7 blue
+Game 58: 4 blue, 1 red; 2 blue, 1 green; 2 red, 5 green, 4 blue; 7 green, 5 blue, 2 red
+Game 59: 4 green, 5 red; 4 green, 7 red, 1 blue; 15 red, 8 green
+Game 60: 6 green, 3 red; 4 red, 6 green, 4 blue; 5 green, 4 blue, 1 red; 3 red, 4 blue, 2 green; 7 red, 3 blue; 1 green, 1 blue
+Game 61: 7 red, 10 blue, 7 green; 11 blue, 9 green, 1 red; 11 red, 1 green, 3 blue; 3 green, 13 red, 2 blue; 7 green, 2 blue, 1 red
+Game 62: 10 green, 9 red; 6 blue, 10 red, 11 green; 7 red, 2 blue, 2 green
+Game 63: 10 green, 2 blue; 1 red; 9 green; 2 blue, 8 green; 1 blue, 1 green, 1 red
+Game 64: 2 green; 8 red; 4 green, 5 red, 2 blue
+Game 65: 2 red, 16 blue; 5 green, 11 blue, 3 red; 15 blue, 4 green, 3 red
+Game 66: 2 green, 3 blue; 1 red, 3 blue; 1 green, 4 blue; 1 blue, 2 green, 1 red; 2 blue; 1 red, 3 green, 5 blue
+Game 67: 2 blue, 11 red, 8 green; 13 blue, 19 red, 13 green; 3 red, 3 green, 3 blue; 2 red, 5 blue, 16 green; 13 red, 4 blue, 5 green
+Game 68: 1 blue, 9 red, 7 green; 3 green, 9 red, 4 blue; 7 green, 5 blue; 3 green, 9 red, 3 blue; 5 red, 1 blue, 8 green; 8 green, 1 blue, 4 red
+Game 69: 10 green, 1 red, 2 blue; 1 red, 11 green; 1 blue, 1 green; 8 green; 11 green, 1 red; 1 green, 3 blue
+Game 70: 8 red, 15 blue, 18 green; 14 blue, 9 red, 8 green; 6 blue, 2 red, 2 green; 1 green, 4 blue, 9 red; 3 blue, 15 green, 10 red
+Game 71: 10 red, 10 green, 6 blue; 3 green, 6 blue, 13 red; 7 green, 6 red, 12 blue
+Game 72: 12 red, 5 blue; 13 red, 6 green, 11 blue; 11 green, 7 red, 11 blue
+Game 73: 8 blue, 1 red, 3 green; 1 blue; 6 blue, 4 green
+Game 74: 1 red, 3 blue, 8 green; 6 green, 3 blue, 1 red; 18 green, 1 red; 3 blue, 1 red, 14 green; 5 green, 1 blue; 3 blue, 1 green
+Game 75: 4 blue, 1 red, 3 green; 6 blue; 11 green, 6 blue, 3 red; 10 green, 4 red; 2 blue, 2 red, 6 green
+Game 76: 7 blue; 15 blue, 2 red, 1 green; 2 blue, 5 red; 2 red, 15 blue; 4 red, 15 blue; 9 blue, 5 red
+Game 77: 12 blue, 8 green, 15 red; 12 blue, 19 red, 16 green; 6 blue, 5 green, 16 red
+Game 78: 2 red, 7 blue, 14 green; 1 red, 3 green, 1 blue; 4 blue, 8 green, 10 red
+Game 79: 3 red, 5 green; 2 blue, 1 red, 18 green; 4 red, 15 green, 2 blue; 18 green, 2 blue, 7 red; 7 green, 6 red
+Game 80: 8 green, 5 red, 9 blue; 14 blue, 13 red, 6 green; 14 blue, 7 red, 4 green; 3 blue, 16 red, 4 green; 5 green, 13 blue, 2 red; 16 blue, 2 green, 5 red
+Game 81: 10 green, 10 red, 4 blue; 13 red, 2 blue; 8 green, 10 red, 7 blue
+Game 82: 1 blue, 4 red, 7 green; 3 green, 2 blue, 3 red; 1 blue, 3 red, 3 green; 6 red, 4 green, 5 blue; 3 blue, 6 green
+Game 83: 3 red, 1 blue, 2 green; 6 blue, 2 green, 2 red; 6 green, 1 blue; 11 blue, 4 red, 10 green
+Game 84: 9 red, 12 green, 1 blue; 7 red, 5 green, 3 blue; 3 green, 8 blue, 11 red; 1 red, 3 blue, 10 green
+Game 85: 2 blue, 2 red; 3 blue, 3 red; 2 green, 2 red; 2 red, 4 green
+Game 86: 2 green, 5 blue, 9 red; 4 red, 2 green, 5 blue; 6 red, 2 green, 6 blue; 4 red, 4 blue, 1 green
+Game 87: 17 red, 3 blue, 2 green; 5 red, 1 green, 5 blue; 4 blue, 3 green, 7 red
+Game 88: 7 green, 1 blue, 1 red; 1 blue, 1 red, 10 green; 1 blue, 2 green; 5 green; 7 green, 1 blue; 1 red, 3 green
+Game 89: 6 red, 11 blue, 3 green; 3 blue, 4 green, 3 red; 4 blue, 17 red, 4 green; 17 blue, 3 green, 4 red; 3 red, 9 blue, 4 green; 6 red, 9 blue, 9 green
+Game 90: 9 red, 4 green, 1 blue; 6 green, 5 red, 11 blue; 3 blue, 8 red
+Game 91: 3 red, 7 blue, 1 green; 11 blue, 3 green, 4 red; 1 red, 8 blue, 3 green; 10 red, 4 blue, 3 green
+Game 92: 2 blue, 1 red; 7 red, 1 blue; 4 green, 11 red, 5 blue
+Game 93: 13 red, 11 green, 10 blue; 3 blue, 10 green; 3 blue, 7 red, 3 green
+Game 94: 9 green, 8 blue, 4 red; 7 blue, 9 green, 5 red; 16 green, 5 red; 4 blue
+Game 95: 9 green; 1 blue, 16 green; 2 green, 2 red; 1 green, 1 blue; 6 green; 7 green, 2 red
+Game 96: 6 green, 8 red, 5 blue; 2 blue, 14 green, 17 red; 2 blue, 15 green, 16 red; 16 green, 1 red; 16 red, 2 green, 1 blue; 18 red, 13 green, 6 blue
+Game 97: 9 green, 8 red, 11 blue; 11 green, 13 red, 4 blue; 7 blue, 1 green, 6 red; 1 blue, 12 red, 7 green
+Game 98: 1 green, 12 blue, 4 red; 8 blue, 5 red, 1 green; 1 green, 8 blue, 7 red; 1 green, 5 red, 6 blue; 3 blue, 1 green, 1 red; 4 blue, 1 green, 4 red
+Game 99: 1 blue, 2 green, 2 red; 2 red, 8 green; 14 green, 1 blue; 1 red, 2 green; 1 blue, 1 green, 2 red; 6 green, 2 red
+Game 100: 6 green, 15 red, 12 blue; 9 red; 16 red; 17 red, 3 blue, 7 green

+ 154 - 0
day_2a/src/main.rs

@@ -0,0 +1,154 @@
+use std::fs;
+use std::env;
+
+use nom::IResult;
+use nom::multi::separated_list0;
+use nom::branch::alt;
+use nom::bytes::complete::tag;
+use nom::character::complete::i32;
+use nom::character::complete::space1;
+use nom::character::complete::space0;
+use nom::combinator::value;
+use nom::sequence::tuple;
+use nom::sequence::preceded;
+use nom::sequence::separated_pair;
+use nom::sequence::terminated;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+enum Color {
+    Red,
+    Green,
+    Blue,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Draw {
+    red_count: i32,
+    green_count: i32,
+    blue_count: i32,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Game {
+    id: i32,
+    draws: Vec<Draw>,
+}
+
+fn parse_color(input: &str) -> IResult<&str, Color> {
+    alt((
+        value(Color::Red, tag("red")),
+        value(Color::Green, tag("green")),
+        value(Color::Blue, tag("blue")),
+    ))(input)
+}
+
+fn parse_game_id(input: &str) -> IResult<&str, i32> {
+    terminated(
+        preceded(
+            tuple((space0, tag("Game"),space1)),
+            i32,
+        ),
+        space0,
+    )(input)
+}
+
+fn parse_number_of_cubes(input: &str) -> IResult<&str, (i32, Color)> {
+    preceded(
+        space0,
+        separated_pair(
+            i32,
+            space1,
+            parse_color,
+        )
+    )(input)
+}
+
+fn parse_draw(input: &str) -> IResult<&str, Vec<(i32, Color)>> {
+    separated_list0(
+        tag(","),
+        parse_number_of_cubes
+    )(input)
+}
+
+fn parse_game_draws(input: &str) -> IResult<&str, Vec<Vec<(i32, Color)>>> {
+    separated_list0(
+        tag(";"),
+        parse_draw
+    )(input)
+}
+
+fn parse_input_line(input: &str) -> IResult<&str, (i32, Vec<Vec<(i32, Color)>>)> {
+    separated_pair(
+        parse_game_id,
+        tag(":"),
+        parse_game_draws,
+    )(input)
+}
+
+fn create_game_from_data(data: (i32, Vec<Vec<(i32, Color)>>)) -> Game {
+    let (id, draws_data) = data;
+    let mut draws: Vec<Draw> = Vec::new();
+    for draw_data in draws_data {
+        let mut draw = Draw{
+            red_count: 0,
+            green_count: 0,
+            blue_count: 0,
+        };
+
+        for color_count in draw_data {
+            let (count, color) = color_count;
+            match color {
+                Color::Red => draw.red_count += count,
+                Color::Green => draw.green_count += count,
+                Color::Blue => draw.blue_count += count,
+            }
+        }
+        draws.push(draw);
+    }
+    Game{
+        id,
+        draws,
+    }
+}
+
+fn parse_game(input: &str) -> Result<Game, String> {
+    match parse_input_line(input) {
+        Ok((rest, data)) => if rest == "" {
+            Ok(create_game_from_data(data))
+        } else {
+            Err(format!("Incomplete parse, remaining: {}", rest))
+        },
+        Err(error) => Err(error.to_string()),
+    }
+}
+
+fn main() {
+    let max_red = 12;
+    let max_green = 13;
+    let max_blue = 14;
+
+    let mut result = 0;
+
+    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)});
+    for line in input_data.lines() {
+        let game = parse_game(line).unwrap_or_else(|e|panic!("Failed to parse line: {}", e));
+        let mut is_valid_game = true;
+        for draw in &game.draws {
+            if draw.red_count > max_red ||
+               draw.green_count > max_green ||
+               draw.blue_count > max_blue {
+                is_valid_game = false;
+                break;
+            }
+        }
+
+        if is_valid_game {
+            result += game.id;
+        }
+    }
+
+    println!("{}", result);
+}

+ 1 - 0
day_2b/.gitignore

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

+ 32 - 0
day_2b/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_2b"
+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_2b/Cargo.toml

@@ -0,0 +1,9 @@
+[package]
+name = "day_2b"
+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"

+ 5 - 0
day_2b/example.txt

@@ -0,0 +1,5 @@
+Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
+Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
+Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
+Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
+Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green

+ 100 - 0
day_2b/input.txt

@@ -0,0 +1,100 @@
+Game 1: 1 blue, 8 green; 14 green, 15 blue; 3 green, 9 blue; 8 green, 8 blue, 1 red; 1 red, 9 green, 10 blue
+Game 2: 3 blue, 1 green, 2 red; 2 red, 2 green, 5 blue; 3 green, 10 blue; 8 red, 1 blue; 3 red, 1 green, 5 blue; 1 blue, 5 red, 3 green
+Game 3: 4 green, 1 blue; 6 blue, 5 green, 1 red; 11 green, 10 blue
+Game 4: 12 blue, 12 green, 3 red; 15 blue, 1 green, 10 red; 8 blue, 3 red, 2 green; 14 red, 8 blue
+Game 5: 7 blue, 8 red, 5 green; 15 blue, 16 red, 14 green; 3 blue, 14 red, 10 green
+Game 6: 4 blue, 13 red; 1 green, 13 blue, 11 red; 4 red, 19 blue; 18 blue, 10 red, 1 green
+Game 7: 8 green, 3 blue, 3 red; 2 red, 7 green, 10 blue; 6 green, 11 red, 3 blue
+Game 8: 10 red, 6 green, 1 blue; 15 green, 10 red, 3 blue; 8 red, 10 green, 5 blue
+Game 9: 2 green, 8 blue, 1 red; 6 blue, 10 red; 13 blue, 12 red, 7 green
+Game 10: 2 blue, 8 red, 10 green; 1 green, 2 blue; 1 red, 1 green; 7 red, 2 blue, 1 green
+Game 11: 8 green, 1 blue; 6 green; 2 green, 1 blue; 2 blue, 11 green; 1 red, 12 green
+Game 12: 3 red, 2 green, 15 blue; 1 blue, 1 green, 4 red; 1 green, 12 blue, 3 red; 1 red, 10 blue; 3 red, 2 green, 14 blue; 3 red, 13 blue
+Game 13: 7 blue, 5 red; 7 red, 3 green, 9 blue; 9 green, 7 blue, 7 red; 6 blue, 8 red; 11 red; 3 green, 7 blue, 8 red
+Game 14: 4 blue, 6 green, 7 red; 8 red, 4 green, 11 blue; 3 green, 9 red, 13 blue
+Game 15: 3 green, 1 blue, 5 red; 2 red; 1 red, 4 green
+Game 16: 1 green, 7 blue; 3 red, 5 blue; 1 green, 5 blue; 5 blue, 1 green; 1 green, 1 red, 13 blue
+Game 17: 4 blue, 2 red, 4 green; 1 blue, 7 red, 4 green; 4 red, 4 green, 10 blue; 1 blue, 4 red, 14 green
+Game 18: 7 blue, 5 green; 4 blue, 3 green; 1 red, 6 green, 7 blue
+Game 19: 10 blue, 3 red, 6 green; 3 blue, 4 red, 17 green; 19 green, 3 red, 3 blue; 19 green, 3 blue; 4 red, 7 green, 7 blue; 10 blue, 13 green, 1 red
+Game 20: 3 blue, 6 red, 1 green; 6 green, 7 red, 18 blue; 1 green, 5 red, 14 blue; 1 green, 12 blue, 8 red
+Game 21: 16 blue, 7 green, 13 red; 11 red, 7 blue, 5 green; 4 green, 3 blue
+Game 22: 14 blue, 6 red, 1 green; 9 red, 1 green, 11 blue; 3 red, 13 blue; 6 red, 10 blue; 13 red, 1 green, 2 blue
+Game 23: 17 red, 1 blue, 13 green; 19 green, 1 blue, 3 red; 7 red, 19 green; 16 red, 10 green; 16 red, 12 green, 1 blue
+Game 24: 1 green, 2 blue; 10 green, 4 blue; 8 blue, 11 green, 14 red
+Game 25: 9 blue, 10 red; 2 red, 7 green, 5 blue; 4 green, 10 red, 5 blue; 6 red, 6 blue; 12 blue, 4 green
+Game 26: 9 red, 2 blue, 5 green; 3 red, 4 green, 1 blue; 5 red, 2 blue, 13 green
+Game 27: 1 green, 14 blue, 2 red; 9 red, 7 blue, 7 green; 9 blue, 10 red, 7 green; 1 blue, 5 red, 3 green; 1 blue, 4 red; 9 red, 1 green
+Game 28: 11 red, 13 blue, 12 green; 8 blue, 4 green, 6 red; 2 blue, 9 green
+Game 29: 5 green, 16 red, 1 blue; 6 blue, 3 green, 2 red; 1 green, 7 blue, 9 red
+Game 30: 1 green, 2 blue, 2 red; 7 blue, 5 red; 2 red, 1 blue; 6 red, 1 green, 6 blue
+Game 31: 5 green, 7 blue, 14 red; 19 red, 9 green, 9 blue; 4 green, 8 red, 12 blue; 20 red, 12 green; 10 red, 3 green, 6 blue; 5 blue, 17 red, 8 green
+Game 32: 6 blue, 6 red, 8 green; 6 blue, 3 green, 7 red; 4 red, 6 green, 4 blue; 5 green, 3 blue, 5 red; 8 blue, 6 red, 5 green
+Game 33: 5 red, 15 green, 3 blue; 4 green, 8 red; 6 blue, 17 green, 2 red
+Game 34: 12 blue, 1 green; 3 red, 14 blue, 1 green; 1 green, 16 blue, 3 red
+Game 35: 2 red, 16 blue; 17 blue, 5 green; 10 blue, 3 green; 1 blue, 2 green; 4 blue, 4 green
+Game 36: 7 blue, 8 red, 4 green; 3 red, 13 green, 14 blue; 17 green, 2 blue, 8 red; 2 red, 13 blue, 2 green; 12 blue, 1 red, 9 green; 12 green, 10 blue
+Game 37: 5 green; 3 green, 14 red; 2 red, 1 blue; 11 green, 1 blue; 8 green, 18 red, 1 blue; 1 blue, 16 red
+Game 38: 5 red; 9 green, 11 blue, 7 red; 2 blue, 2 green, 1 red; 3 blue, 7 red; 5 red, 8 blue
+Game 39: 1 blue, 7 green, 6 red; 18 green, 2 red; 1 blue, 19 green, 6 red; 2 green, 3 blue, 9 red; 14 green, 4 red, 3 blue; 16 green, 4 red, 1 blue
+Game 40: 14 red, 2 green, 2 blue; 2 blue, 2 red, 4 green; 8 red, 2 blue; 1 green, 17 red; 10 red; 2 green, 3 red
+Game 41: 11 green, 1 red, 1 blue; 2 blue, 18 green, 3 red; 2 blue, 2 green, 8 red; 7 red, 1 blue, 17 green; 14 green, 2 blue; 2 blue, 14 red, 18 green
+Game 42: 2 red, 3 green, 15 blue; 3 green, 18 blue; 9 blue, 2 red
+Game 43: 4 green, 2 blue; 10 blue, 2 red, 14 green; 13 green, 1 red, 11 blue; 9 green, 10 blue; 14 green, 8 red, 8 blue
+Game 44: 10 red; 3 red, 8 blue, 1 green; 10 red, 2 blue, 1 green; 5 green, 7 blue, 17 red; 3 green, 18 red, 6 blue; 3 green, 11 blue, 3 red
+Game 45: 10 blue, 5 green; 14 blue, 5 green; 10 green, 14 blue, 1 red; 1 red, 5 green, 18 blue; 5 green, 5 blue, 1 red; 17 blue, 12 green, 1 red
+Game 46: 2 blue, 2 green; 1 green, 1 blue; 2 blue, 3 green; 1 red; 2 green
+Game 47: 6 blue, 1 red, 12 green; 2 red, 3 green, 4 blue; 1 blue, 13 green, 6 red; 12 green, 4 blue, 5 red
+Game 48: 4 green, 5 red; 19 green, 1 blue, 11 red; 4 red, 8 green; 10 red, 1 blue, 16 green
+Game 49: 12 red, 2 blue; 6 green; 1 green, 9 red
+Game 50: 1 green, 1 blue, 17 red; 1 blue, 14 red, 1 green; 2 blue, 6 red
+Game 51: 12 green, 9 blue, 1 red; 6 green, 2 blue, 1 red; 14 green, 5 blue; 1 green, 2 red, 12 blue; 4 green, 2 red, 8 blue; 1 green, 5 blue
+Game 52: 1 green, 7 blue, 3 red; 6 blue, 5 red, 5 green; 7 green; 5 blue, 1 green, 6 red
+Game 53: 3 blue, 1 red; 1 blue, 3 green; 2 green, 5 blue; 4 blue, 3 green; 1 green; 2 green, 5 blue, 1 red
+Game 54: 13 blue, 3 red; 17 blue, 1 green, 8 red; 2 green, 2 red, 11 blue; 2 green, 1 red, 4 blue; 8 red
+Game 55: 1 green; 3 blue, 5 red; 1 blue, 1 green, 4 red; 1 red, 10 blue; 4 red, 17 blue
+Game 56: 4 blue, 12 green, 12 red; 6 green, 10 blue, 2 red; 8 green, 11 red, 3 blue; 6 green, 10 red, 10 blue; 7 red, 5 green
+Game 57: 2 green, 8 blue, 3 red; 17 blue, 1 green, 9 red; 4 red, 7 blue
+Game 58: 4 blue, 1 red; 2 blue, 1 green; 2 red, 5 green, 4 blue; 7 green, 5 blue, 2 red
+Game 59: 4 green, 5 red; 4 green, 7 red, 1 blue; 15 red, 8 green
+Game 60: 6 green, 3 red; 4 red, 6 green, 4 blue; 5 green, 4 blue, 1 red; 3 red, 4 blue, 2 green; 7 red, 3 blue; 1 green, 1 blue
+Game 61: 7 red, 10 blue, 7 green; 11 blue, 9 green, 1 red; 11 red, 1 green, 3 blue; 3 green, 13 red, 2 blue; 7 green, 2 blue, 1 red
+Game 62: 10 green, 9 red; 6 blue, 10 red, 11 green; 7 red, 2 blue, 2 green
+Game 63: 10 green, 2 blue; 1 red; 9 green; 2 blue, 8 green; 1 blue, 1 green, 1 red
+Game 64: 2 green; 8 red; 4 green, 5 red, 2 blue
+Game 65: 2 red, 16 blue; 5 green, 11 blue, 3 red; 15 blue, 4 green, 3 red
+Game 66: 2 green, 3 blue; 1 red, 3 blue; 1 green, 4 blue; 1 blue, 2 green, 1 red; 2 blue; 1 red, 3 green, 5 blue
+Game 67: 2 blue, 11 red, 8 green; 13 blue, 19 red, 13 green; 3 red, 3 green, 3 blue; 2 red, 5 blue, 16 green; 13 red, 4 blue, 5 green
+Game 68: 1 blue, 9 red, 7 green; 3 green, 9 red, 4 blue; 7 green, 5 blue; 3 green, 9 red, 3 blue; 5 red, 1 blue, 8 green; 8 green, 1 blue, 4 red
+Game 69: 10 green, 1 red, 2 blue; 1 red, 11 green; 1 blue, 1 green; 8 green; 11 green, 1 red; 1 green, 3 blue
+Game 70: 8 red, 15 blue, 18 green; 14 blue, 9 red, 8 green; 6 blue, 2 red, 2 green; 1 green, 4 blue, 9 red; 3 blue, 15 green, 10 red
+Game 71: 10 red, 10 green, 6 blue; 3 green, 6 blue, 13 red; 7 green, 6 red, 12 blue
+Game 72: 12 red, 5 blue; 13 red, 6 green, 11 blue; 11 green, 7 red, 11 blue
+Game 73: 8 blue, 1 red, 3 green; 1 blue; 6 blue, 4 green
+Game 74: 1 red, 3 blue, 8 green; 6 green, 3 blue, 1 red; 18 green, 1 red; 3 blue, 1 red, 14 green; 5 green, 1 blue; 3 blue, 1 green
+Game 75: 4 blue, 1 red, 3 green; 6 blue; 11 green, 6 blue, 3 red; 10 green, 4 red; 2 blue, 2 red, 6 green
+Game 76: 7 blue; 15 blue, 2 red, 1 green; 2 blue, 5 red; 2 red, 15 blue; 4 red, 15 blue; 9 blue, 5 red
+Game 77: 12 blue, 8 green, 15 red; 12 blue, 19 red, 16 green; 6 blue, 5 green, 16 red
+Game 78: 2 red, 7 blue, 14 green; 1 red, 3 green, 1 blue; 4 blue, 8 green, 10 red
+Game 79: 3 red, 5 green; 2 blue, 1 red, 18 green; 4 red, 15 green, 2 blue; 18 green, 2 blue, 7 red; 7 green, 6 red
+Game 80: 8 green, 5 red, 9 blue; 14 blue, 13 red, 6 green; 14 blue, 7 red, 4 green; 3 blue, 16 red, 4 green; 5 green, 13 blue, 2 red; 16 blue, 2 green, 5 red
+Game 81: 10 green, 10 red, 4 blue; 13 red, 2 blue; 8 green, 10 red, 7 blue
+Game 82: 1 blue, 4 red, 7 green; 3 green, 2 blue, 3 red; 1 blue, 3 red, 3 green; 6 red, 4 green, 5 blue; 3 blue, 6 green
+Game 83: 3 red, 1 blue, 2 green; 6 blue, 2 green, 2 red; 6 green, 1 blue; 11 blue, 4 red, 10 green
+Game 84: 9 red, 12 green, 1 blue; 7 red, 5 green, 3 blue; 3 green, 8 blue, 11 red; 1 red, 3 blue, 10 green
+Game 85: 2 blue, 2 red; 3 blue, 3 red; 2 green, 2 red; 2 red, 4 green
+Game 86: 2 green, 5 blue, 9 red; 4 red, 2 green, 5 blue; 6 red, 2 green, 6 blue; 4 red, 4 blue, 1 green
+Game 87: 17 red, 3 blue, 2 green; 5 red, 1 green, 5 blue; 4 blue, 3 green, 7 red
+Game 88: 7 green, 1 blue, 1 red; 1 blue, 1 red, 10 green; 1 blue, 2 green; 5 green; 7 green, 1 blue; 1 red, 3 green
+Game 89: 6 red, 11 blue, 3 green; 3 blue, 4 green, 3 red; 4 blue, 17 red, 4 green; 17 blue, 3 green, 4 red; 3 red, 9 blue, 4 green; 6 red, 9 blue, 9 green
+Game 90: 9 red, 4 green, 1 blue; 6 green, 5 red, 11 blue; 3 blue, 8 red
+Game 91: 3 red, 7 blue, 1 green; 11 blue, 3 green, 4 red; 1 red, 8 blue, 3 green; 10 red, 4 blue, 3 green
+Game 92: 2 blue, 1 red; 7 red, 1 blue; 4 green, 11 red, 5 blue
+Game 93: 13 red, 11 green, 10 blue; 3 blue, 10 green; 3 blue, 7 red, 3 green
+Game 94: 9 green, 8 blue, 4 red; 7 blue, 9 green, 5 red; 16 green, 5 red; 4 blue
+Game 95: 9 green; 1 blue, 16 green; 2 green, 2 red; 1 green, 1 blue; 6 green; 7 green, 2 red
+Game 96: 6 green, 8 red, 5 blue; 2 blue, 14 green, 17 red; 2 blue, 15 green, 16 red; 16 green, 1 red; 16 red, 2 green, 1 blue; 18 red, 13 green, 6 blue
+Game 97: 9 green, 8 red, 11 blue; 11 green, 13 red, 4 blue; 7 blue, 1 green, 6 red; 1 blue, 12 red, 7 green
+Game 98: 1 green, 12 blue, 4 red; 8 blue, 5 red, 1 green; 1 green, 8 blue, 7 red; 1 green, 5 red, 6 blue; 3 blue, 1 green, 1 red; 4 blue, 1 green, 4 red
+Game 99: 1 blue, 2 green, 2 red; 2 red, 8 green; 14 green, 1 blue; 1 red, 2 green; 1 blue, 1 green, 2 red; 6 green, 2 red
+Game 100: 6 green, 15 red, 12 blue; 9 red; 16 red; 17 red, 3 blue, 7 green

+ 152 - 0
day_2b/src/main.rs

@@ -0,0 +1,152 @@
+use std::fs;
+use std::env;
+
+use nom::IResult;
+use nom::multi::separated_list0;
+use nom::branch::alt;
+use nom::bytes::complete::tag;
+use nom::character::complete::i32;
+use nom::character::complete::space1;
+use nom::character::complete::space0;
+use nom::combinator::value;
+use nom::sequence::tuple;
+use nom::sequence::preceded;
+use nom::sequence::separated_pair;
+use nom::sequence::terminated;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+enum Color {
+    Red,
+    Green,
+    Blue,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Draw {
+    red_count: i32,
+    green_count: i32,
+    blue_count: i32,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+struct Game {
+    id: i32,
+    draws: Vec<Draw>,
+}
+
+fn parse_color(input: &str) -> IResult<&str, Color> {
+    alt((
+        value(Color::Red, tag("red")),
+        value(Color::Green, tag("green")),
+        value(Color::Blue, tag("blue")),
+    ))(input)
+}
+
+fn parse_game_id(input: &str) -> IResult<&str, i32> {
+    terminated(
+        preceded(
+            tuple((space0, tag("Game"),space1)),
+            i32,
+        ),
+        space0,
+    )(input)
+}
+
+fn parse_number_of_cubes(input: &str) -> IResult<&str, (i32, Color)> {
+    preceded(
+        space0,
+        separated_pair(
+            i32,
+            space1,
+            parse_color,
+        )
+    )(input)
+}
+
+fn parse_draw(input: &str) -> IResult<&str, Vec<(i32, Color)>> {
+    separated_list0(
+        tag(","),
+        parse_number_of_cubes
+    )(input)
+}
+
+fn parse_game_draws(input: &str) -> IResult<&str, Vec<Vec<(i32, Color)>>> {
+    separated_list0(
+        tag(";"),
+        parse_draw
+    )(input)
+}
+
+fn parse_input_line(input: &str) -> IResult<&str, (i32, Vec<Vec<(i32, Color)>>)> {
+    separated_pair(
+        parse_game_id,
+        tag(":"),
+        parse_game_draws,
+    )(input)
+}
+
+fn create_game_from_data(data: (i32, Vec<Vec<(i32, Color)>>)) -> Game {
+    let (id, draws_data) = data;
+    let mut draws: Vec<Draw> = Vec::new();
+    for draw_data in draws_data {
+        let mut draw = Draw{
+            red_count: 0,
+            green_count: 0,
+            blue_count: 0,
+        };
+
+        for color_count in draw_data {
+            let (count, color) = color_count;
+            match color {
+                Color::Red => draw.red_count += count,
+                Color::Green => draw.green_count += count,
+                Color::Blue => draw.blue_count += count,
+            }
+        }
+        draws.push(draw);
+    }
+    Game{
+        id,
+        draws,
+    }
+}
+
+fn parse_game(input: &str) -> Result<Game, String> {
+    match parse_input_line(input) {
+        Ok((rest, data)) => if rest == "" {
+            Ok(create_game_from_data(data))
+        } else {
+            Err(format!("Incomplete parse, remaining: {}", rest))
+        },
+        Err(error) => Err(error.to_string()),
+    }
+}
+
+fn main() {
+    let mut result = 0;
+
+    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)});
+    for line in input_data.lines() {
+        let game = parse_game(line).unwrap_or_else(|e|panic!("Failed to parse line: {}", e));
+        let mut max_red = 0;
+        let mut max_green = 0;
+        let mut max_blue = 0;
+        for draw in &game.draws {
+            if draw.red_count > max_red {
+                max_red = draw.red_count;
+            }
+            if draw.green_count > max_green {
+                max_green = draw.green_count;
+            }
+            if draw.blue_count > max_blue {
+                max_blue = draw.blue_count;
+            }
+        }
+        result += max_red * max_green * max_blue;
+    }
+
+    println!("{}", result);
+}

+ 1 - 0
day_3a/.gitignore

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

+ 32 - 0
day_3a/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_3a"
+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_3a/Cargo.toml

@@ -0,0 +1,9 @@
+[package]
+name = "day_3a"
+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"

+ 10 - 0
day_3a/example.txt

@@ -0,0 +1,10 @@
+467..114..
+...*......
+..35..633.
+......#...
+617*......
+.....+.58.
+..592.....
+......755.
+...$.*....
+.664.598..

+ 140 - 0
day_3a/input.txt

@@ -0,0 +1,140 @@
+.....489............................152....503.........................180......200.........147.......13.......................239..........
+......*.....186.48....681...732........*..................935.........*.....................*......................512............*..874....
+..806.540......*.........*............249......904...358....*......957..867..863..........857.....264..............@....89=......97..*......
+......................793........................*...=.....142...........*..*....%...................@......+...............36.......547....
+...........=335..............906*634..932........201...157.............423..72..103.798.......732........161...............*................
+..........................*..........*....662.................88....................$..............=........................439.126...269...
+...905&...74.............795...128...872....*....*.....521.........../......806&.........456.....93..869.........168..............*.........
+........../..=662.824.........+............863..47........-.700.....437..........316..........................96.*......348*632....138.$932.
+........-..........*.......................................................465....*.........243......&........*...94..+..........*..........
+..41...532.......511.....-......$........&....216.................................330...715..../...309........415.....388.....873.287.265...
+....*...................338...496.......18......*............48........873................@.............493.................................
+..849.............................136.#......787.........787..$....152..*........187..../.....738......*....................&85..960...749..
+..............395.................*...478...........................*....860.......*...613./.........194........................*.....%.....
+.....+799.........132..188........691..........689/...176..........274........569..840.....8....#........................451...71...........
+..............93..&....*........@........#..................892..............................275.....862*180../.....355..*.............796..
+.......400......*......676.....342.......930...389...925.......*...........580..3......395....................27....*....888..........#.....
+.....%......205..888................60...........=..*.......540........742.*..........*.......858..................589.......679..490.......
+...462..125*....................691..@.221=.........28...................*..31.615..827..............876...................-.........*762...
+.............501............$..=...............*.........&.............842......@.......308................601...........546................
+......428...*.............417.....760....25.....809......119.......................589.../.........610......../..%256...................858.
+......*...623...186................*......*..........895.......................$......#...........@...................337........285........
+....626.#......@.....787.....#...........294./..........*........619..........902........924....................665..*.............*........
+.........406...............10......+..........985...+....944.....*........296................169....@....686......*..............290..767...
+.......................738..........977....*.......873.......665.381..17....%.....246....576..*...861...*.......104.....208..........=......
+.919............#...............973.....320.529................*......*.......676*.............89.......112............-....988.........858.
+....*....431..63..-646.........*........................863.649..494..896.......................................759..........+..............
+...331.....*.........../969....571.........355............*.....-.........#.....804@........-......................*...875......68..........
+........558..412.............................*....758..272..............207..............466..........245.......664...@...........*..447....
+...............*..-368.......................345./.........%..@....450..........................175......*.%...............106...44.@.......
+........*290...........10...323..........................318..664...+..470....-...@...../718.......$...986..571.............*...............
+.....148......387/.....%...=....287........=784.........................*..580....260...............................440....377..-......316..
+................................&........................$....../840....................708......../.......149..................849.........
+....613..........926.......-......951....*.......185..62..265...........................-....@783...479........531..................302.....
+.89...&.....237.........949...........561.211...*......*......689...&.......@..412.......................214......*.........334.590....*908.
+...*......../.....454........245.781.............649.489..560...-..109.....27....*.........511..............*....567....495*......*./.......
+..502...36....285...#.441...+.......*.....................&............246...........@.....*...........-929.165.................338..581....
+.......+.................*......324..846..................................=....974...979..778....981...................174.811*.............
+...............*........752.701..*............76.....985.....@...588.&278..........................-................=./........720....371...
+....319.606...566..../........+...63..........*........=....543...$..............................%.............3..64........................
+......$............472..................107.129............................818........&724....454..378..........#....978.........210@.......
+..............................*295......*.......................803*143.......*.......................*.................*395.............489
+...........974...959=......772.........646..........752....=.................165.........+...305.......331..............................*...
+..243%........*.......169/.........66......#............554.............@..............48...................616....981..117........113.45...
+...........694....685......312......*.......94......840.........487.....519.655......................$365..*............*............*......
+........#......#....*..............541.960.............*..........*............-....758*...................636.......868...............%....
+.........400....538..454.@............../......138....402.....775.959...................210.990......%...................338*33.......585...
+....891...................278........*........*................*...........=................-...997.43....@.................................
+...................................76.182..775...107..........536.......302.......982.883......$.......650..........470...988...............
+...810.......694....757*842.........................*..................................-.......................956.....*.....*173...........
+............................223......212..427......748...593......554*528...462...........-.....569........67.....*....620..................
+.....349.....461....=........*.../....=......%.673.....#....*560........................694.534.*.........=......661............326...123...
+.879.#.......*....610...#.357..398.............*....933.............555.........45*..........*............................477....*.....*....
+...*.....12..240......164.............862.......17...........650...................627...40.347...640........448.#583.340.......253.918.....
+...913....*......425@......492=....&....-...931.............=....220..........................................+............288..............
+.........999....................447.........*.....222...360.............124-........+....................596........574...........233*543...
+..............234...215..793.............492.......#......%.=....255.........613...75.............754....../...........=......./............
+..............*....#.........................52.............226....*....750..............631....@.............678..............671...741....
+..298-...5..158...........%307......+........+........165*..........836....$............*.......159..938.......*...%.....644................
+....................................839...................131..................+.......210..872.........*...121..818.....*....252.........99
+......139.....609...............................%...720..................607=...407.........*...........962..............395.........359....
+.989..*..........-..........-....506....359..465......*........*288..........................324...368#.....%..602..551..................922
+.....282.................989....*......*.........52....818..834........693.689.............................845.#.......*......158...&.......
+.../.....357....410....*.....128.....153........*.....................*......*.....................656.915............267....*......234.155.
+229........*......+...488..&....................689.....71.....331..209.....521..305..365.95..........*......................35.........=...
+............355...........126.794*599.....................*....../..................$.......&.328...........659.........527.....252.........
+.869................675....................923@......*.....293.=.....342..............466........*.........*...................-....&857....
+...................*.............364..............827.191.......631..*......=......@..............492....615...............921..............
+............172..124...142.966........*591..........................337....852....103..*275...+..............................*.........647..
+.....233....*..........*...........172.................276...672............................132.....&............764*607...693...411........
+.......*..919...301.563.................71../......73...*..../.........170......973..74*............474............................/........
+647.405.................321.479...........*.980......*....................*.............563..877...........934.......449..701-..............
+...........................*............555...........727........328.......521...................#562........*..357.=..........893..........
+611..561......400..............&...........................700.....................570.494....63............165..=.....481......*...........
+...*.*..........=.525......317.277...............738*596......*139....528...@475....*....*......*.........*............*.........62.........
+186..149..........*.../...............357...504*....................=....*........212.....235....125...173.253..../.....992.975*............
+..........430...770....20....865......*.........705....904..-........941..216.....................................275...........763.405.....
+.........&.........................362......#..........*.....646................258.....898....241....................*..............*......
+....13.....510...935...........367..........546....98.869........217.....................*....*....431...566.........152..............69....
+...%................*.......$...-.......213.......*.........%..........683............#..265................../866...............161........
+.........962...938...259..290......177....=.......948........582........+..843.......584.........%680..782%................./437........657.
+797/.388*........*..................*........627.........................../.............897..........................@.................*...
+.................848......-..724....76.........&..........228.335...912*.................*................122.......149..828..........289...
+.......................748..*.........................722.......$.....................774...431&.........................*....739..=........
+...80...935.*621.............57......#...........484...$.......................380.72............599%..670.............233......*..26.......
+.........+........................812...$..........*...............259*470......*...%..408..............*..251....618........356............
+...............*381...726...............972.109..260.....934.%878................92.....*...760......926..*..........*66....................
+..703.......592............384.......................433..=..................814......764........809......636...534...........$.......944...
+.....*..275.....................83.........623...695..*............516..30.....$.................&...............*.............507....*.....
+...254...*......#...74............%.............*....496.9.........*........................727....335...662......473...530$..........942...
+.......420.......66.*....679.332@...413..........417......*..188.609....908......*587........%........&.....&.411...............640.........
+...382.....462......871...*.............951...............25..............-...860................604............*....699..814....*..........
+....&.......#..............574........................................................503.723*......$.....-...527...*.......*.683....249.395
+..............781............................21.....721*206.990.97...............87...........971......273..........951..736........*.......
+.............*..........948..808..158..........%...............*................&......*537.......................=............-....529.....
+164*....18..753............/..*............................96.......................316........382........946...685.........455.............
+....672...........*205.........695...........................$...279....#625....138..................115....*.........566..........410......
+...............605.....17.............705..$177.......424...........*.........................737......*...297...........-..................
+..780..............858*........24.......$.............*.......+......432.........................*....406......137..779*...$...695..........
+....%.%192..........................734...860.........160...562..62........362.....896%........42..............*..........265.$.............
+............107/.......719..983............*..............................%.........................................................997.....
+..........................*....*377...118...589..................926...&.......11........501.......$............490..996..*.............%...
+.........../....769........210........*................999......@.....372.11*...*.......*.....295..71......969@.-...*......223.....840..869.
+........742.....................554...148..........812....*.........+..........727....875......#........./.........857.875...........*......
+...611...........150*693...164....+........................636..327.73................................329...............*....25....747.942..
+........336...............*............808...*.....894...........*.......707*640.................538@................*...308............*...
+.........$..............#..817..424*89...&.117......../.....2..243.....................................279*143..866..458............623.170.
+.....301.......199...871..........................728......-.......742.252...876......./192........................................@........
+.......*.825..+..........284-.....271................*........418....&.......*...............+.......781-..........92#...222............%452
+....786....*.....................#.................272..................133....653.........82..................554................*156......
+............838..917-..868*492.............156...........970..............*.....*..337...............100........*..397*177.....442.....&....
+..951..........................193..........%..............*.562=......505............+....203.971...........843...........%............753.
+...*............498....754......*......562....262........668................781................*.....*621.........115.....249...............
+....470......@........*......75.227......*...*...............57+........769....+....-.......839...968.....876......*..............491.......
+..........807..297..305..883..........470...505.....245...........682......*......415....................*.........982...........&.....180..
+................*...........*.............$.........*.......205......*135.......................%.....286..............418.............$....
+....362.444.....815..........722....336...37.........283...*..............329................433..........@153..........*.....435...........
+....*......*.........237...............*.....247...........108.....906.......=......611.............................608..814.-..............
+......285.......865.*..........62.973...781.....*..982.............*......60.......$.......722......=..834.%.....85*............215.........
+........*....%.......780.996..%....*..............%..........7..855..515.+.....990........*........600...+.765............911.....*.........
+......130..932.180.......*......143.........../..............*.......*..........&..149....301................................-...77.........
+...........................272.................868............943.976................*............944.........996....71.....................
+....511...............995#..-........&.................462.............-.601...931....889.&52.............................................27
+......#...55......................807.......424..968.................738...*......$..................598-.....77...408......%.......458.....
+....................88...272*................-....../....................544.......................$.........*.........11+...313....+.......
+108............819...*.......594..883..../............215..22.....................566*799........217....197..176...721......................
+.....332.......*.....846..-.......#...157................@......454....698...622..........430........47*............................../.....
+.............194..........239..................713*331..............51*.............800.....-..600.............&479..........-........805...
+......637*.....................847...........................274.#..........594...........................533........883....722....*........
+..........61...310.12......*..........923...............174....*.299.......-................132............&.........*..........876.331.....
+...............*.....*...435.864......+.......................11.....890....................$..........%............862.....968.............
+...../......404......398..........540.....................*............$.........287....................311.....515............*............
+.....564.....................807...*...567.............985.100.....%.....................227..................$.*.........*........974.156..
+..............156.953...........$........$.....................695.329..................=.............836..176..128....864..216#....*.......
+.767-...#.......%....*741...........-169........452/............*.............+...........174.....813....*..........%..............230......
+........17...............................159..........377=....659..........725....$......*........$...971.........907.766...................
+...............408.914........788...%......@...................................660.....138....333..........48..............=380...104.......
+.............$........-......*.......480...............194..*527........*....................*...............*578..961...........*..........
+...444..428..470..........128...............684.399.....*............105.680......7*583............................*.......*....53....*.....
+.....*.*...........223..........&19..........*.....*...246.....*........................526*939..........*....33..51....403..........706....
+...832..383...287.........................216....103...........710..................958...................288...............................

+ 108 - 0
day_3a/src/main.rs

@@ -0,0 +1,108 @@
+use std::fs;
+use std::env;
+
+struct Number {
+    value: u32,
+    row: usize,
+    col: usize,
+    len: usize,
+}
+
+fn get_numbers(engine: &Vec<Vec<char>>) -> Vec<Number> {
+    let mut numbers: Vec<Number> = Vec::new();
+    for row in 0..engine.len() {
+        let mut col = 0;
+        loop {
+            if col >= engine[row].len() {
+                break;
+            }
+
+            let mut number = Number{
+                value: 0,
+                row,
+                col,
+                len: 0,
+            };
+
+            while col < engine[row].len() && engine[row][col].is_digit(10) {
+                number.value = number.value * 10 + engine[row][col].to_digit(10).unwrap();
+                number.len += 1;
+                col += 1;
+            }
+
+            if number.len != 0 {
+                numbers.push(number);
+            }
+            col += 1;
+        }
+    }
+    numbers
+}
+
+fn build_engine(input_data: String) -> Vec<Vec<char>> {
+    let mut engine: Vec<Vec<char>> = Vec::new();
+    for line in input_data.lines() {
+        let mut engine_line: Vec<char> = Vec::new();
+        for char in line.chars() {
+            engine_line.push(char);
+        }
+        engine.push(engine_line);
+    }
+    engine
+}
+
+fn is_next_to_symbol(number: &Number, engine: &Vec<Vec<char>>) -> bool {
+    let start_row : usize = if number.row > 0 {
+        number.row - 1
+    } else {
+        number.row 
+    };
+
+    let end_row : usize = if number.row < engine.len() - 1 {
+        number.row + 1
+    } else {
+        number.row 
+    };
+
+    let start_col : usize = if number.col > 0 {
+        number.col - 1
+    } else {
+        number.col
+    };
+
+    let end_col:usize = if number.col + number.len < engine.len() {
+        number.col + number.len
+    } else {
+        number.col + number.len - 1
+    };
+
+    for row in start_row..end_row+1 {
+        for col in start_col..end_col+1 {
+            if !engine[row][col].is_digit(10) && engine[row][col] != '.' {
+                return true;
+            }
+        }
+    }
+
+    false
+}
+
+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 engine = build_engine(input_data);
+    let numbers = get_numbers(&engine);
+    let result = numbers.into_iter().fold(0, |acc, n| {
+        if is_next_to_symbol(&n, &engine) {
+            acc + n.value
+        } else {
+            acc
+        }
+    });
+
+    println!("{}", result);
+}

+ 1 - 0
day_3b/.gitignore

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

+ 7 - 0
day_3b/Cargo.lock

@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "day_3b"
+version = "0.1.0"

+ 8 - 0
day_3b/Cargo.toml

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

+ 10 - 0
day_3b/example.txt

@@ -0,0 +1,10 @@
+467..114..
+...*......
+..35..633.
+......#...
+617*......
+.....+.58.
+..592.....
+......755.
+...$.*....
+.664.598..

+ 140 - 0
day_3b/input.txt

@@ -0,0 +1,140 @@
+.....489............................152....503.........................180......200.........147.......13.......................239..........
+......*.....186.48....681...732........*..................935.........*.....................*......................512............*..874....
+..806.540......*.........*............249......904...358....*......957..867..863..........857.....264..............@....89=......97..*......
+......................793........................*...=.....142...........*..*....%...................@......+...............36.......547....
+...........=335..............906*634..932........201...157.............423..72..103.798.......732........161...............*................
+..........................*..........*....662.................88....................$..............=........................439.126...269...
+...905&...74.............795...128...872....*....*.....521.........../......806&.........456.....93..869.........168..............*.........
+........../..=662.824.........+............863..47........-.700.....437..........316..........................96.*......348*632....138.$932.
+........-..........*.......................................................465....*.........243......&........*...94..+..........*..........
+..41...532.......511.....-......$........&....216.................................330...715..../...309........415.....388.....873.287.265...
+....*...................338...496.......18......*............48........873................@.............493.................................
+..849.............................136.#......787.........787..$....152..*........187..../.....738......*....................&85..960...749..
+..............395.................*...478...........................*....860.......*...613./.........194........................*.....%.....
+.....+799.........132..188........691..........689/...176..........274........569..840.....8....#........................451...71...........
+..............93..&....*........@........#..................892..............................275.....862*180../.....355..*.............796..
+.......400......*......676.....342.......930...389...925.......*...........580..3......395....................27....*....888..........#.....
+.....%......205..888................60...........=..*.......540........742.*..........*.......858..................589.......679..490.......
+...462..125*....................691..@.221=.........28...................*..31.615..827..............876...................-.........*762...
+.............501............$..=...............*.........&.............842......@.......308................601...........546................
+......428...*.............417.....760....25.....809......119.......................589.../.........610......../..%256...................858.
+......*...623...186................*......*..........895.......................$......#...........@...................337........285........
+....626.#......@.....787.....#...........294./..........*........619..........902........924....................665..*.............*........
+.........406...............10......+..........985...+....944.....*........296................169....@....686......*..............290..767...
+.......................738..........977....*.......873.......665.381..17....%.....246....576..*...861...*.......104.....208..........=......
+.919............#...............973.....320.529................*......*.......676*.............89.......112............-....988.........858.
+....*....431..63..-646.........*........................863.649..494..896.......................................759..........+..............
+...331.....*.........../969....571.........355............*.....-.........#.....804@........-......................*...875......68..........
+........558..412.............................*....758..272..............207..............466..........245.......664...@...........*..447....
+...............*..-368.......................345./.........%..@....450..........................175......*.%...............106...44.@.......
+........*290...........10...323..........................318..664...+..470....-...@...../718.......$...986..571.............*...............
+.....148......387/.....%...=....287........=784.........................*..580....260...............................440....377..-......316..
+................................&........................$....../840....................708......../.......149..................849.........
+....613..........926.......-......951....*.......185..62..265...........................-....@783...479........531..................302.....
+.89...&.....237.........949...........561.211...*......*......689...&.......@..412.......................214......*.........334.590....*908.
+...*......../.....454........245.781.............649.489..560...-..109.....27....*.........511..............*....567....495*......*./.......
+..502...36....285...#.441...+.......*.....................&............246...........@.....*...........-929.165.................338..581....
+.......+.................*......324..846..................................=....974...979..778....981...................174.811*.............
+...............*........752.701..*............76.....985.....@...588.&278..........................-................=./........720....371...
+....319.606...566..../........+...63..........*........=....543...$..............................%.............3..64........................
+......$............472..................107.129............................818........&724....454..378..........#....978.........210@.......
+..............................*295......*.......................803*143.......*.......................*.................*395.............489
+...........974...959=......772.........646..........752....=.................165.........+...305.......331..............................*...
+..243%........*.......169/.........66......#............554.............@..............48...................616....981..117........113.45...
+...........694....685......312......*.......94......840.........487.....519.655......................$365..*............*............*......
+........#......#....*..............541.960.............*..........*............-....758*...................636.......868...............%....
+.........400....538..454.@............../......138....402.....775.959...................210.990......%...................338*33.......585...
+....891...................278........*........*................*...........=................-...997.43....@.................................
+...................................76.182..775...107..........536.......302.......982.883......$.......650..........470...988...............
+...810.......694....757*842.........................*..................................-.......................956.....*.....*173...........
+............................223......212..427......748...593......554*528...462...........-.....569........67.....*....620..................
+.....349.....461....=........*.../....=......%.673.....#....*560........................694.534.*.........=......661............326...123...
+.879.#.......*....610...#.357..398.............*....933.............555.........45*..........*............................477....*.....*....
+...*.....12..240......164.............862.......17...........650...................627...40.347...640........448.#583.340.......253.918.....
+...913....*......425@......492=....&....-...931.............=....220..........................................+............288..............
+.........999....................447.........*.....222...360.............124-........+....................596........574...........233*543...
+..............234...215..793.............492.......#......%.=....255.........613...75.............754....../...........=......./............
+..............*....#.........................52.............226....*....750..............631....@.............678..............671...741....
+..298-...5..158...........%307......+........+........165*..........836....$............*.......159..938.......*...%.....644................
+....................................839...................131..................+.......210..872.........*...121..818.....*....252.........99
+......139.....609...............................%...720..................607=...407.........*...........962..............395.........359....
+.989..*..........-..........-....506....359..465......*........*288..........................324...368#.....%..602..551..................922
+.....282.................989....*......*.........52....818..834........693.689.............................845.#.......*......158...&.......
+.../.....357....410....*.....128.....153........*.....................*......*.....................656.915............267....*......234.155.
+229........*......+...488..&....................689.....71.....331..209.....521..305..365.95..........*......................35.........=...
+............355...........126.794*599.....................*....../..................$.......&.328...........659.........527.....252.........
+.869................675....................923@......*.....293.=.....342..............466........*.........*...................-....&857....
+...................*.............364..............827.191.......631..*......=......@..............492....615...............921..............
+............172..124...142.966........*591..........................337....852....103..*275...+..............................*.........647..
+.....233....*..........*...........172.................276...672............................132.....&............764*607...693...411........
+.......*..919...301.563.................71../......73...*..../.........170......973..74*............474............................/........
+647.405.................321.479...........*.980......*....................*.............563..877...........934.......449..701-..............
+...........................*............555...........727........328.......521...................#562........*..357.=..........893..........
+611..561......400..............&...........................700.....................570.494....63............165..=.....481......*...........
+...*.*..........=.525......317.277...............738*596......*139....528...@475....*....*......*.........*............*.........62.........
+186..149..........*.../...............357...504*....................=....*........212.....235....125...173.253..../.....992.975*............
+..........430...770....20....865......*.........705....904..-........941..216.....................................275...........763.405.....
+.........&.........................362......#..........*.....646................258.....898....241....................*..............*......
+....13.....510...935...........367..........546....98.869........217.....................*....*....431...566.........152..............69....
+...%................*.......$...-.......213.......*.........%..........683............#..265................../866...............161........
+.........962...938...259..290......177....=.......948........582........+..843.......584.........%680..782%................./437........657.
+797/.388*........*..................*........627.........................../.............897..........................@.................*...
+.................848......-..724....76.........&..........228.335...912*.................*................122.......149..828..........289...
+.......................748..*.........................722.......$.....................774...431&.........................*....739..=........
+...80...935.*621.............57......#...........484...$.......................380.72............599%..670.............233......*..26.......
+.........+........................812...$..........*...............259*470......*...%..408..............*..251....618........356............
+...............*381...726...............972.109..260.....934.%878................92.....*...760......926..*..........*66....................
+..703.......592............384.......................433..=..................814......764........809......636...534...........$.......944...
+.....*..275.....................83.........623...695..*............516..30.....$.................&...............*.............507....*.....
+...254...*......#...74............%.............*....496.9.........*........................727....335...662......473...530$..........942...
+.......420.......66.*....679.332@...413..........417......*..188.609....908......*587........%........&.....&.411...............640.........
+...382.....462......871...*.............951...............25..............-...860................604............*....699..814....*..........
+....&.......#..............574........................................................503.723*......$.....-...527...*.......*.683....249.395
+..............781............................21.....721*206.990.97...............87...........971......273..........951..736........*.......
+.............*..........948..808..158..........%...............*................&......*537.......................=............-....529.....
+164*....18..753............/..*............................96.......................316........382........946...685.........455.............
+....672...........*205.........695...........................$...279....#625....138..................115....*.........566..........410......
+...............605.....17.............705..$177.......424...........*.........................737......*...297...........-..................
+..780..............858*........24.......$.............*.......+......432.........................*....406......137..779*...$...695..........
+....%.%192..........................734...860.........160...562..62........362.....896%........42..............*..........265.$.............
+............107/.......719..983............*..............................%.........................................................997.....
+..........................*....*377...118...589..................926...&.......11........501.......$............490..996..*.............%...
+.........../....769........210........*................999......@.....372.11*...*.......*.....295..71......969@.-...*......223.....840..869.
+........742.....................554...148..........812....*.........+..........727....875......#........./.........857.875...........*......
+...611...........150*693...164....+........................636..327.73................................329...............*....25....747.942..
+........336...............*............808...*.....894...........*.......707*640.................538@................*...308............*...
+.........$..............#..817..424*89...&.117......../.....2..243.....................................279*143..866..458............623.170.
+.....301.......199...871..........................728......-.......742.252...876......./192........................................@........
+.......*.825..+..........284-.....271................*........418....&.......*...............+.......781-..........92#...222............%452
+....786....*.....................#.................272..................133....653.........82..................554................*156......
+............838..917-..868*492.............156...........970..............*.....*..337...............100........*..397*177.....442.....&....
+..951..........................193..........%..............*.562=......505............+....203.971...........843...........%............753.
+...*............498....754......*......562....262........668................781................*.....*621.........115.....249...............
+....470......@........*......75.227......*...*...............57+........769....+....-.......839...968.....876......*..............491.......
+..........807..297..305..883..........470...505.....245...........682......*......415....................*.........982...........&.....180..
+................*...........*.............$.........*.......205......*135.......................%.....286..............418.............$....
+....362.444.....815..........722....336...37.........283...*..............329................433..........@153..........*.....435...........
+....*......*.........237...............*.....247...........108.....906.......=......611.............................608..814.-..............
+......285.......865.*..........62.973...781.....*..982.............*......60.......$.......722......=..834.%.....85*............215.........
+........*....%.......780.996..%....*..............%..........7..855..515.+.....990........*........600...+.765............911.....*.........
+......130..932.180.......*......143.........../..............*.......*..........&..149....301................................-...77.........
+...........................272.................868............943.976................*............944.........996....71.....................
+....511...............995#..-........&.................462.............-.601...931....889.&52.............................................27
+......#...55......................807.......424..968.................738...*......$..................598-.....77...408......%.......458.....
+....................88...272*................-....../....................544.......................$.........*.........11+...313....+.......
+108............819...*.......594..883..../............215..22.....................566*799........217....197..176...721......................
+.....332.......*.....846..-.......#...157................@......454....698...622..........430........47*............................../.....
+.............194..........239..................713*331..............51*.............800.....-..600.............&479..........-........805...
+......637*.....................847...........................274.#..........594...........................533........883....722....*........
+..........61...310.12......*..........923...............174....*.299.......-................132............&.........*..........876.331.....
+...............*.....*...435.864......+.......................11.....890....................$..........%............862.....968.............
+...../......404......398..........540.....................*............$.........287....................311.....515............*............
+.....564.....................807...*...567.............985.100.....%.....................227..................$.*.........*........974.156..
+..............156.953...........$........$.....................695.329..................=.............836..176..128....864..216#....*.......
+.767-...#.......%....*741...........-169........452/............*.............+...........174.....813....*..........%..............230......
+........17...............................159..........377=....659..........725....$......*........$...971.........907.766...................
+...............408.914........788...%......@...................................660.....138....333..........48..............=380...104.......
+.............$........-......*.......480...............194..*527........*....................*...............*578..961...........*..........
+...444..428..470..........128...............684.399.....*............105.680......7*583............................*.......*....53....*.....
+.....*.*...........223..........&19..........*.....*...246.....*........................526*939..........*....33..51....403..........706....
+...832..383...287.........................216....103...........710..................958...................288...............................

+ 109 - 0
day_3b/src/main.rs

@@ -0,0 +1,109 @@
+use std::fs;
+use std::env;
+
+struct Number {
+    value: u32,
+    row: usize,
+    col: usize,
+    len: usize,
+}
+
+fn get_numbers(engine: &Vec<Vec<char>>) -> Vec<Number> {
+    let mut numbers: Vec<Number> = Vec::new();
+    for row in 0..engine.len() {
+        let mut col = 0;
+        loop {
+            if col >= engine[row].len() {
+                break;
+            }
+
+            let mut number = Number{
+                value: 0,
+                row,
+                col,
+                len: 0,
+            };
+
+            while col < engine[row].len() && engine[row][col].is_digit(10) {
+                number.value = number.value * 10 + engine[row][col].to_digit(10).unwrap();
+                number.len += 1;
+                col += 1;
+            }
+
+            if number.len != 0 {
+                numbers.push(number);
+            }
+            col += 1;
+        }
+    }
+    numbers
+}
+
+fn build_engine(input_data: String) -> Vec<Vec<char>> {
+    let mut engine: Vec<Vec<char>> = Vec::new();
+    for line in input_data.lines() {
+        let mut engine_line: Vec<char> = Vec::new();
+        for char in line.chars() {
+            engine_line.push(char);
+        }
+        engine.push(engine_line);
+    }
+    engine
+}
+
+fn find_numbers_next_to_coord(numbers: &Vec<Number>, row: usize, col:usize) -> Vec<usize> {
+    let mut indices : Vec<usize> = Vec::new();
+
+    for n_id in 0..numbers.len() {
+        let start_row : usize = if numbers[n_id].row > 0 {
+            numbers[n_id].row - 1
+        } else {
+            numbers[n_id].row 
+        };
+        let start_col : usize = if numbers[n_id].col > 0 {
+            numbers[n_id].col - 1
+        } else {
+            numbers[n_id].col
+        };
+        
+        let end_row : usize = numbers[n_id].row + 1;
+        let end_col = numbers[n_id].col + numbers[n_id].len;
+
+        if row >= start_row && row <= end_row &&
+           col >= start_col && col <= end_col {
+            indices.push(n_id);
+        }
+    }
+
+    indices
+}
+
+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 engine = build_engine(input_data);
+    let numbers = get_numbers(&engine);
+
+    let mut result = 0;
+
+    for row in 0..engine.len() {
+        for col in 0..engine[0].len() {
+            if engine[row][col] != '*' {
+                continue;
+            }
+
+            let indices = find_numbers_next_to_coord(&numbers, row, col);
+            if indices.len() != 2 {
+                continue;
+            }
+
+            result += numbers[indices[0]].value * numbers[indices[1]].value;
+        }
+    }
+
+    println!("{}", result);
+}