From 470f4ab60c0c008980d051ef195ee715b30eeaa3 Mon Sep 17 00:00:00 2001 From: Luke Else Date: Mon, 1 Dec 2025 09:03:07 +0000 Subject: [PATCH] Initial commit --- .devcontainer/devcontainer.json | 25 +++++++++++ .gitea/workflows/test.yaml | 56 ++++++++++++++++++++++++ .gitignore | 30 +++++++++++++ Cargo.toml | 7 +++ LICENSE | 9 ++++ README.md | 3 ++ assets/images/main.png | Bin 0 -> 28691 bytes input/day01 | 0 input/day01_test1 | 0 input/day01_test2 | 0 input/day02 | 0 input/day02_test1 | 0 input/day02_test2 | 0 input/day03 | 0 input/day03_test1 | 0 input/day03_test2 | 0 input/day04 | 0 input/day04_test1 | 0 input/day04_test2 | 0 input/day05 | 0 input/day05_test1 | 0 input/day05_test2 | 0 input/day06 | 0 input/day06_test1 | 0 input/day06_test2 | 0 input/day07 | 0 input/day07_test1 | 0 input/day07_test2 | 0 input/day08 | 0 input/day08_test1 | 0 input/day08_test2 | 0 input/day09 | 0 input/day09_test1 | 0 input/day09_test2 | 0 input/day10 | 0 input/day10_test1 | 0 input/day10_test2 | 0 input/day11 | 0 input/day11_test1 | 0 input/day11_test2 | 0 input/day12 | 0 input/day12_test1 | 0 input/day12_test2 | 0 input/day13 | 0 input/day13_test1 | 0 input/day13_test2 | 0 input/day14 | 0 input/day14_test1 | 0 input/day14_test2 | 0 input/day15 | 0 input/day15_test1 | 0 input/day15_test2 | 0 input/day16 | 0 input/day16_test1 | 0 input/day16_test2 | 0 input/day17 | 0 input/day17_test1 | 0 input/day17_test2 | 0 input/day18 | 0 input/day18_test1 | 0 input/day18_test2 | 0 input/day19 | 0 input/day19_test1 | 0 input/day19_test2 | 0 input/day20 | 0 input/day20_test1 | 0 input/day20_test2 | 0 input/day21 | 0 input/day21_test1 | 0 input/day21_test2 | 0 input/day22 | 0 input/day22_test1 | 0 input/day22_test2 | 0 input/day23 | 0 input/day23_test1 | 0 input/day23_test2 | 0 input/day24 | 0 input/day24_test1 | 0 input/day24_test2 | 0 input/day25 | 0 input/day25_test1 | 0 input/day25_test2 | 0 src/main.rs | 68 +++++++++++++++++++++++++++++ src/solutions/day01.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day02.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day03.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day04.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day05.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day06.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day07.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day08.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day09.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day10.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day11.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day12.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day13.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day14.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day15.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day16.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day17.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day18.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day19.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day20.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day21.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day22.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day23.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day24.rs | 66 +++++++++++++++++++++++++++++ src/solutions/day25.rs | 66 +++++++++++++++++++++++++++++ src/solutions/mod.rs | 73 ++++++++++++++++++++++++++++++++ src/utils.rs | 37 ++++++++++++++++ 110 files changed, 1958 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .gitea/workflows/test.yaml create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/images/main.png create mode 100644 input/day01 create mode 100644 input/day01_test1 create mode 100644 input/day01_test2 create mode 100644 input/day02 create mode 100644 input/day02_test1 create mode 100644 input/day02_test2 create mode 100644 input/day03 create mode 100644 input/day03_test1 create mode 100644 input/day03_test2 create mode 100644 input/day04 create mode 100644 input/day04_test1 create mode 100644 input/day04_test2 create mode 100644 input/day05 create mode 100644 input/day05_test1 create mode 100644 input/day05_test2 create mode 100644 input/day06 create mode 100644 input/day06_test1 create mode 100644 input/day06_test2 create mode 100644 input/day07 create mode 100644 input/day07_test1 create mode 100644 input/day07_test2 create mode 100644 input/day08 create mode 100644 input/day08_test1 create mode 100644 input/day08_test2 create mode 100644 input/day09 create mode 100644 input/day09_test1 create mode 100644 input/day09_test2 create mode 100644 input/day10 create mode 100644 input/day10_test1 create mode 100644 input/day10_test2 create mode 100644 input/day11 create mode 100644 input/day11_test1 create mode 100644 input/day11_test2 create mode 100644 input/day12 create mode 100644 input/day12_test1 create mode 100644 input/day12_test2 create mode 100644 input/day13 create mode 100644 input/day13_test1 create mode 100644 input/day13_test2 create mode 100644 input/day14 create mode 100644 input/day14_test1 create mode 100644 input/day14_test2 create mode 100644 input/day15 create mode 100644 input/day15_test1 create mode 100644 input/day15_test2 create mode 100644 input/day16 create mode 100644 input/day16_test1 create mode 100644 input/day16_test2 create mode 100644 input/day17 create mode 100644 input/day17_test1 create mode 100644 input/day17_test2 create mode 100644 input/day18 create mode 100644 input/day18_test1 create mode 100644 input/day18_test2 create mode 100644 input/day19 create mode 100644 input/day19_test1 create mode 100644 input/day19_test2 create mode 100644 input/day20 create mode 100644 input/day20_test1 create mode 100644 input/day20_test2 create mode 100644 input/day21 create mode 100644 input/day21_test1 create mode 100644 input/day21_test2 create mode 100644 input/day22 create mode 100644 input/day22_test1 create mode 100644 input/day22_test2 create mode 100644 input/day23 create mode 100644 input/day23_test1 create mode 100644 input/day23_test2 create mode 100644 input/day24 create mode 100644 input/day24_test1 create mode 100644 input/day24_test2 create mode 100644 input/day25 create mode 100644 input/day25_test1 create mode 100644 input/day25_test2 create mode 100644 src/main.rs create mode 100644 src/solutions/day01.rs create mode 100644 src/solutions/day02.rs create mode 100644 src/solutions/day03.rs create mode 100644 src/solutions/day04.rs create mode 100644 src/solutions/day05.rs create mode 100644 src/solutions/day06.rs create mode 100644 src/solutions/day07.rs create mode 100644 src/solutions/day08.rs create mode 100644 src/solutions/day09.rs create mode 100644 src/solutions/day10.rs create mode 100644 src/solutions/day11.rs create mode 100644 src/solutions/day12.rs create mode 100644 src/solutions/day13.rs create mode 100644 src/solutions/day14.rs create mode 100644 src/solutions/day15.rs create mode 100644 src/solutions/day16.rs create mode 100644 src/solutions/day17.rs create mode 100644 src/solutions/day18.rs create mode 100644 src/solutions/day19.rs create mode 100644 src/solutions/day20.rs create mode 100644 src/solutions/day21.rs create mode 100644 src/solutions/day22.rs create mode 100644 src/solutions/day23.rs create mode 100644 src/solutions/day24.rs create mode 100644 src/solutions/day25.rs create mode 100644 src/solutions/mod.rs create mode 100644 src/utils.rs diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..d7cf579 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,25 @@ +{ + "name": "AOC", + "image": "git.luke-else.co.uk/luke-else/rust-dev:latest", + "remoteUser": "dev", + "customizations": { + "vscode": { + "settings": { + "editor.formatOnSave": true, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer" + }, + "rust-analyzer.cargo.runBuildScripts": true + }, + "extensions": [ + "ms-azuretools.vscode-docker", + "rust-lang.rust-analyzer", + "tamasfe.even-better-toml", + "vadimcn.vscode-lldb", + "dustypomerleau.rust-syntax" + ] + } + }, + "postCreateCommand": "cargo fetch" +} + diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml new file mode 100644 index 0000000..48d4266 --- /dev/null +++ b/.gitea/workflows/test.yaml @@ -0,0 +1,56 @@ +on: [push, pull_request] + +name: Continuous integration + +jobs: + check: + name: Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: false + - run: cargo check + + test: + name: Test Suite + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: false + - run: cargo test + + fmt: + name: Rustfmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: false + - run: rustup component add rustfmt + - run: cargo fmt --all -- --check + + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: false + - run: rustup component add clippy + - run: cargo clippy -- -D warnings + + build: + name: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + cache: false + - run: cargo build \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24801c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# ---> VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# ---> Rust +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..44d1799 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "advent_of_code_XXXX" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = {version = "1.41.1", features = ["full"]} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4af7a91 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2024 luke-else + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1d41d5d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# AdventOfCodeXXXX + +Advent of Code XXXX Written in Rust. \ No newline at end of file diff --git a/assets/images/main.png b/assets/images/main.png new file mode 100644 index 0000000000000000000000000000000000000000..88eebf85fafa742f49baa76b21e47c7c24754b4b GIT binary patch literal 28691 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 literal 0 HcmV?d00001 diff --git a/input/day01 b/input/day01 new file mode 100644 index 0000000..e69de29 diff --git a/input/day01_test1 b/input/day01_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day01_test2 b/input/day01_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day02 b/input/day02 new file mode 100644 index 0000000..e69de29 diff --git a/input/day02_test1 b/input/day02_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day02_test2 b/input/day02_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day03 b/input/day03 new file mode 100644 index 0000000..e69de29 diff --git a/input/day03_test1 b/input/day03_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day03_test2 b/input/day03_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day04 b/input/day04 new file mode 100644 index 0000000..e69de29 diff --git a/input/day04_test1 b/input/day04_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day04_test2 b/input/day04_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day05 b/input/day05 new file mode 100644 index 0000000..e69de29 diff --git a/input/day05_test1 b/input/day05_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day05_test2 b/input/day05_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day06 b/input/day06 new file mode 100644 index 0000000..e69de29 diff --git a/input/day06_test1 b/input/day06_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day06_test2 b/input/day06_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day07 b/input/day07 new file mode 100644 index 0000000..e69de29 diff --git a/input/day07_test1 b/input/day07_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day07_test2 b/input/day07_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day08 b/input/day08 new file mode 100644 index 0000000..e69de29 diff --git a/input/day08_test1 b/input/day08_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day08_test2 b/input/day08_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day09 b/input/day09 new file mode 100644 index 0000000..e69de29 diff --git a/input/day09_test1 b/input/day09_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day09_test2 b/input/day09_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day10 b/input/day10 new file mode 100644 index 0000000..e69de29 diff --git a/input/day10_test1 b/input/day10_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day10_test2 b/input/day10_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day11 b/input/day11 new file mode 100644 index 0000000..e69de29 diff --git a/input/day11_test1 b/input/day11_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day11_test2 b/input/day11_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day12 b/input/day12 new file mode 100644 index 0000000..e69de29 diff --git a/input/day12_test1 b/input/day12_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day12_test2 b/input/day12_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day13 b/input/day13 new file mode 100644 index 0000000..e69de29 diff --git a/input/day13_test1 b/input/day13_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day13_test2 b/input/day13_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day14 b/input/day14 new file mode 100644 index 0000000..e69de29 diff --git a/input/day14_test1 b/input/day14_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day14_test2 b/input/day14_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day15 b/input/day15 new file mode 100644 index 0000000..e69de29 diff --git a/input/day15_test1 b/input/day15_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day15_test2 b/input/day15_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day16 b/input/day16 new file mode 100644 index 0000000..e69de29 diff --git a/input/day16_test1 b/input/day16_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day16_test2 b/input/day16_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day17 b/input/day17 new file mode 100644 index 0000000..e69de29 diff --git a/input/day17_test1 b/input/day17_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day17_test2 b/input/day17_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day18 b/input/day18 new file mode 100644 index 0000000..e69de29 diff --git a/input/day18_test1 b/input/day18_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day18_test2 b/input/day18_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day19 b/input/day19 new file mode 100644 index 0000000..e69de29 diff --git a/input/day19_test1 b/input/day19_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day19_test2 b/input/day19_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day20 b/input/day20 new file mode 100644 index 0000000..e69de29 diff --git a/input/day20_test1 b/input/day20_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day20_test2 b/input/day20_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day21 b/input/day21 new file mode 100644 index 0000000..e69de29 diff --git a/input/day21_test1 b/input/day21_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day21_test2 b/input/day21_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day22 b/input/day22 new file mode 100644 index 0000000..e69de29 diff --git a/input/day22_test1 b/input/day22_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day22_test2 b/input/day22_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day23 b/input/day23 new file mode 100644 index 0000000..e69de29 diff --git a/input/day23_test1 b/input/day23_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day23_test2 b/input/day23_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day24 b/input/day24 new file mode 100644 index 0000000..e69de29 diff --git a/input/day24_test1 b/input/day24_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day24_test2 b/input/day24_test2 new file mode 100644 index 0000000..e69de29 diff --git a/input/day25 b/input/day25 new file mode 100644 index 0000000..e69de29 diff --git a/input/day25_test1 b/input/day25_test1 new file mode 100644 index 0000000..e69de29 diff --git a/input/day25_test2 b/input/day25_test2 new file mode 100644 index 0000000..e69de29 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f19220b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,68 @@ +mod solutions; +mod utils; + +use std::{error::Error, time::SystemTime}; + +use solutions::*; + +#[tokio::main] +async fn main() -> Result<(), Box> { + /* Uncomment these before the start of each day! */ + let days: Vec> = vec![ + Box::new(day01::Day01 {}), + // Box::new(day02::Day02 {}), + // Box::new(day03::Day03 {}), + // Box::new(day04::Day04 {}), + // Box::new(day05::Day05 {}), + // Box::new(day06::Day06 {}), + // Box::new(day07::Day07 {}), + // Box::new(day08::Day08 {}), + // Box::new(day09::Day09 {}), + // Box::new(day10::Day10 {}), + // Box::new(day11::Day11 {}), + // Box::new(day12::Day12 {}), + // Box::new(day13::Day13 {}), + // Box::new(day14::Day14 {}), + // Box::new(day15::Day15 {}), + // Box::new(day16::Day16 {}), + // Box::new(day17::Day17 {}), + // Box::new(day18::Day18 {}), + // Box::new(day19::Day19 {}), + // Box::new(day20::Day20 {}), + // Box::new(day21::Day21 {}), + // Box::new(day22::Day22 {}), + // Box::new(day23::Day23 {}), + // Box::new(day24::Day24 {}), + // Box::new(day25::Day25 {}), + ]; + + // Vector to store every solution as a thread handle + let mut t = vec![]; + + // Run through and construct solution objects + for day in days { + let task = tokio::spawn(async move { day.run().unwrap() }); + t.push(task); + } + + let start_time = SystemTime::now(); + + // When thread is awaited, the solution is run + let mut days = vec![]; + for thread in t { + days.push(thread.await?); + } + + for day in days { + println!("========= Day {} ==========", day.day); + println!("Part1 Result: {}", day.part1); + println!("Part2 Result: {}", day.part2); + println!("========= {}ms =========\n", day.time.as_millis()); + } + + println!( + "Ran AoC 2023 in {}ms", + SystemTime::now().duration_since(start_time)?.as_millis() + ); + Ok(()) +} diff --git a/src/solutions/day01.rs b/src/solutions/day01.rs new file mode 100644 index 0000000..9c6edbc --- /dev/null +++ b/src/solutions/day01.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day01 {} + +impl Solution for Day01 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 1 + } +} + +impl Day01 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day01::Day01 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day01::Day01 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day02.rs b/src/solutions/day02.rs new file mode 100644 index 0000000..3ca9181 --- /dev/null +++ b/src/solutions/day02.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day02 {} + +impl Solution for Day02 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 2 + } +} + +impl Day02 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day02::Day02 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day02::Day02 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day03.rs b/src/solutions/day03.rs new file mode 100644 index 0000000..eade51a --- /dev/null +++ b/src/solutions/day03.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day03 {} + +impl Solution for Day03 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 3 + } +} + +impl Day03 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day03::Day03 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day03::Day03 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day04.rs b/src/solutions/day04.rs new file mode 100644 index 0000000..9c3adcc --- /dev/null +++ b/src/solutions/day04.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day04 {} + +impl Solution for Day04 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 4 + } +} + +impl Day04 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day04::Day04 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day04::Day04 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day05.rs b/src/solutions/day05.rs new file mode 100644 index 0000000..5371019 --- /dev/null +++ b/src/solutions/day05.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day05 {} + +impl Solution for Day05 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 5 + } +} + +impl Day05 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day05::Day05 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day05::Day05 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day06.rs b/src/solutions/day06.rs new file mode 100644 index 0000000..a874f45 --- /dev/null +++ b/src/solutions/day06.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day06 {} + +impl Solution for Day06 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 6 + } +} + +impl Day06 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day06::Day06 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day06::Day06 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day07.rs b/src/solutions/day07.rs new file mode 100644 index 0000000..b73a00d --- /dev/null +++ b/src/solutions/day07.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day07 {} + +impl Solution for Day07 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 7 + } +} + +impl Day07 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day07::Day07 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day07::Day07 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day08.rs b/src/solutions/day08.rs new file mode 100644 index 0000000..d6c2668 --- /dev/null +++ b/src/solutions/day08.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day08 {} + +impl Solution for Day08 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 8 + } +} + +impl Day08 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day08::Day08 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day08::Day08 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day09.rs b/src/solutions/day09.rs new file mode 100644 index 0000000..3ce348a --- /dev/null +++ b/src/solutions/day09.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day09 {} + +impl Solution for Day09 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 9 + } +} + +impl Day09 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day09::Day09 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day09::Day09 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day10.rs b/src/solutions/day10.rs new file mode 100644 index 0000000..3ab58ef --- /dev/null +++ b/src/solutions/day10.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day10 {} + +impl Solution for Day10 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 10 + } +} + +impl Day10 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day10::Day10 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day10::Day10 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day11.rs b/src/solutions/day11.rs new file mode 100644 index 0000000..b019d00 --- /dev/null +++ b/src/solutions/day11.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day11 {} + +impl Solution for Day11 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 11 + } +} + +impl Day11 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day11::Day11 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day11::Day11 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day12.rs b/src/solutions/day12.rs new file mode 100644 index 0000000..f1ea006 --- /dev/null +++ b/src/solutions/day12.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day12 {} + +impl Solution for Day12 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 12 + } +} + +impl Day12 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day12::Day12 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day12::Day12 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day13.rs b/src/solutions/day13.rs new file mode 100644 index 0000000..20a3ae8 --- /dev/null +++ b/src/solutions/day13.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day13 {} + +impl Solution for Day13 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 13 + } +} + +impl Day13 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day13::Day13 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day13::Day13 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day14.rs b/src/solutions/day14.rs new file mode 100644 index 0000000..eee2290 --- /dev/null +++ b/src/solutions/day14.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day14 {} + +impl Solution for Day14 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 14 + } +} + +impl Day14 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day14::Day14 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day14::Day14 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day15.rs b/src/solutions/day15.rs new file mode 100644 index 0000000..38322e2 --- /dev/null +++ b/src/solutions/day15.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day15 {} + +impl Solution for Day15 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 15 + } +} + +impl Day15 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day15::Day15 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day15::Day15 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day16.rs b/src/solutions/day16.rs new file mode 100644 index 0000000..9c1fe90 --- /dev/null +++ b/src/solutions/day16.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day16 {} + +impl Solution for Day16 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 16 + } +} + +impl Day16 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day16::Day16 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day16::Day16 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day17.rs b/src/solutions/day17.rs new file mode 100644 index 0000000..2f7dba5 --- /dev/null +++ b/src/solutions/day17.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day17 {} + +impl Solution for Day17 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 17 + } +} + +impl Day17 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day17::Day17 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day17::Day17 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day18.rs b/src/solutions/day18.rs new file mode 100644 index 0000000..4db1e9c --- /dev/null +++ b/src/solutions/day18.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day18 {} + +impl Solution for Day18 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 18 + } +} + +impl Day18 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day18::Day18 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day18::Day18 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day19.rs b/src/solutions/day19.rs new file mode 100644 index 0000000..babf9c7 --- /dev/null +++ b/src/solutions/day19.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day19 {} + +impl Solution for Day19 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 19 + } +} + +impl Day19 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day19::Day19 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day19::Day19 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day20.rs b/src/solutions/day20.rs new file mode 100644 index 0000000..e4f3d4a --- /dev/null +++ b/src/solutions/day20.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day20 {} + +impl Solution for Day20 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 20 + } +} + +impl Day20 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day20::Day20 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day20::Day20 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day21.rs b/src/solutions/day21.rs new file mode 100644 index 0000000..f4ce049 --- /dev/null +++ b/src/solutions/day21.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day21 {} + +impl Solution for Day21 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 21 + } +} + +impl Day21 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day21::Day21 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day21::Day21 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day22.rs b/src/solutions/day22.rs new file mode 100644 index 0000000..a336b17 --- /dev/null +++ b/src/solutions/day22.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day22 {} + +impl Solution for Day22 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 22 + } +} + +impl Day22 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day22::Day22 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day22::Day22 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day23.rs b/src/solutions/day23.rs new file mode 100644 index 0000000..6b12cef --- /dev/null +++ b/src/solutions/day23.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day23 {} + +impl Solution for Day23 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 23 + } +} + +impl Day23 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day23::Day23 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day23::Day23 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day24.rs b/src/solutions/day24.rs new file mode 100644 index 0000000..74be3fb --- /dev/null +++ b/src/solutions/day24.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day24 {} + +impl Solution for Day24 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 24 + } +} + +impl Day24 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day24::Day24 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day24::Day24 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/day25.rs b/src/solutions/day25.rs new file mode 100644 index 0000000..1293500 --- /dev/null +++ b/src/solutions/day25.rs @@ -0,0 +1,66 @@ +use super::Solution; + +pub struct Day25 {} + +impl Solution for Day25 { + fn part1( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn part2( + &self, + _input: &mut Vec, + ) -> Result, Box> { + Ok(Box::new("Ready")) + } + + fn get_day(&self) -> u8 { + 25 + } +} + +impl Day25 {} + +/// Test from puzzle input +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + fn part1() { + let challenge = day25::Day25 {}; + + //Complete the Challenge + let answer = challenge + .part1( + utils::get_input(challenge.get_day(), utils::InputType::Test1) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } + + #[test] + fn part2() { + let challenge = day25::Day25 {}; + + //Complete the Challenge + let answer = challenge + .part2( + utils::get_input(challenge.get_day(), utils::InputType::Test2) + .unwrap() + .as_mut(), + ) + .unwrap() + .to_string(); + + assert_eq!(answer, "Ready"); + } +} diff --git a/src/solutions/mod.rs b/src/solutions/mod.rs new file mode 100644 index 0000000..e0584a5 --- /dev/null +++ b/src/solutions/mod.rs @@ -0,0 +1,73 @@ +pub mod day01; +pub mod day02; +pub mod day03; +pub mod day04; +pub mod day05; +pub mod day06; +pub mod day07; +pub mod day08; +pub mod day09; +pub mod day10; +pub mod day11; +pub mod day12; +pub mod day13; +pub mod day14; +pub mod day15; +pub mod day16; +pub mod day17; +pub mod day18; +pub mod day19; +pub mod day20; +pub mod day21; +pub mod day22; +pub mod day23; +pub mod day24; +pub mod day25; + +use crate::utils::{self, get_input}; +use std::{error::Error, fmt::Display, time::SystemTime}; + +// Solution class running your answers for part 1 and 2. +pub trait Solution: Send + Sync { + // Insert your solution for part one in here, + // returning it as a: + ///``` + /// OK(Box::new(ans)) + /// ``` + fn part1(&self, input: &mut Vec) -> Result, Box>; + + // Insert your solution for part two in here, + // returning it as a: + ///``` + /// OK(Box::new(ans)) + /// ``` + fn part2(&self, input: &mut Vec) -> Result, Box>; + + // Returns the day that is currently being run + fn get_day(&self) -> u8; + + // Runs part 1 and 2 for each day synchronously (One after the other) + fn run(&self) -> Result> { + let start_time = SystemTime::now(); + + self.part1(get_input(self.get_day(), utils::InputType::Test1)?.as_mut())?; + self.part2(get_input(self.get_day(), utils::InputType::Test2)?.as_mut())?; + + let run = Run { + part1: self.part1(get_input(self.get_day(), utils::InputType::Actual)?.as_mut())?, + part2: self.part2(get_input(self.get_day(), utils::InputType::Actual)?.as_mut())?, + day: self.get_day(), + time: SystemTime::now().duration_since(start_time)?, + }; + Ok(run) + } +} + +pub struct Run { + pub part1: Box, + pub part2: Box, + pub day: u8, + pub time: core::time::Duration, +} + +unsafe impl Send for Run {} diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..10a4dec --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,37 @@ +use std::{ + error::Error, + fs::File, + io::{prelude::*, BufReader}, +}; + +/// Enum used to specify input +#[allow(unused)] +pub enum InputType { + Test1, + Test2, + Actual, +} + +/// Function to get the input for a given day of AoC +pub fn get_input(day: u8, input: InputType) -> Result, Box> { + // Find Input File Name + let file_name = match input { + InputType::Test1 => format!("input/day{:02}_test1", day), + InputType::Test2 => format!("input/day{:02}_test2", day), + InputType::Actual => format!("input/day{:02}", day), + }; + + // Read file into buffer + let file = File::open(file_name)?; + let reader = BufReader::new(file); + + // Convert itterate buffer and return string vec + let data = reader + .lines() + .map(|s| s.unwrap_or(String::from(""))) + .collect(); + + Ok(data) +} + +/* Insert any utils you create in this file here */