diff --git a/day03/.envrc b/day03/.envrc
new file mode 100644
index 0000000000000000000000000000000000000000..3550a30f2de389e537ee40ca5e64a77dc185c79b
--- /dev/null
+++ b/day03/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/day03/.gitignore b/day03/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4864a1e68596e5fc3a7f573bdc7762cbddc26b35
--- /dev/null
+++ b/day03/.gitignore
@@ -0,0 +1,2 @@
+# rust
+target/
diff --git a/day03/.vscode/launch.json b/day03/.vscode/launch.json
new file mode 100644
index 0000000000000000000000000000000000000000..bcb6d3f50ad83f55d2726e3b2caf796f32b6e53d
--- /dev/null
+++ b/day03/.vscode/launch.json
@@ -0,0 +1,45 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "type": "lldb",
+            "request": "launch",
+            "name": "Debug executable 'day02'",
+            "cargo": {
+                "args": [
+                    "build",
+                    "--bin=day02",
+                    "--package=day02"
+                ],
+                "filter": {
+                    "name": "day02",
+                    "kind": "bin"
+                }
+            },
+            "args": [],
+            "cwd": "${workspaceFolder}"
+        },
+        {
+            "type": "lldb",
+            "request": "launch",
+            "name": "Debug unit tests in executable 'day02'",
+            "cargo": {
+                "args": [
+                    "test",
+                    "--no-run",
+                    "--bin=day02",
+                    "--package=day02"
+                ],
+                "filter": {
+                    "name": "day02",
+                    "kind": "bin"
+                }
+            },
+            "args": [],
+            "cwd": "${workspaceFolder}"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/day03/Cargo.lock b/day03/Cargo.lock
new file mode 100644
index 0000000000000000000000000000000000000000..52d399b3aa10d79dff5263a81292d58925e5483d
--- /dev/null
+++ b/day03/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "day02"
+version = "0.1.0"
diff --git a/day03/Cargo.toml b/day03/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..843335d53c02f6ebc00a7c472a5e6e72b8e48afa
--- /dev/null
+++ b/day03/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "day02"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/day03/data.txt b/day03/data.txt
new file mode 100644
index 0000000000000000000000000000000000000000..17e463a312f46dc37044b2c509c5e81a25ca4b9b
--- /dev/null
+++ b/day03/data.txt
@@ -0,0 +1,140 @@
+............409..........784...578...802......64..............................486.248..............177....................369...............
+.....-939..........524#...#....=.......*.........+......90.................................76..615..-..@.....961..........$.......*.........
+............951*........................736...955..258....*.....253@.............210.10.....=...*.......776...*....&...............600..274.
+152.78..........671.....936.......................*..........14...............................575.=.........214..519.....787.739........*...
+...*....591......................514*155..........807...............516.............23...5#.......250.531...................*......-..71....
+.............................................254..........69&........*..............*....................*...............*........785.......
+....5....../.42..908*166..242*825.....................19%............148..822......127..+...+...........971...........206.540.753...........
+........111.........................%...............$..........635..........*..........222.286..823..........%................&...=630......
+..821&.......815.............424$...303.322.311..156...........*....786.....91..620............*....319......406......187..............&865.
+........................&975...............*.........649.40..417.......+.........../............39....................*...........%.........
+...300............546...........................640...=...................................319............246....883.253...690...526......435
+.................*......#..............571..121*.........542..938.13...532*....726....795.........%........*.............*...........683*...
+......173.568.624....190................*..........*542....................464..*..................519.144..652.65......926.................
+.......=....*..............................-...@................................592..658..78*537..........#...................303.200*......
+..780.....716.......858..527.775.....587.314...374.......375....777.166.............................................677*394.....*.....512...
+....&..............*...........-......*......*.....900...*.../../............287..255.......431...........104..440..........803..844........
+...............%....875.............920...615.556......488.308....888........@.......$..522*..........511.*............/.....&..............
+........688....778.............410.................+...............*..#322......234...........692....*.....583.240+....800.............&....
+.......*........................*......844-.........683....941..341...............*..........#......637.....................=768..983.80....
+.......312...........113.........858........427.685........................*211..336..........................502...........................
+......................*......151........293.+.....*...454................63.............39........831+.........%......./...$................
+..187........677......165....*......104..*.......145.@.........444..767...................*...975................659.352.844....*.160.......
+......+.967.#..............116.........+..866...........=.......*......*404..............659.....*...............*............293...*.......
+...801....*.....937............................/.........553..623....*........567....244......%...816....994.....510....173........547......
+...........609...............................783.....848..........511.718.....*.............116.........*......................&.......65.46
+102...................356..810......................*.....721..............244...$.....315...........&..605...22..........665.411..../......
+..................956*.....*......523.............622........*.................322........*........703............888.......*.......714.....
+...896.....580.............146.....&..861..............327...766..93.......534...........482..327.........494.....*.......978...............
+....*.........*..-.....&.........................701.....-.........*...429....................%...$.........*..895..................../.....
+..561..517..994.248.596......&...$.....196.701.....*............217...*....160........240..+....265..471..76............509..15........245..
+.........*...............615.801.837......*......661.181...707......613...-.......495......959..........*....#...........*....$.............
+.....-...107............@...................&................*.....................*....$............853.....808..249.160.......725......151
+....549......137..........288@...759.$......961....#..........................788.....846......920................../.......774.............
+........865...%...993...........#.....850...........636.104..204.192...387...%............382.....+..&.......436........682*.......532......
+........................893*660...........................-.....*.........&......$........../.334....505.+....-..732*................*......
+........./....976....*..........35....178.18*970.752...+..........................567..258.......*.......829...........+..358*..*464..189...
+.....676.319..........222......*.................*......559...604.......-.....687.....*..........16..........492......376...................
+....*.............157.........909................266..........*.........971..+.....211..885...........$.......%.....@............#..........
+.284.....167.....*....83...........408....290...............538........................../....&.84*...885........575..........511..481......
+............*770..844.=..599..........*......*457.....$861................779..240...$......897..........................520%......*........
+...........................*..972.527.844.........................&........*..........26........957.................787.........759.........
+...530#.396&.............670.*.....+.......*.....503*689....486#.558....522........................=..........629..%........................
+..................96*........320..........972...............................$..776.....................755...*...................265*53..265
+....48............................736...........*..........771..85..360..705......*501..793..................685........................*...
+.....*...@705.233....648#..........+.........780.....13...=......*....*.........................*..................898%....282........478...
+..186.....................369............327.........=.........14...472..........942...*.....817.......611....66-..........&......236.......
+..................308*......#.......226.....&..............573..................*....85.9.........801..*..........217*........237*..........
+.........*............728......847...#................+.......*......267.....634.................=......979...........14...............364..
+....99.213.......=........468...............%446...647......%..822..../...........819................*.........469.........70.37.......*....
+.................143..762*....977.........................649..................../.....123....-...902.67..939..&.............*........793...
+.......982...=......................................414...................477.........=......266..........=.............622*....672*........
+..........#.797...../608.......173...=.........................111...............219.....252....................438.726.....902.....25.=....
+......-..................863..*......805.9.......107..............*........151.....*........*234...422....995....*.....*................866.
+....670...........544.....*....311.......*....$.$............................-..943.......*........*......=.......167...695.................
+..................../......508..........278..78.........459+...........................922.201....513.518....985............476%............
+..556......905..341....683........732*..........437.753..........331*..342..374.475..@.................*....*.........591............+972...
+.../.........*...*........*...........................*.....833.......*...............566....*..........460..621.836..*.....................
+.............627..912......49.........289.....910...737.....*........645.....977..159.....707..104.644............-...872..........&....453.
+.......................................*...../...............287.........375*........-.........*....*..723+...256...........361....184.*....
+...%..231.......187......8.....*569.138..................963.........184.........899........571...836..........*...*..........*.........349.
+546...*............+....*....29...........885......20......./......................*.........................95.....660........470..........
+.....568..902........178.............313..*.........*...............706.....19....724....338..........880*......701........996......84.701..
+....................................*.....253..535.893........+.............=..............*..............520...............&......-........
+..............&..747............877..990................./.....45.........................604....&...................152......275.....%931..
+......515....26....=..128........*..........%.....753...374...........522*835.........838.....344...222..........602....+....*..............
+.....................*.....975....12......717.966*.............734.............486...*.................*.....634*..........431..%........645
+115.388......#......670...............................251..851....*.....666.....*..887.18..532......661..685.....................947....+...
+...*..........977.........308...........279......63....*..........194..*.....886.........*.../.............*......543.419...................
+....................355....*....489...............*.....496.............933......714....91.....558*669.....475.../....*..........501........
+...737..807.................545...*..............873............763....................................864..........152............*........
+......*..$...553......695..........623..319........................+..681./....@835..669...........530*.......................402.538.......
+....334.....$.............................................186........*.....977.......*.....................82.....950.....985*...........751
+...................222......847.........347..............&.........213............+..168..........820&.......@...*....211............150*...
+.....*520......................$.......*......630..............193.......597....266.........744..................950.....*...584............
+..947.......................@.....903.....889*.......693......-.........*......................*365..........846........655...*.............
+......*609.........425.478..597.....*..................#..=........=...............469......*............721....*267..........872...........
+...997.......975..........*.........419........630.691...646......939.................*..865.933.805*676....*...............................
+.........102*....544..984.258.526.........*...=...........................@........473......................932......247...............955..
+.................*......=.......*........553....................517...600..344.....................742...............%....=...........+.....
+....................351......970..........................280......*.....*........&.........782........................486..............&...
+...........359...........604.......997...274....682.673....*..156.831.392.....@..228.814......*.........145.......835.............222.570...
+..694...........+....157.%...848..*.....*.........$....*.246.+.............447.......*......259..@381......*54.....@............%.*.........
+.....*.......433....#..........*..594.184...........743............196.........967.987.......................................649...941.@....
+......97......................386...............%........................839..............760.............151...&...344................871..
+.....................186..937.....*528.....263.179....#976....405...................+...............522........65...*...........*...........
+......-893........+....*....*..........@.........................#.401.....72+....719.104.....731...*....31#......93..274+....41.348........
+...........854.....855...879.........950.....342....771...............................*.......*....546......................................
+........$......601...........526*943.........*....#..*..............124.&839..#......161....558...............140...........................
+.......131.................................665.266...732.....949......*.......31................@754...*...........932*................&....
+...............169....889.....271*613........................*.....194...+............................107..............142....551*925.56....
+........267.....%....*...................................281.750.......563...........848.477..655..........674..............................
+............312....716.......................#.....802.....*.......281......../.........*......*...........*...708..........................
+.......594..*...............359....462*......405.....=...............&.........439.........759....*........987....*330......................
+736....*.....580.....26.......*.........................467.........................456...*.....13.102.460..................693.....960.....
+........227..........&...861...523.554..877.............=.....429................./........383...........*......$.......623....*.........651
+....568........988......+..................%.....................*689.......@..691...39.........=.....123.......869...........1.........$...
+....+.....892......581*.............876....................................603.........*......399......................927-.................
+.........*....-........611............*....+......443.=.....856.%559................679..592....................853.........925...34........
+...26.303.....944...........726.....444.....961....*...433....*......*215...26...95.............82...........................*.....@./......
+..........710......130..........13..............443../.....391....260......&.......*.....751....*...........................508.......555...
+.........*.....958*.....93..235*......................460........................491.......*.....324.........$409..972...2..................
+....352..534...........*........./.........#.................580.........834................973......102.632......*.......*............48...
+.................&...820.206..890..66....683....................%...*493.....256...$....................*................434.....884..&.....
+.585/.........664........*...............................%...............512..*..914..188....*................941*...........282....@...+...
+..........521.........168..../....94.139..............793...............*....827.....*....215..........24.............................787...
+..790........*...............148...&.*.........................172.205..728...........153.......176......*963..649.....628......19..........
+......883....806.....686..............226...763.......................#...........229.............*...........*....321..-....../.......60...
+.495....*....................................=..........21..357...839........*968...*............469........339....................../.*....
+......457.495.........@.....-.....89.613..........214..*......*.....$.....958.......341...%.....................645...274..37......82..465..
+...70.................932..83.787..*..$..........$.....218..787............................7..287...............*.......*....+..............
+....*..104...559...92...........*.373....$.............................163...........304.........*...........667.....547..67................
+.851................*.....267.189.........312...434...$837.........344.#..............=......604.679.......................@................
+....................883....-......258.896....................*.....-.......687..488............*...................615$.....................
+.746................................*...+.173*605.....609...812........721..=..*...........582..906......../...85.........940.409..928......
+.......................136......49.493............../....@..............*.....721....857...*.............62......-...465....*..=......*.....
+.................736.............*.........*.....968..........685..949.755............*.....37..*.............=....................*..53....
+466..621....812=..*......203....151.....828.48............871*......*............/.....764.....384.........37..905.............&.314........
+.....*.............575....*...........8..........#244............708...........131.....................546..*........641....189.............
+...801........554..........772.............989.......................................751...523...117......*..538........*..........*........
+.......82/........+..202........*749..........*../....402...140%......................+.....*.......#..202............93..604*..438.567..128
+.307............564..........353............442...153.*.......................516..5.......414................131.......................*...
+...........765.........259.......148...632..................722..348&..115.........-.............195.$186.729.......19*................602..
+...69.249....$......+.*......452..*.........288.........975....&......../.....865.................*.........*...744....423........756*......
+...*...=..........882..801..../..455..........=............-.........16........*..957..841......912..581....887..-...........745......464...
+....62.................................734......544..........898.....*.......548..=....*.............+.............516..632....*............
+...............$..............977%......&...512*..............*.......473...............985.678..128.............+...*.....+..330...........
+..942........181......831$................................430..399...........637*356..........*...../...........656...500.........135*403...
+...*.........................501.6@..307....174*722..........*........................*281.663..............101.............................
+.997..53.......-.......................*....................67.324%.117........=...227......................./.............385.......198..26
+.......@..634.669...............743.....869..........233...............*......948..........................#....817.......&...........*.....
+.........%.........280..+.........-.66.............%...+......393.999..745..$.......$........472..940.......70.....*........$......+..615...
+....................@..718..%464....*...........797..........*...............134.....38..560*........*..............388......307...49.......
+..113.......274.800..............992.......373#......791.....775.873.................................227..849=.357..........................
+....*..........*........75..........................*....775........*..179......................................*......77.........=293..987.
+...501..............766*...............26*805......692......*.....917....#.........................+.....483.413..........810...........*...
+.......358.160..............555...798......................684.....................676..........229......*........+..815.................657
+..........*....432.........-......*..............................550....795...816...$.................758........193....-.......222%.666....
+......139...$.....#.894..........226.....826..........*248..850$..........#..*....@...........895*..8.....340.+...........922.........=.....
+..892*....162.........*..................@.........249...........*............845..902...+................#....800..974....*................
+....................86...337...............710....................143.....................179.....976.......................419.........468.
\ No newline at end of file
diff --git a/day03/flake.lock b/day03/flake.lock
new file mode 100644
index 0000000000000000000000000000000000000000..8cb31152ad997fa81934bf60405a843b95972080
--- /dev/null
+++ b/day03/flake.lock
@@ -0,0 +1,83 @@
+{
+  "nodes": {
+    "naersk": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1698420672,
+        "narHash": "sha256-/TdeHMPRjjdJub7p7+w55vyABrsJlt5QkznPYy55vKA=",
+        "owner": "nix-community",
+        "repo": "naersk",
+        "rev": "aeb58d5e8faead8980a807c840232697982d47b9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "naersk",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1701389149,
+        "narHash": "sha256-rU1suTIEd5DGCaAXKW6yHoCfR1mnYjOXQFOaH7M23js=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "5de0b32be6e85dc1a9404c75131316e4ffbc634c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-23.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "naersk": "naersk",
+        "nixpkgs": "nixpkgs",
+        "utils": "utils"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
+    "utils": {
+      "inputs": {
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1694529238,
+        "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/day03/flake.nix b/day03/flake.nix
new file mode 100644
index 0000000000000000000000000000000000000000..ec90133cbbca9c5c3d561b812a2327ebe80e13a5
--- /dev/null
+++ b/day03/flake.nix
@@ -0,0 +1,28 @@
+{
+  description = "AoC 2023 - day 02";
+
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
+    naersk = {
+      url = "github:nix-community/naersk/master";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    utils.url = "github:numtide/flake-utils";
+  };
+
+  outputs = { self, nixpkgs, utils, naersk }:
+    utils.lib.eachDefaultSystem (system:
+      let
+        pkgs = import nixpkgs { inherit system; };
+        naerskBuildPackage = (conf:
+          (pkgs.callPackage naersk { }).buildPackage ({ src = ./.; } // conf)
+        );
+      in
+      {
+        defaultPackage = naerskBuildPackage { };
+
+        devShell = with pkgs; mkShell {
+          buildInputs = [ cargo rustc rustfmt ];
+        };
+      });
+}
diff --git a/day03/src/main.rs b/day03/src/main.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1461fafa91dfdd48fba53403d8625dcac7f38007
--- /dev/null
+++ b/day03/src/main.rs
@@ -0,0 +1,54 @@
+use std::{fs, io};
+
+fn main() -> io::Result<()> {
+    let data = fs::read_to_string("data.txt")?;
+
+    let width = data.split_once('\n').unwrap().0.chars().count() as isize;
+
+    let data_vec: Vec<char> = data.chars().filter(|v| !v.is_whitespace()).collect();
+    let size = data_vec.len() as isize;
+
+    let needs_testing = |index: &isize| *index > 0 && *index < size;
+
+    let is_symbol = |index: isize| {
+        needs_testing(&index)
+            && (!data_vec[index as usize].is_ascii_digit() && data_vec[index as usize] != '.')
+    };
+
+    let mut i = 0;
+    let mut sum = 0;
+    while i < size {
+        if !data_vec[i as usize].is_ascii_digit() {
+            i += 1;
+            continue;
+        }
+        let line_index = i / width;
+        let (num, num_width) = (&data_vec[i as usize..(width * (line_index + 1)) as usize])
+            .split(|v| !v.is_ascii_digit())
+            .next()
+            .map(|v| {
+                (
+                    v.iter().collect::<String>().parse::<u32>().unwrap(),
+                    v.len() as isize,
+                )
+            })
+            .unwrap();
+        let left_border = i % width == 0;
+        let right_border = (i + num_width - 1) % width == width - 1;
+
+        let res = (i - width..i - width + num_width).any(is_symbol)
+            || (i + width..i + width + num_width).any(is_symbol)
+            || (!left_border && (-1..=1).any(|v| is_symbol(i - 1 + (v * width))))
+            || (!right_border && (-1..=1).any(|v| is_symbol(i + num_width + (v * width))));
+
+        if res {
+            println!("counting {num}");
+            sum += num;
+        }
+
+        i += num_width;
+    }
+    println!("{sum}");
+
+    Ok(())
+}
diff --git a/day03/test.txt b/day03/test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b8caef240a08a55f6359970efe8ca3e0c8434c42
--- /dev/null
+++ b/day03/test.txt
@@ -0,0 +1,10 @@
+467..114..
+...*......
+..35..633.
+......#...
+617*......
+.....+.58.
+..592..865
+......755.
+...$.*....
+.664.598.9
\ No newline at end of file
diff --git a/day04/.envrc b/day04/.envrc
new file mode 100644
index 0000000000000000000000000000000000000000..3550a30f2de389e537ee40ca5e64a77dc185c79b
--- /dev/null
+++ b/day04/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/day04/.gitignore b/day04/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4864a1e68596e5fc3a7f573bdc7762cbddc26b35
--- /dev/null
+++ b/day04/.gitignore
@@ -0,0 +1,2 @@
+# rust
+target/
diff --git a/day04/.vscode/launch.json b/day04/.vscode/launch.json
new file mode 100644
index 0000000000000000000000000000000000000000..bcb6d3f50ad83f55d2726e3b2caf796f32b6e53d
--- /dev/null
+++ b/day04/.vscode/launch.json
@@ -0,0 +1,45 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "type": "lldb",
+            "request": "launch",
+            "name": "Debug executable 'day02'",
+            "cargo": {
+                "args": [
+                    "build",
+                    "--bin=day02",
+                    "--package=day02"
+                ],
+                "filter": {
+                    "name": "day02",
+                    "kind": "bin"
+                }
+            },
+            "args": [],
+            "cwd": "${workspaceFolder}"
+        },
+        {
+            "type": "lldb",
+            "request": "launch",
+            "name": "Debug unit tests in executable 'day02'",
+            "cargo": {
+                "args": [
+                    "test",
+                    "--no-run",
+                    "--bin=day02",
+                    "--package=day02"
+                ],
+                "filter": {
+                    "name": "day02",
+                    "kind": "bin"
+                }
+            },
+            "args": [],
+            "cwd": "${workspaceFolder}"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/day04/Cargo.lock b/day04/Cargo.lock
new file mode 100644
index 0000000000000000000000000000000000000000..52d399b3aa10d79dff5263a81292d58925e5483d
--- /dev/null
+++ b/day04/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "day02"
+version = "0.1.0"
diff --git a/day04/Cargo.toml b/day04/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..843335d53c02f6ebc00a7c472a5e6e72b8e48afa
--- /dev/null
+++ b/day04/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "day02"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/day04/data.txt b/day04/data.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2c7a65a4e3c31a71279e690492b28a94365d166e
--- /dev/null
+++ b/day04/data.txt
@@ -0,0 +1,216 @@
+Card   1: 84 17 45 77 11 66 94 28 71 70 | 45 51 86 83 53 58 64 30 67 96 41 89  8 17 33 50 80 84  6  2 87 72 27 63 77
+Card   2: 18 17 59  8 78 79 34 35 48 73 | 61 49 59 99 77  8 79 64 36  6  3 67  4 90 83 22  9 82 39 78 92 42 33 70 17
+Card   3: 60 78 77 44 62 54 94 50 32 11 |  2  6 89 50 11 60 57 53 71 44 47 62 49 42 73 78 77 54 99 29 35 94 32 68 74
+Card   4: 74 19 54  9 79 24 21 88 53  7 | 21 30 53 62 74 79 54 19 45 67  7 80 16 24 89 38 71 41 88 47  5  9  4 73 97
+Card   5: 68 18 23 55  9 60 82 27 76 16 | 55 26 12 23 74  7 58 29 45 86  5  6 93 87 14  2 66 22 60 78 17  9 34 67 71
+Card   6: 53 11 94 57 45 24 20  1  8 92 | 29 66 16 45 48 98 61 49  8 56 94 28 19 67 24 20 97 57  1 75  5 85 35 82 12
+Card   7: 99 29 90 82 88 72 84 36 53 81 | 93 22  9 59 15 81 32 98 28 96 53  2 90 99 92 74 82 65 72 33 31  7  1 97 36
+Card   8: 71  3 88  1 35 32  2 59  8 92 | 33 59  2 87  1 80 93 76 71 98 10 17 32 89 85  8 35 16 92 19 46 49  3 54 88
+Card   9: 19 14 92 73 64 53 59 24 76 65 | 76 29 55 79 88 92 43 37 99  4 96 19 69 53  2 52 33  3 73 35 82  5 85 14 57
+Card  10: 39  3 43 61 53 40 89 16 60 12 | 47 44 63  1 67 26 55 12 20 68 78 92 56 32 74 76 22 42 71 88 33 11 94 18 89
+Card  11: 55 43 88 90 60 93 58  2 89  4 | 69 89 58 75 18 43 80 40 72 81 37 22 34 60 33 65 88 50 90 39 87  2  7  4 55
+Card  12: 60 41 82 51 83 87 19 88 24 76 | 43 22 64 88 30 14 19 83 99 81 51 82 25 45 35 65 53 13 86 34 60 58 84 15 11
+Card  13: 36 23 86 64  5 46 41 24 53 16 | 41 46 57 83 35 63 65 43 64 59 82 24 75 54 23 22 45 36 48 53 61 86  5 16 74
+Card  14: 95 49 89 23 59 77 85 16 20 25 | 28 65 51 90 81 44 86 60 78 82 19 37 18 22 93 50 94 13 48 30  7  9 49 43 89
+Card  15: 78 68 34 44 80 25 70 98 71 99 | 80 73 44 20 38 34 70 57 75 77 98 40 55 71 19 67 32 10 60 94 62 68 22 13 66
+Card  16: 19 47  8 42 85 14 35 24 95 61 | 51 33 98 48 14 25 62 40 37 77 91  8  6 35 63 20 11 97 27 89  1 72 57 31 78
+Card  17: 99 36 90 26 17 86  1 83 97 29 | 44 67 36 33 19 54 84 21 17 83 26 13 64 99  1  7 95 29 90 45 43 89 32 82 81
+Card  18: 44 18 77 17 73 41 36 33 98 96 |  7 71  3 63 26 55 12 20 86 51 31 50 49 23 85 62 79 61 22 80 99 27  8 30 83
+Card  19: 93 51 80 97 98 40 81 62 91 42 |  9 27 31 29 34 35 52 46 76 39 28 14 45 58 33 18 89 60 92 22 13 17 26 71 53
+Card  20: 43 52 12 79 87 31 63 69 70 39 | 18 51 75 37 64 53 36 13 77  9 93  4 19 43 86 52 42 31 90 41 16 23 98 85 20
+Card  21: 74 10 94 30 26 66 43 35 38 81 | 68 91 83 61  5 10 78 23 93 81 95 49 33 29 39 82 86 66 58 72  3 63 67  1 18
+Card  22: 76  5 94 78 96 31 70 19 77 48 | 23 74 36 90 82 57  4 38 21 20 92 67 51  8 33 68  3 25 99  2 10 78  6 29 44
+Card  23: 79 68 54 32 86 26 69 28 80 19 | 34 42  7 88 14 78 99 37 89 15  3 22 91 23 60  9 35 19 92 70 75 20 96 29 57
+Card  24: 75 92  1 74 31  7 40 58 66 13 | 18 93 33 39 34  3 50 53 98 29 44 92 59 38 83  5 23 52 37 72 80  8 24 26 46
+Card  25: 82 34 19 18 77 27 52 85 41  6 | 32 44  3 89 21 57 45 24 86 25 96  2 58 40 12 16 73 15 64 80 47 43 53 51 92
+Card  26: 71 43 90 23 40 59 93 99 56 97 | 84  7 99 90 16 97 70 54 40 59 36 71 23 81 33 62 77 93 56 87 39 43 24 42  1
+Card  27:  8 51 91 67  4 72 63 94 26 40 | 15 72 63  9 20 56 24 51 79 67 55  8 40  4 66 46 91 13 64 26 37 43 94 60 75
+Card  28: 68 46 58 60 62 37 52  1 51 55 | 97 82 95 52 51 74 60 70 62 48 22 20 98 33 45 55 68  1 56 58 46 91 36 37 89
+Card  29: 19 56 81 51 63 31 14 35 70 66 | 69 47 39  3 85 29 84 86 33  6 40 24 23 74 38  9 95 77  5 76 17 12 27 75 83
+Card  30: 25 76 38 75 63 17 29 69 55 18 | 75 99 21  2  9 13 82 86 44 51 33 29 60 55 59 96 25 56 49 18 46 91 64  3 38
+Card  31: 19 54 77 99 85 67 26 30 46 95 | 85 13 46 71 37 32 35 77 76 79  3 66 56 58 48 73 26 54 29 55 33 45 22 67 99
+Card  32: 10 31 83 87 47 89 99 46 58 77 | 76 81 64 53  3 83 30 34 91 48 85 29 17 47 89 75 26 18 40 62 49  4 87 20 36
+Card  33: 72 17 14 67 40 23  6 92 32 66 | 40 18 79 70 41 66 23 32 67 87 99 53  2 17 20 58 29 74 55  3 43 92 13  1 78
+Card  34: 53 70 50 43 64 46 99  6 28 69 |  6 26 47 71 86 69 30 99 72  5 70 92 53 48 81 43 46 50 64 76 10 28  8 89 14
+Card  35: 73 83 59  4 12  7 28 68 52 15 | 72 32 62 51 82  5 34 91 53 68 85  7 30 58 95 22 38 86 55 24 89 78 70 45 96
+Card  36: 95 28 59 24 98 92 65 25 57 79 | 83 18 79 76 22 57 59 99 20 21 32 69 51 25 30 26 62 65 95 61 82 12 56 35 88
+Card  37: 20 74 51 16 35 60  2 64 80 87 | 87 68 49 90 84 29  2 22 61 44 28 74 52 66 93  9 60 92 95 38 53 25 69 14 81
+Card  38: 11 82 13 81 29 43  7 84 57 93 |  8 97 27 91 24 41 54  1 38 95 26 49 14 30 70  9 80 63 59 69 65 68 18 98 33
+Card  39: 71 42 26 48 36 97 76 41  1 74 | 34 93 36 99 20 22 62 61 97 79  1 82 31 42 91 74 59 76 32 70 25 41 55 64 48
+Card  40: 75 14 44 80 31 95 23 21 84 35 |  3 30 54 80 83 84  7 75 74 14 23 95 89 35 53 90 36 43 18 11 88 25 59 73 41
+Card  41:  6 76 63 25 77 26 39 44 52 36 | 33 57 27 84 89 18 28 96 12 20  7 48 78 92 22  8 34 41 90 53 17 80 83 52 77
+Card  42: 23 35 45 21 31 72 20 37 80 47 | 32 59 16 84 31 29 89 62  6 97 92 51 43 20 34  7 42 52 61 37 65 73 17 75 38
+Card  43: 75 41 80  9 48 61 16 98 55 54 | 27 52 43 37 72 65 39 53 63 12 64 98 93 16 50 11 51 33 45 42  8 13 57  5 14
+Card  44: 36 80 89 60 54 95 72 83 63 15 | 10 67 58 47 49 86 16 42 82 68 71 12 53 66 50 57 43 34 74 56  5 64 37 21  9
+Card  45: 33 34 99 72 44 49 77 57 90 55 | 76 63 68 97 35 95 65 64 11 52 58 21 48  2 47 29 89 83  7 40 67 79 74 60  8
+Card  46: 35 31 36 91 45 25 14 74 40 56 | 65 88 18 28 20 76 51 95 27 79 50 64 70  5 30 78 10 46 32 41  9 16 60 69  3
+Card  47: 48 16 58 66 64 80 55 93  5 89 | 31 54 67 47 27 69 76 61 70 43 77 90  7 81 83 21 88 13 36 87 25 40 96  2  6
+Card  48: 34 51 39 29 61 97  5 55  6 31 | 19 55 70 83 29 31 60 35 97  8 82 73 61 16 59 47 50 39  6  2  5 34 62 46 51
+Card  49: 72 38 25 61 77 40 79 56 81 23 | 85 86 20 61 98 73 54 44 21 70 96 59 66 64 39 77 32 78 26 79  6  4 81 30 23
+Card  50: 71 94 82 16 91 67 63 81 29 87 | 67 63  8 16 93 40 23 28 20 87 68 79 33 71 85 84 11 88 37 41 13 58 49 19 44
+Card  51: 54 65 59 85 76 94 20 37 21 58 | 24 74 49 62 68 66 20 50 19 80 79 47 99 92 45 48 26 33 27 57 87 18 72 84  3
+Card  52: 45  3 97 88 72 95 18 31 27 74 | 27 78 66 72 43 80 14 65 62 88 31 98 36 81  6 45 63 53 40 76 97 16 38 48 56
+Card  53: 18 12 41 46 93 51 17 27 35 36 | 97 57 68 96 83 89 17 34 62 73 60 71 53 91 70 19 36 16 92  8 35 39 61 65 31
+Card  54: 59 38 12 95 31 15 37 10 51 24 | 26 77 10 92 85 28 11 83 59 87  9 88 37 19 21 80 75 63 24 51 69 71 64 35 61
+Card  55: 74 37 96 86 89 24  7 10 71 55 | 48 80 42 27 72  9 45 99 33 17  8  5 53 73 87 82 16 29 83 60 35 68 75 91  6
+Card  56: 52 34  5 51 99 12 21 43 66 70 | 67 78 31 28 34 32 98 51 26 79 61 36 21 20 16 75  9  1 47 95 25 91 70 88  7
+Card  57: 49 52 63 19 98 28 76 60 34 93 | 42 31 33 37 45  2 66 34 21 17 15 78 98 52 70 27 49 63  4 19 28 25 99 47 35
+Card  58: 14 34  6 75 41 78 22 82 94 37 | 19 73  9 79 35 50 28 72 95 43 59 25 96 88  1  7 66 83 49 12 76 15 69 22 77
+Card  59:  8 42 66 43  4 56 12 25 68 44 | 52 32 22 37 46 89 43 94 11 38 33 71 66 70 44  8 76 65 96 25 35 41 73  3 15
+Card  60: 25 88 30 47 95 86 74 73  8 71 | 48 75 63 21 41 46 20 84  6 73 80 92 10 65 76  8 58 61 12 93 14 86 31 25 44
+Card  61:  8 68 85 74  4 56 46 32 81 76 | 96 32 97 54 40 99 44  1 81 12 21 29 89 14 93  6 11 10 84 67 79 65 94 80 13
+Card  62: 89 23 99 79 74 21 56 95 88 15 | 46 71 66 34 38 11 17 78 36 97 81 32 83 99 20 70 87 54 76 57 39 12 58 48  7
+Card  63: 93 28 55 70 42  4 12 31 68 94 | 90 39  3 54 61 59 84 19 14 51 71 76 99 98 47 92 37 23 52 20 95 41 24 29 44
+Card  64: 47 40 81 29 24 75 17 93 65 87 | 84  7 70 62 37 55 78 58 75  2 15 63 92 10 42 36 98  8  4 64 79 95 30 76 40
+Card  65: 26 91 19 74 68 90 23 28 18 69 | 25 83 80 46 56 43 15 41 66 87 67 89 47 82 10 35 54 24 70 30 77 34 52 97 21
+Card  66: 22 94 30 78 32 62 41 48 63 38 | 67 86 53 68 87 57 17 80 93 44  4 76 11 28 40 84 88 39  1 58 73 98 54 55 37
+Card  67:  8 41 49 70 13 18 71 12 53 76 | 18 71 21 70 38 53 27 25 36 12 41  8 59 95 60 13 76  4 49 74 20 93 30 54 87
+Card  68: 40 27 63 87 17 18 23 33  9 95 |  9 40 44 63 43 57 46 95 33 32 87 70 23 72 71 67 52 60 18 17 27 84 88 19 99
+Card  69: 30 28 12 55 80 84 75 72 53 43 | 80 55 37 18 16 76 74 75 81 60 12 43 28 49 32 61 87 47 79 30 83 72 64 53 84
+Card  70: 44  2 87 68  6 34 93  4 66 22 | 59 34 64 65 13 55 73 50 85 47 38 86 93 27 66 77 74 31 22 87 40  4 72 71 81
+Card  71:  7 11 12 49 37 86 14 57 35  9 | 57  3  7 36 79 28 35 11 71 86 37 62 15 78 12 21  2  9 81 63 77 24 14 47 61
+Card  72: 49 68 24 95 40 97 28 30 41 73 | 90 15 56 48 85 88 82 75 78 40 66 93 21 91 95 84 41 97 36 70 96  8  5 34 87
+Card  73:  7 59 40 43 68 41 79 90 29 50 | 20 59 90 25 92 44 55 41  7 32  9  6  8 61 93 65 37 49 85 14 27 63 48 62  3
+Card  74: 56 43 88 26 96 63 19 23 44 59 | 95 93 88 96 21 34 75 63 56 57 87 83 59 26 16 51 47 44 32 40 27 43 42 23 19
+Card  75: 68  3 93 45 95 76 17  5 19 18 | 57  7  4 17 68  3 34 18 50 95 69 19 88  8 80 49 45 81  6  5 46 93 91 48 76
+Card  76: 86 94 77 92 71 97 96 38 15 37 | 81 37  6 70 96 38 97 15 98 47 39 55 92 90 28 83 94 77 86 45 71 64 99 46 87
+Card  77: 88 71 94 86 72  8 99 32 92 44 | 44 91 76 81 78 15 58 12 45 95 88 89 70 41 86 94  7 75  2 18 72 32 46  6 13
+Card  78: 53 44 42 87 67 59 85 49 15 29 | 83 80 44 86 50 85 81  1 14 92 95 73 71  8 54 77 20 42 13 10  9 47 89 76 49
+Card  79: 14 81 21  3 39 71 53 45 67 32 | 88 19 26 86 28  3 81 27 12 58  1 97 20 39 10 32 31 76  8 75 45 91 94 23 66
+Card  80: 36 29 58 81 65 55 42 82 38 50 | 13 91 71 75 44 16  8 62 36 58 32 78 65 12 53  2 61 27 17 95 11 48 98 81 34
+Card  81: 12 15 33 90 61 45 85 64  8 21 | 54 47 56 34 18 68 77 21  9 30 37 25 26 28 62 83 70 19 49 91 90 69 96 93  3
+Card  82: 21 88 22 24  7 89 12 72 67 18 | 85 47  9 10 28 51 20 14 11  2 12 30 24 19 31 22 81 72 84 23 29 46 75 52 69
+Card  83: 47 12 55 65  1 19 56 94 71 24 |  3 78 39 47 16  4 83 62 89 76 55 58 70 31 34 20 61 18 74 80 75 98 25 41 79
+Card  84: 87 75 63 51 68 14 25 69 19 94 | 41 65 34 31 56 71 11 98 78 22 15 50 80 82 72 48 44 47  4 28 95 84 54 23 92
+Card  85: 70  4  9 94 30 35 71 63 11 47 | 34 47 61 85 86 22 54 72 98 16 39 20 50 74 96 62 49 31 52  5 64 81 66 55 32
+Card  86: 48 74  6 58 71 95 55 84 54 22 | 69 79 87 34  1 52 11 85  6 98 86 29 40 10 42 41 50 78 93 90  4  9 18 19 31
+Card  87: 12  8 89 92 30 23 57 45 13 82 | 79 31 44 97 20 43 64 25 22 39 93  5 61 37 16 18 85 27 67 14 53  3 83 60 94
+Card  88: 26 74 88 33 31 38  6 34 28 93 | 83 68 76  2 33 53 62  6 30 46 71  7 34 51 67 80 91 38 42 78 94 74 25 50 31
+Card  89: 74 52 44 14 11 23 67 27 63 60 | 63 62 97 78  2 47 35 14 65 81 59 69 43 68 90 73 86 28  8 88 19 79 60 32 72
+Card  90: 42 72 51 58 59 69 83 99 75 46 | 27 69  4 30 58 94 49 59 35 97 83 51 43 99 46 75 72 13 14 47 17 42 63 87 93
+Card  91: 95 83 20 79 80 49 12 91 66 31 | 16 75 64 22 43 85 47 12 11 82 50 46 24 77 31 35 55 95 72 34 67 69 74 38 88
+Card  92: 54 33 19 68 90 13 49 43 50 32 | 59 30  1 93 23  9 64 14 67 63 13 31 70 60 24 62  6 56 43 72 35 22 26 73 61
+Card  93: 65 84 41 37 73 85 25 30 10 92 | 45 52 80  2 38 36 84 37 26 96 25 67 65 91 41 63 72 99 51 30 39 85 66 32 10
+Card  94: 20 93  9 21 82 68 39 98 78 79 | 94 53 60 82 67 34 71 21 29 15 69 98 92 87 19 91 56 17 81 78 30 16 90 72 20
+Card  95: 46 74 75  2 31 92 19  9 56 86 | 74 46  9 90 40 34 12 45 75 38 86 21 19 31  2 91 56 26 44  7 97 88 13 51 92
+Card  96: 19 45 71  9 74 26 49 80  7 72 | 88 22 94 76 95 10  5  1 72 68  2 30 42 57 20 38  6  8 65 59 12 61 64 52 69
+Card  97: 20 98 54 72 79 64 89 93 94 38 | 22 11 32 78  6 70 84 24 57 55 60 36 52 76 67 47 79 90 56 50 66 83 39 77 82
+Card  98: 31 48 72 30 73 13  8 86 19 96 | 30 55 48 13 95 19 42 99  2 72 59 86 31  8 28 98 10 63 73 96 81 58 40 38 39
+Card  99: 46 56 65 82 13 24 31 89 74 94 | 34 38 43 24 13 46 60 83 12 69 57 18 65 96 56 80 50 35 32 23 66 31 77 74 49
+Card 100: 93 90 23 71 16 47 15 49 73 21 | 54 14 92 44 20 87 48  3 15 88 83  2 12 39 70 49 64 21 94 27 45 89 99 98  8
+Card 101: 80 36 73 54 67 32 46 13 59 82 | 70 86 31 34 85 20 89 50 46 82 30 79 67 16 12 54 96 47  7 74 35 32 19 75 26
+Card 102: 21 42 89  6 12 13 43 24  3 71 | 38 14  9 56 49 43 42 61 86 95  6 72 98 99 66 50  1 63 55 10 37 46 97 36 59
+Card 103: 58 26 67  8  3 69 20 87 17 31 | 69 38 41 32 52  5 42 17 91  9 51 44 93 20 84 58 21 19 49 71 55 36 14 67  3
+Card 104: 65 15 42 44 25 84 48 80 86 37 | 52 75 26 65 33 32 48 11 41 64 62 13 31 74 89 54 85 34 42 27 98 68 46 39 19
+Card 105: 30 22 55 93 10 83 94 73 86 38 | 23 45 79 80 86  3 53 70 91 77 11 83 65 63 12 29 14 32 27 84 31 78 25  6 90
+Card 106:  3  4 83 71 10 23 75 50 17 53 | 57 54  9 50 33 51 10  7 14 82 46 13  3 34 52 87 67 48 61 28 64 30 78 92 38
+Card 107: 14 87 53  2 33  5 44 55 73 69 |  4 34 58  6 41 36 16 64 32 51 82 38 47 15 94 83 77  8  5 27 52 74 84 63 14
+Card 108: 11 18 31 60 50 95 88 15 63 94 | 80 72 74 34 26 52 70 62 61 12  8 81 19 44  4 21 43 51 79 47 25 17 91 83 24
+Card 109: 71 79 65 17 88 92 93 95 96 27 | 28 23 61 39 26 10 32 75 36 57 97 63 78 62 59  3  1 74 80 72  9 68  2 91 20
+Card 110: 96 79 43 89 47 91  9 64 66 23 | 78 60 70 50 62  9 34 66 56 26 43 74 79 19 51 17 31 89 47 91 64 23 69 42 96
+Card 111:  1 29 47 53 62 84 22 13 69 94 | 74 22 91 42  3 53 45 88 29 48 26 62 96 50 41 47 54 94 39 13 72 31 69 84  1
+Card 112: 50 29 75 86 56 24 99 35 85 34 | 81 90 80 17 32 50 65 24 35  5 92 53 56 86 13 20 31 34 46 85 63 99 33 41 29
+Card 113: 35 92  5 83 68 59 23  2 78 87 | 40  2  3  5 43 10 92 51 59  8 24 78 64 57 52 97 26 74 85 62 14 72 86 29  1
+Card 114: 70 62 96 47 77 11 57 75 65 37 | 51 75 16 58 42 14 77 31 26 21 86 12 36 78 76 73 54 41 49  4 30 52  7 38 74
+Card 115: 12  9 70 13 49 31 58 44 30  3 | 80 14 49 55 93  1 90 35 75 39 33 91 82 66  9 50 62 40 31 34 41 27 87 85 37
+Card 116: 49 32 55 59 71 64 73 44 34 41 | 44 41 95 12 34 13 65 73 27 80 81 43 86 40 58 31 64 68 49 74 92 14 26 17  1
+Card 117: 86 32 48 53 34 26 19 38 14  8 |  8 48 39 19 89 97 44 26 88 27 66 81 60 56 38 54 43 53 63 32 14 86 94 34 30
+Card 118: 33 13 53  8  5 65 62 36 69  6 | 30 41 28 69 18  2 29 92 68 39 61 24 97 33 84 34 76 71 53 45 20 31  5  8  6
+Card 119: 87 74 99 12 41 76  5 14 85  8 | 94 46 88  7 52 60 67 58 72 29 38 99 78 39 22 76 41 71 98  5 95 74 35 68 47
+Card 120: 47 69 25 35 82 71 89 98 23  4 | 44 61 55 23 22  7 83 35 30 81 49 72 47 67 57  5 12 50 71 42 60  1 26 69 36
+Card 121: 71  7  4 64 63 39 93 26 56 61 | 85 69 58 38 25 79 61 47 67 59 95 94 88 62 27 20 66 60 87 13 65 93 53 72 89
+Card 122: 28 73 39 35  7 97 58 16 52  6 | 62 42 21 49 72 70 13 47 69 76 96 19  1 11 92 78 85 64  7 95 29 22 36  9  2
+Card 123: 92 87 70 37 30 49 35  8 63 28 | 38 84 87 35 20 23  4 30 34 60 70 68 81 49 41  7 89 22 93 97 25 28 46 24 92
+Card 124: 32 79 16 89 78 95 70 28 84 71 | 60 12 91 67 68 15 62  7  8 47 64 85 44 83 19 76 71 92  9 98  6 80 27  5 38
+Card 125: 33 88 37 58 48 18 27 98 11 71 | 10 35 58 81 46 41 37 92 91 23 98 79  7  9 65 36 25 39 93 62 77  6 28 20 97
+Card 126: 86 92 60 52 71 44 80 77 51 75 | 36 55 29 87 24 59 80 92 71 38 61 47 37  3 52 57  7 51 13 74 39 35 44 27 75
+Card 127: 81 11 96 68 39 58 42 16 41 78 | 18 68 43 55 42 29  9 72 81 96 11  5 49 32 46 41 15 88 99  4 50 13 60  8 39
+Card 128: 63 48  8 70 21 46 47 90 69 43 | 60 43 93  6 49 98 87 42 25 85 81 39 78 57 95 36 20 64 47 22 77 16 24 26 30
+Card 129: 49  3 17 30 71 74 41 24 67 82 | 88 40 70 72 74 20 44 93 96 94 59 58 49 87 30 90 86 85 47 60  6  8  4 12 55
+Card 130: 29 21 10 94 70 69 45 59 56 36 | 86 91 19 46  1 85 55 34 96 38 73 39 87 71 12 40 47  5 64 78 95 27 33 28 88
+Card 131: 17  5 65 61 87  1 94 38 50 12 | 29 15 99 62 81  8 75 49 48 74 14 19 13 88 39 85 23 77  9 71 92 86 11 98 91
+Card 132:  7 74 28 29 67 69  4 80 87 61 | 11 84 52  5 51  3 66 81 37 83 40 25 32 23 53 19  6 97 22 35 41  8 90 20 59
+Card 133: 88 78 53 13 20 57 98 23 71 44 | 73 16 84 76 72 34 25 65  4 32 59 10 45 31 74 94 62  8 80 58 50 49 91 26 90
+Card 134: 62 93 37 84 29  6 63 81 11 60 | 58 25 71 48 52 28 44 21 18 27 82 96 51 38 78 90 75 36  5 15 24 88 42 97 49
+Card 135: 45 59 29 47 95 25 69 60 15 91 | 93 91 53 14 64 86 34 37 69 25 15 29  7 32 47 67 76 95 82 60 38 45 59 89 55
+Card 136: 19 13 68 41 57 90 73 82  1 64 | 16 64  7 19 75 73 94 82 51 26 13 90 23 68 45  1 56 30 24 41 72 66 78 57 18
+Card 137: 25 92 31 12 98 59 11 96 38 90 | 33 99 59  3 96 98 11 65 85 17 47 72 39 92 48 74 31 12 95 90 62 84 25 55 38
+Card 138: 82 49 58 18 86 67 89 13 20 83 | 58  2  9 93 18 67  4 53 83 64 13 89 65 82  6 87 15 46 76 61 20 12 44 49 86
+Card 139: 62 59 76 63 48 10  7 65 12 51 | 15  4 63 44 29 66 95 27 26 46 85 17 47 10 60 80 35 61 78 42 86 28 23 71 64
+Card 140: 81 56 73 71 76 59 44 27 60 79 | 44 34 84 37 47 71 87 98  1 73 27 62 33 76 59 24 95 52 79 60 48 96 54 25 81
+Card 141: 12 87 21 65 60  8 79 90 89 30 | 31 98 23 40  9 60 48 34 46 26 79 87 54 99 80 84 21 58 65 30 12 88  8 89 90
+Card 142: 75 39 34 23 61  3 68  1  7 87 |  4 68 75 39 82  7 10 67 71 38 34 96 49 26 63 14  1 29 61 54 98 87  3  9 23
+Card 143: 61 54 86 76 53 96 30 93 90 75 | 33 72 67 70 15 94 26 85 75 16 21 62  2 42 88 11 77  9 31 34 35 65 55 63  1
+Card 144: 28 45 76 99 49 80 58 46 65 97 | 85 90  2 47 12 10 87 23 92 64 37 79 70 18 14 38 81 33  6  8 25 30 69 15 56
+Card 145: 92 22 36 28 81 93  5 64 16 72 | 75 45 34 15 86 53 21 89 58 84 83 20 26 35 82 33 10 66 96 91 25 73 76 69 79
+Card 146: 55 16 86 22 85 24 49  1  6 88 | 88  1 21 41 58 24 22 61 82 16 30 54  6 49 56 46 67 42 91 80 85 86 55 87 94
+Card 147: 52 33 10 21 60 97 47 15 74 78 | 63 45 49  6 53 11 93 69 37 12 77 25 46 16 35 31  8 23 51 13 30 48 94 86 17
+Card 148:  8 90 28 18 85 60 70 49 88 84 | 19 16 89 62 40 45  9 65 35 21  1 50 37 17  4  7 29 70 95 31 97 14 53 59 46
+Card 149: 38 71 19 83 63 36 35  8 54 49 | 27 98 64 72 10 94 23  5 76 60 66 37 89 13 47 82 86 44 20 15  4 92 71 45  7
+Card 150: 95 13 30 16 70 44 37 14 97 20 | 14 17 43 45 84 74 97 62 93 56 44 23 83 22 26 50  2 69 60 55 99  8 68 47 96
+Card 151: 85 52 96 47 66 70 82 32 60 10 | 86 22 24 43 35 91 77 94 58  5 73  7 10  8 51 96 74 79 80 70 52 75 39 60 32
+Card 152: 11 66 37 47  6 56 42  7 35 87 | 56 39 33 61 93 26 76 47 32 86 60 25 69 62 68 42 67 37 82 35 72 15 75 31  5
+Card 153: 93 10 79 92 26  2 81  3 61 89 | 69 72 71 87 95 42 48 90 75 27 84 14 47 96 85 19 79 23  1 68 77 53 94 22 91
+Card 154:  5 89 99 64 93 95 34  8 84 77 | 16 45 88 39 66  9 90 83 36 46 40 58 75 32 80 87 23 61 30 69 74 42 33  7 34
+Card 155: 11 88 66 21 38  3 79 24 84 74 | 98 76 64  5 12 57 65 75  6 92 96  7 93 28  4 34  8  2 45 22 69 32 73 95 55
+Card 156: 62 61 83 13  8 44 91 69 78 93 | 51 96  1 58 26 46 10 35 23 40 82 11  2 76 84  6 17 16 29 32 90 20 85 42 94
+Card 157: 37 99 26 32 18  8 71  9 89 57 | 65 50 36 83 43 25 17  6 55 85 63 81 39 59 33 49 44 54 40 66 34 78 15  4 11
+Card 158: 20 11 16 10 78  6 36 84 27 90 | 36 88 16 38 20 78 92  3 72 89 12 48 74 94 85 64 84 87  6 10 76 19 11 90 27
+Card 159: 50 15 63 66 42 25 94 77 10 51 | 94 77 98 25 10 50 23 72  4 15 63 84 11 86 42 38  8 51 92 96 18 89 70 43 66
+Card 160:  4 98 12 61 31  1 99 41 45 15 | 95  8 68 92 27 15 53 33 16 86 72 12 40 98 46 52  4 64 36 48  1 31 45 25 54
+Card 161: 55 49  2 89 15 53 14 82 45 77 | 45 27 77 59  3 83 58 15  2 56 88 89 97 49 14  6 55  7 87  5 82 53 16 21 29
+Card 162: 87 49 63 27 93 78 57 13 88 32 | 94 56 10 86 63 88 60 90 57 85  9  2 93 27 98 32 99 78 13 71 49 64 87 40 34
+Card 163: 65 36 83  8 58 27 15  6 96 10 | 68 48 51 29 10 71 58 36 60 96 50  8 81 83 27 67  6 14 56 74 12 65 35  4 15
+Card 164: 91 31 52 92 36 22 68 71 13 18 | 44 77 63 95 74 33 85 19 25 75 41 71 52 48  3 36 30 88 22 17 86 80 47 42 58
+Card 165: 26 44 66 58 87 27 22 55  1 78 | 94 29 78 21 84  7 49 55 41 82 61 63 26 34 65 12 32 67 44 87 36 57 80 18 92
+Card 166:  9 80 14 37 32 95  8 90 89 97 |  1 17 48 12 63 68 62 50 10 71 83 84  3 44 16 58 38 97  9 53 91 25 14 79 37
+Card 167: 82 85 47 68 10 54  5 71 70 56 | 30 85 12  3 17 28 77 59 96 35 41 47 23  2 13 66 99 46 98 81  4  6 19 15 25
+Card 168: 13 34 12 25 30 60 78 24 31 95 | 84 33 90 89 81 44 69 57 62 79 32 19 59 87 40 21 72 11 42 15 77 53 75  9 88
+Card 169: 75  9 87 31  6  5 73 44 18 98 | 56 39  2 50 65 44 75 30 42 69  3 97  5 58 47 45 36 73 62 48 85 60 26 55 67
+Card 170:  9 53 80  5 14 77 18 48 24 13 | 47 90 98 67 91 95 71 96 19  2 34 69  5 97 11 92  1 80 33 10 81 24 45 48 29
+Card 171: 49 40  2 91 71 90 31 99 88 34 | 55 67 38 68 31 61 73 72 32 83  4 90 81  9 13 23 28 53  1 75 33 44 14 18  2
+Card 172: 83 38 28 78 88 85 34 82 49 96 | 44 69 51 36 54 94 15 22 41 58 14 63 77 82 47 97  8  9 78 24 30 16 96 39 53
+Card 173: 23 76 87 69 31 26 34 67 55 25 | 79 96  8  6  1 19 10 77  3 72 39 44 71 73  9 30 90 97 99 13 23 48 61 34 26
+Card 174: 85  2 18 80 24 41 11 52 46 16 | 22 40 55 84 25 83 23 65 36 50 57 26 48 71  4 15 82 10 33 74 46 73 47 17  9
+Card 175:  2 60 34 23 15 53 32 84 80 33 | 88 11 27 64 65 77 49 43  1 58 91 54 71  6 90 24 37 30 39 29 26 92 81  3 69
+Card 176: 39 71 66 75 67 11 17 80 93 10 | 86 57 76 16 50 88 45 80 58 43 47 18 33 31 54 61 29 40 14 72 34  2 81 94 41
+Card 177: 71 19 23 13  5 44 66 56 65 77 | 86 78 80 37  7 16 15 76  1 18 94 21 41 68 75 72 48 36 28 31 95 91 93 65 29
+Card 178: 60 57 73 17 72 23 96 33  4 75 | 82 70 38 25 67 27 31 97 34 95 87 21 88 76 30 68 51 53 91  9 83  8 55 84 18
+Card 179: 51  5 39 38 22 42 12 73 92 97 | 38  5 92 49 35 32 73 69 81 78 60 74 22 42 51 39 12 11 30 97 37 93 50 52 54
+Card 180:  3 25 43 85  1 94 45 10 19 60 |  6  3 60 43 82 63  2 68  1 61 25 19 96 98 10 85 75  4 45 78 58 62 99 94 12
+Card 181: 56 53  4 17 71 73 60 36 16  3 | 56 61 77 50 17  2 39  6 29 55 81 45 40  4 71 95 67 15 65 27  9 90 86 92 99
+Card 182: 61 71 97 13 62 91 77 41 27  9 | 13 89 25 33  8 41 65 16 18 43 59  6 75 57 48 34 38  3  9 15 45 54 74 88 42
+Card 183: 61 55 75  9 11 48 29 89 42 46 | 71 66 24 26 60 98 97 67 18 51 58 34 69 70 73 39 65 33 96 91 94 57  8 28 54
+Card 184: 34 50 88 24 12 96 58 46  3  9 | 14 48  9 21 85 64 82 57 91 81 28 45 15 26 80 94 88 13 43 98 33 38 17 27 10
+Card 185: 68 49 62 25 69 86  9 92 26 12 |  5 14 66 16 17 68 55 93 31 45 49  7 78 94 33 73 25 84 20 98 60 82 92 95 24
+Card 186: 23 62 36 87 37 34 31 90 82 25 | 47 62 11 42  3 55 90 23 49 50 31 78 34 37 16 25  7 27 36 72 82 13 98 53 87
+Card 187: 94  8 47 24 59 65 77  5 43 63 | 21 16 70 94 34 11  3  1  6  8 88 73 66 83 47 81 27 59 60 65 98 24 63  5 43
+Card 188: 75 13  8 61 69 59 52 29 21 76 | 75 93 66 43 69 58 11  8 92 70 85 41 55 28 62 76 97 80 20 29  3 51 52 72 87
+Card 189:  7 90 29 68 69 44 94 87 58 99 | 98 48 73 68 38 75 41 83 29 67 90 25 40 13 22 63 62 94 58 99 69 19 18 44 66
+Card 190:  7 87 63 80 57 68 30 86 58 64 | 63 11 20 29 49 52 41 60 76 96 85 84 72  6 81 66 47 65  8 48 69 37 36 58 87
+Card 191:  6 71 15 30 42 60 33 17 92 16 | 60 18 65 57 16 53 20 72 59 96 40 47  8 64 81 52 70 67 29 87 35 90 54 85 17
+Card 192: 61 57 38 71 29 32 56 10 87 26 | 59  4 77  2 54 10 40 71 26 97 64 61 45 98 44 12 41 95 50 28 92 11 51 37 36
+Card 193: 40 85 41 83 90 43 10 25  5 97 | 87 17 66 53 44  3 76 57  1 10 96 28 51 16 82 52 89 65 98 93 72 38 13 79 40
+Card 194: 56 51 10  9  4 30 75 60 97 79 | 16  5  1 43 11 66 95 48 25 62 78 14 18 49 72 55 70 69 80 42 52 82 96 12 46
+Card 195: 68 36 39 79 72 45 43 85 65 93 | 97 79 96 25 20 46 63 52 38 89 24 27 57 53 64  3 31 47 14 26 18 74 37 95 58
+Card 196: 97  4 99 92 36 29 22 98 26 32 | 57 25 93 63 40 27 91 37 41 76 19 92 59 78 64 82 84 20 24 52 28 13 48 31 50
+Card 197: 51  3 97 61 84 41 39 66 93 64 | 65 75 90 78 13 79 82 33 10 96 86 19 16 32 30 99 47 92 67 80 62 69 45 15 49
+Card 198: 55 67 89 34 69  7 60 26 90 31 | 66 61 32 54 97 36  2 28  4 77 38 71 19 41 37  6 70 21 93 65  3 73 45 59 13
+Card 199: 14 26 40 92 97 83 99 29 54 60 | 23 60 90 49 18 17 32 83 91 27 54 92 78  9 29 70 61 66 48 95  2 39 88 12 97
+Card 200:  4 69 13  3 98 91 11 81 79  1 | 58 87  3 91 13 48 79 24  6 18  4 65 98 56 12 34  1 81 69 41 14 11 45 64 43
+Card 201: 37 21 55 26 67 29 25 76 15 70 | 58 86 25 95 83 17 76 69  2 51 70 45 26 92  6 54  9 21 77 67 15 84 55 37 61
+Card 202: 28 14  6 73 24 74 68 19 13 58 | 35  5 49 70 46 10 68 38 83 80 92 32 86  2 88 41 15 78 47 95 42 55 96 30 69
+Card 203: 21 23 66 43 77 12 51 14 40 67 | 21 23 45 46 77 31 40 12 75 14 52 89 51 67  6 66 73 16 79  7 48 43 84 95 96
+Card 204: 20 95 43 24 25 52 49 10 83  9 | 17 24 83 88 61 43 49 66 81 95 45 64 31 74 92 52 10  8 25 36 30 94  9 20 89
+Card 205: 39 69 99 92 97 77 52 51 29 53 | 30 84 32 65 91 83 68  5 79 98 16 57  9 20 29 69 88 52 92  1 13 17 39 34 77
+Card 206:  3 80 14  9  5 49 38 22 64 21 | 43 95 34 44 91  1 64 46 29  6 33 16 57 24 86 79 89 73 65 15 56 63 83  3 55
+Card 207: 40 76 42 26 80 31 43  8 84 63 | 73 16 57 19 38 31 84 61 50 60 70 65 81 49 86 13 22 15 40 42 63 69 36 76 37
+Card 208: 16 60  1  5 97 90 86 88 19 82 | 90 14  8 38 43 19 94 40 97 60 88 28 39 99 16 46 76 24 86 84 75 74 53 72  5
+Card 209: 12 93 53 60 41 64 25 74 79 16 | 84 18 30 31  7 65 69 11 77 99 32 89 79 90 52 28 17 38 62 24 85 49 35 43 29
+Card 210: 23 67 11 42 28 59 98 48 26 79 | 14 27 38 82 91  4 95 81 88 44 53 67 74 45 28 99  9 47 68 62 20 54 41 42  8
+Card 211:  2 31 33 18 54  6 30 68 62 60 | 60 63 49 24 73 54 75 39 59 88 64 62 72 61  4  6 26 13 34 36 95  9 74 47 44
+Card 212: 10 80 94 19 76 15 40 64  6 99 | 67 71 65 14 42 32 75 27 60 24  8 43 68 85  4 54 83 44  1  2 57 34 63 22 11
+Card 213: 21 71 66 97 26 80 42 70 89 53 | 16 29 34 79 99 73  9 65 76 19 43 11 35 52 37 25 17 21 12 26 23 82 74 91 70
+Card 214: 85 22 65 54 15  6 78  3 11 94 | 27 10 59 37 40 75 95 29 30 79 57 48 44 76 15 62 89 53  2 32 36  4 63 67 39
+Card 215: 46 68 79 92 50 22 47 89 28 34 | 29 87  6 35 20 81 15 10 71 96 77 44 55 18 98 42 76 26 72 21 95  5 23 11 57
+Card 216: 43 38 30 79 14 47 64  5  8 50 | 70 26 63 98 86 20 59 74  3 41 34 49 78 28 55 67 89 68 60 39 54 94 33 44 80
\ No newline at end of file
diff --git a/day04/flake.lock b/day04/flake.lock
new file mode 100644
index 0000000000000000000000000000000000000000..50d998a12c1b4b13a6460e399a4349b967012056
--- /dev/null
+++ b/day04/flake.lock
@@ -0,0 +1,83 @@
+{
+  "nodes": {
+    "naersk": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1698420672,
+        "narHash": "sha256-/TdeHMPRjjdJub7p7+w55vyABrsJlt5QkznPYy55vKA=",
+        "owner": "nix-community",
+        "repo": "naersk",
+        "rev": "aeb58d5e8faead8980a807c840232697982d47b9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "naersk",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1701539137,
+        "narHash": "sha256-nVO/5QYpf1GwjvtpXhyxx5M3U/WN0MwBro4Lsk+9mL0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "933d7dc155096e7575d207be6fb7792bc9f34f6d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-23.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "naersk": "naersk",
+        "nixpkgs": "nixpkgs",
+        "utils": "utils"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
+    "utils": {
+      "inputs": {
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1701680307,
+        "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/day04/flake.nix b/day04/flake.nix
new file mode 100644
index 0000000000000000000000000000000000000000..84e0293ba6504dcf5d931c318a62166d0a13cf78
--- /dev/null
+++ b/day04/flake.nix
@@ -0,0 +1,28 @@
+{
+  description = "AoC 2023 - day 04";
+
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
+    naersk = {
+      url = "github:nix-community/naersk/master";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    utils.url = "github:numtide/flake-utils";
+  };
+
+  outputs = { self, nixpkgs, utils, naersk }:
+    utils.lib.eachDefaultSystem (system:
+      let
+        pkgs = import nixpkgs { inherit system; };
+        naerskBuildPackage = (conf:
+          (pkgs.callPackage naersk { }).buildPackage ({ src = ./.; } // conf)
+        );
+      in
+      {
+        defaultPackage = naerskBuildPackage { };
+
+        devShell = with pkgs; mkShell {
+          buildInputs = [ cargo rustc rustfmt ];
+        };
+      });
+}
diff --git a/day04/result b/day04/result
new file mode 120000
index 0000000000000000000000000000000000000000..61f62fe635ad813183407ccf7079a8570274e0f0
--- /dev/null
+++ b/day04/result
@@ -0,0 +1 @@
+/nix/store/6c85vcn8gjdjfckmfgfn9mdbfd35nsgy-day02-0.1.0
\ No newline at end of file
diff --git a/day04/src/main.rs b/day04/src/main.rs
new file mode 100644
index 0000000000000000000000000000000000000000..249bc16edad01d5aefef9d3f4041b96fe5f5ed4b
--- /dev/null
+++ b/day04/src/main.rs
@@ -0,0 +1,62 @@
+use std::{fs, io};
+
+fn main() -> io::Result<()> {
+    let data = fs::read_to_string("data.txt")?;
+
+    let solution_a = data
+        .lines()
+        .map(|line| {
+            let (winning, tested) = line
+                .split_once(':')
+                .unwrap()
+                .1
+                .split_once('|')
+                .map(|v| (v.0.trim(), v.1.trim()))
+                .unwrap();
+
+            tested.split_whitespace().fold(1, |acc, n| {
+                if winning.split_whitespace().any(|v| v == n) {
+                    acc * 2
+                } else {
+                    acc
+                }
+            }) / 2
+        })
+        .sum::<u32>();
+
+    println!("{solution_a}");
+
+    let solution_b = data
+        .lines()
+        .map(|line| {
+            line.split_once(':')
+                .unwrap()
+                .1
+                .split_once('|')
+                .map(|v| (v.0.trim(), v.1.trim()))
+                .unwrap()
+        })
+        .enumerate()
+        .fold(
+            vec![1; data.lines().count()],
+            |mut acc, (index, (winning, tested))| {
+                let winning_count = tested
+                    .split_whitespace()
+                    .filter(|&t| winning.split_whitespace().any(|w| w == t))
+                    .count();
+
+                let own_count = acc[index];
+                acc[(index + 1)..=(index + winning_count)]
+                    .iter_mut()
+                    .for_each(|v| *v += own_count);
+
+                acc
+            },
+        )
+        .iter()
+        .sum::<u32>();
+
+    println!("{solution_b}");
+
+    Ok(())
+}
diff --git a/day04/test.txt b/day04/test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71f208a06f54b06db470e22dffaf02b8901eba4a
--- /dev/null
+++ b/day04/test.txt
@@ -0,0 +1,6 @@
+Card 1: 41 48 83 86 17 | 83 86  6 31 17  9 48 53
+Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
+Card 3:  1 21 53 59 44 | 69 82 63 72 16 21 14  1
+Card 4: 41 92 73 84 69 | 59 84 76 51 58  5 54 83
+Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
+Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
\ No newline at end of file
diff --git a/flake.nix b/flake.nix
index 5feb5d0d8e1fc8ea303f1bf20deca4ffa3ef4187..27f782ffa1b6f764cf1079ed566a6d139bcb71b4 100644
--- a/flake.nix
+++ b/flake.nix
@@ -15,6 +15,10 @@
       url = "./day02";
       inputs.nixpkgs.follows = "nixpkgs";
     };
+    day03 = {
+      url = "./day03";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
     naersk = {
       url = "github:nix-community/naersk/master";
       inputs.nixpkgs.follows = "nixpkgs";