From cece8439a7e7328c621569ffb8f571b7c9c9abf1 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 20 Nov 2021 11:57:32 +0100 Subject: [PATCH 1/6] Initial 2021 runner --- .gitignore | 3 +++ 2021/Cargo.toml | 8 ++++++++ 2021/src/day01.rs | 10 +++++++++ 2021/src/lib.rs | 29 ++++++++++++++++++++++++++ 2021/src/main.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 2021/Cargo.toml create mode 100644 2021/src/day01.rs create mode 100644 2021/src/lib.rs create mode 100644 2021/src/main.rs diff --git a/.gitignore b/.gitignore index e5c7e98..023c586 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,6 @@ docs/_build/ # PyBuilder target/ *.swp + +# Rust lock +*.lock diff --git a/2021/Cargo.toml b/2021/Cargo.toml new file mode 100644 index 0000000..c49400f --- /dev/null +++ b/2021/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "aoc-2021" +version = "0.1.0" +edition = "2021" + + +[dependencies] +clap = "3.0.0-beta.5" diff --git a/2021/src/day01.rs b/2021/src/day01.rs new file mode 100644 index 0000000..1a26a6a --- /dev/null +++ b/2021/src/day01.rs @@ -0,0 +1,10 @@ +use crate::Solution; + +#[derive(Default)] +pub struct Day01; + +impl Solution for Day01 { + fn part1(&mut self, _input: &mut dyn std::io::Read) -> String { + todo!() + } +} diff --git a/2021/src/lib.rs b/2021/src/lib.rs new file mode 100644 index 0000000..016638d --- /dev/null +++ b/2021/src/lib.rs @@ -0,0 +1,29 @@ +use std::io::Read; + +mod day01; + +pub trait Solution { + fn part1(&mut self, input: &mut dyn Read) -> String; + + fn part2(&mut self, _input: &mut dyn Read) -> String { + unimplemented!("Still working on part 1"); + } +} + +pub fn get_implementation(day: usize) -> Box { + match day { + 1 => Box::new(day01::Day01::default()), + _ => panic!("Unsupported day {}", day), + } +} + +#[cfg(test)] +fn test_implementation(mut day: impl Solution, part: u8, mut input: &[u8], answer: impl ToString) { + let result = match part { + 1 => day.part1(&mut input), + 2 => day.part2(&mut input), + _ => panic!("Invalid part: {}", part), + }; + + assert_eq!(answer.to_string(), result); +} diff --git a/2021/src/main.rs b/2021/src/main.rs new file mode 100644 index 0000000..4d775b1 --- /dev/null +++ b/2021/src/main.rs @@ -0,0 +1,52 @@ +use std::fs::File; +use std::io::Read; +use std::num::NonZeroUsize; +use std::path::PathBuf; +use std::time::Instant; + +use clap::Parser; + +use aoc_2021::get_implementation; + +/// Advent of Code 2021 runner +#[derive(Parser)] +struct Opts { + /// Which day to run + day: NonZeroUsize, + + /// Print time taken + #[clap(short, long)] + time: bool, + + /// Run part 2 instead of part 1 + #[clap(short = '2', long)] + part2: bool, + + /// Read input from the given file instead of stdin + #[clap(short, long)] + input: Option, +} + +fn main() { + let opts: Opts = Opts::parse(); + + let mut implementation = get_implementation(opts.day.get()); + let mut input: Box = if let Some(input) = opts.input { + Box::new(File::open(&input).expect("Failed to open input")) + } else { + Box::new(std::io::stdin()) + }; + + let begin = Instant::now(); + let result = if opts.part2 { + implementation.part2(&mut input) + } else { + implementation.part1(&mut input) + }; + + if opts.time { + eprintln!("Execution time: {:?}", Instant::now().duration_since(begin)); + } + + println!("{}", result); +} From c985ba8a1ada5aed1832db4a0067b03aea6e7604 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Mon, 22 Nov 2021 08:26:05 +0100 Subject: [PATCH 2/6] Add CI for 2021 --- .github/workflows/2021.yml | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/2021.yml diff --git a/.github/workflows/2021.yml b/.github/workflows/2021.yml new file mode 100644 index 0000000..95ccbbd --- /dev/null +++ b/.github/workflows/2021.yml @@ -0,0 +1,46 @@ +on: + - push + +name: Advent of Code 2021 + +jobs: + ci: + strategy: + matrix: + toolchain: + - stable + - beta + experimental: [false] + include: + - toolchain: nightly + experimental: true + + name: Continuous Integration + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.experimental }} + + steps: + - uses: actions/checkout@v2 + + - name: Install toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: ${{ matrix.toolchain }} + override: true + components: rustfmt, clippy + + - name: Build binaries + working-directory: 2021 + run: > + cargo build --all-targets + + - name: Run tests + working-directory: 2021 + run: > + cargo test + + - name: Run clippy + working-directory: 2021 + run: > + cargo clippy -- --deny warnings From 186d91d1b70968e40e62d0f713467fb54cfc3a7a Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 28 Nov 2021 16:49:37 +0100 Subject: [PATCH 3/6] Use function pointers over dyn traits --- 2021/src/day01.rs | 15 +++++++-------- 2021/src/lib.rs | 36 +++++++++++++----------------------- 2021/src/main.rs | 7 +------ 3 files changed, 21 insertions(+), 37 deletions(-) diff --git a/2021/src/day01.rs b/2021/src/day01.rs index 1a26a6a..113ba49 100644 --- a/2021/src/day01.rs +++ b/2021/src/day01.rs @@ -1,10 +1,9 @@ -use crate::Solution; +use std::io::Read; -#[derive(Default)] -pub struct Day01; - -impl Solution for Day01 { - fn part1(&mut self, _input: &mut dyn std::io::Read) -> String { - todo!() - } +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() } diff --git a/2021/src/lib.rs b/2021/src/lib.rs index 016638d..9c60b8b 100644 --- a/2021/src/lib.rs +++ b/2021/src/lib.rs @@ -1,29 +1,19 @@ use std::io::Read; +type Solution = fn(&mut dyn Read) -> String; + mod day01; -pub trait Solution { - fn part1(&mut self, input: &mut dyn Read) -> String; - - fn part2(&mut self, _input: &mut dyn Read) -> String { - unimplemented!("Still working on part 1"); +pub fn get_implementation(day: usize, part2: bool) -> Solution { + if !part2 { + match day { + 1 => day01::part1, + _ => panic!("Unsupported part one for day {}", day), + } + } else { + match day { + 1 => day01::part2, + _ => panic!("Unsupported part two for day {}", day), + } } } - -pub fn get_implementation(day: usize) -> Box { - match day { - 1 => Box::new(day01::Day01::default()), - _ => panic!("Unsupported day {}", day), - } -} - -#[cfg(test)] -fn test_implementation(mut day: impl Solution, part: u8, mut input: &[u8], answer: impl ToString) { - let result = match part { - 1 => day.part1(&mut input), - 2 => day.part2(&mut input), - _ => panic!("Invalid part: {}", part), - }; - - assert_eq!(answer.to_string(), result); -} diff --git a/2021/src/main.rs b/2021/src/main.rs index 4d775b1..00e7778 100644 --- a/2021/src/main.rs +++ b/2021/src/main.rs @@ -30,7 +30,6 @@ struct Opts { fn main() { let opts: Opts = Opts::parse(); - let mut implementation = get_implementation(opts.day.get()); let mut input: Box = if let Some(input) = opts.input { Box::new(File::open(&input).expect("Failed to open input")) } else { @@ -38,11 +37,7 @@ fn main() { }; let begin = Instant::now(); - let result = if opts.part2 { - implementation.part2(&mut input) - } else { - implementation.part1(&mut input) - }; + let result = get_implementation(opts.day.get(), opts.part2)(&mut *input); if opts.time { eprintln!("Execution time: {:?}", Instant::now().duration_since(begin)); From 89159137feb385b53187a6dbdda2060f5dbebf74 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 28 Nov 2021 17:12:26 +0100 Subject: [PATCH 4/6] Add other days --- 2021/src/day02.rs | 9 ++++++ 2021/src/day03.rs | 9 ++++++ 2021/src/day04.rs | 9 ++++++ 2021/src/day05.rs | 9 ++++++ 2021/src/day06.rs | 9 ++++++ 2021/src/day07.rs | 9 ++++++ 2021/src/day08.rs | 9 ++++++ 2021/src/day09.rs | 9 ++++++ 2021/src/day10.rs | 9 ++++++ 2021/src/day11.rs | 9 ++++++ 2021/src/day12.rs | 9 ++++++ 2021/src/day13.rs | 9 ++++++ 2021/src/day14.rs | 9 ++++++ 2021/src/day15.rs | 9 ++++++ 2021/src/day16.rs | 9 ++++++ 2021/src/day17.rs | 9 ++++++ 2021/src/day18.rs | 9 ++++++ 2021/src/day19.rs | 9 ++++++ 2021/src/day20.rs | 9 ++++++ 2021/src/day21.rs | 9 ++++++ 2021/src/day22.rs | 9 ++++++ 2021/src/day23.rs | 9 ++++++ 2021/src/day24.rs | 9 ++++++ 2021/src/day25.rs | 5 ++++ 2021/src/lib.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++++ 25 files changed, 283 insertions(+) create mode 100644 2021/src/day02.rs create mode 100644 2021/src/day03.rs create mode 100644 2021/src/day04.rs create mode 100644 2021/src/day05.rs create mode 100644 2021/src/day06.rs create mode 100644 2021/src/day07.rs create mode 100644 2021/src/day08.rs create mode 100644 2021/src/day09.rs create mode 100644 2021/src/day10.rs create mode 100644 2021/src/day11.rs create mode 100644 2021/src/day12.rs create mode 100644 2021/src/day13.rs create mode 100644 2021/src/day14.rs create mode 100644 2021/src/day15.rs create mode 100644 2021/src/day16.rs create mode 100644 2021/src/day17.rs create mode 100644 2021/src/day18.rs create mode 100644 2021/src/day19.rs create mode 100644 2021/src/day20.rs create mode 100644 2021/src/day21.rs create mode 100644 2021/src/day22.rs create mode 100644 2021/src/day23.rs create mode 100644 2021/src/day24.rs create mode 100644 2021/src/day25.rs diff --git a/2021/src/day02.rs b/2021/src/day02.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day02.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day03.rs b/2021/src/day03.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day03.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day04.rs b/2021/src/day04.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day04.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day05.rs b/2021/src/day05.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day05.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day06.rs b/2021/src/day06.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day06.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day07.rs b/2021/src/day07.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day07.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day08.rs b/2021/src/day08.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day08.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day09.rs b/2021/src/day09.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day09.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day10.rs b/2021/src/day10.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day10.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day11.rs b/2021/src/day11.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day11.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day12.rs b/2021/src/day12.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day12.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day13.rs b/2021/src/day13.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day13.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day14.rs b/2021/src/day14.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day14.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day15.rs b/2021/src/day15.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day15.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day16.rs b/2021/src/day16.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day16.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day17.rs b/2021/src/day17.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day17.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day18.rs b/2021/src/day18.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day18.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day19.rs b/2021/src/day19.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day19.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day20.rs b/2021/src/day20.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day20.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day21.rs b/2021/src/day21.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day21.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day22.rs b/2021/src/day22.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day22.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day23.rs b/2021/src/day23.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day23.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day24.rs b/2021/src/day24.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day24.rs @@ -0,0 +1,9 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} + +pub fn part2(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/day25.rs b/2021/src/day25.rs new file mode 100644 index 0000000..9add40a --- /dev/null +++ b/2021/src/day25.rs @@ -0,0 +1,5 @@ +use std::io::Read; + +pub fn part1(_input: &mut dyn Read) -> String { + todo!() +} diff --git a/2021/src/lib.rs b/2021/src/lib.rs index 9c60b8b..6d5f3ea 100644 --- a/2021/src/lib.rs +++ b/2021/src/lib.rs @@ -3,16 +3,87 @@ use std::io::Read; type Solution = fn(&mut dyn Read) -> String; mod day01; +mod day02; +mod day03; +mod day04; +mod day05; +mod day06; +mod day07; +mod day08; +mod day09; +mod day10; +mod day11; +mod day12; +mod day13; +mod day14; +mod day15; +mod day16; +mod day17; +mod day18; +mod day19; +mod day20; +mod day21; +mod day22; +mod day23; +mod day24; +mod day25; pub fn get_implementation(day: usize, part2: bool) -> Solution { if !part2 { match day { 1 => day01::part1, + 2 => day02::part1, + 3 => day03::part1, + 4 => day04::part1, + 5 => day05::part1, + 6 => day06::part1, + 7 => day07::part1, + 8 => day08::part1, + 9 => day09::part1, + 10 => day10::part1, + 11 => day11::part1, + 12 => day12::part1, + 13 => day13::part1, + 14 => day14::part1, + 15 => day15::part1, + 16 => day16::part1, + 17 => day17::part1, + 18 => day18::part1, + 19 => day19::part1, + 20 => day20::part1, + 21 => day21::part1, + 22 => day22::part1, + 23 => day23::part1, + 24 => day24::part1, + 25 => day25::part1, _ => panic!("Unsupported part one for day {}", day), } } else { match day { 1 => day01::part2, + 2 => day02::part2, + 3 => day03::part2, + 4 => day04::part2, + 5 => day05::part2, + 6 => day06::part2, + 7 => day07::part2, + 8 => day08::part2, + 9 => day09::part2, + 10 => day10::part2, + 11 => day11::part2, + 12 => day12::part2, + 13 => day13::part2, + 14 => day14::part2, + 15 => day15::part2, + 16 => day16::part2, + 17 => day17::part2, + 18 => day18::part2, + 19 => day19::part2, + 20 => day20::part2, + 21 => day21::part2, + 22 => day22::part2, + 23 => day23::part2, + 24 => day24::part2, _ => panic!("Unsupported part two for day {}", day), } } From 2c64028978bd61c517f956dae3a54d1353bf9530 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 28 Nov 2021 17:13:27 +0100 Subject: [PATCH 5/6] Enable debug information for release --- 2021/Cargo.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/2021/Cargo.toml b/2021/Cargo.toml index c49400f..0f16290 100644 --- a/2021/Cargo.toml +++ b/2021/Cargo.toml @@ -6,3 +6,7 @@ edition = "2021" [dependencies] clap = "3.0.0-beta.5" + +[profile.release] +# Keep debug information in release for better flamegraphs +debug = true From 2e0a7ea81d16ff0b4831ea2bd629ed3a97dac2e2 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Mon, 29 Nov 2021 20:31:29 +0100 Subject: [PATCH 6/6] Update READMEs for 2021. --- 2021/README.md | 22 ++++++++++++++++++++++ README.md | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 2021/README.md diff --git a/2021/README.md b/2021/README.md new file mode 100644 index 0000000..bbbf89b --- /dev/null +++ b/2021/README.md @@ -0,0 +1,22 @@ +# Advent of Code 2021 + +This folder contains the solution runner for Advent of Code 2021. All days will be solved in Rust, +with the goal of having a total time across all puzzles of one second or less. + +``` +aoc-2021 + +Advent of Code 2021 runner + +USAGE: + aoc-2021 [OPTIONS] + +ARGS: + Which day to run + +OPTIONS: + -2, --part2 Run part 2 instead of part 1 + -h, --help Print help information + -i, --input Read input from the given file instead of stdin + -t, --time Print time taken +``` diff --git a/README.md b/README.md index acbe15a..bc26309 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Advent of Code -[![Build Status](https://travis-ci.org/bertptrs/adventofcode.svg?branch=master)](https://travis-ci.org/bertptrs/adventofcode) +[![Advent of Code 2021](https://github.com/bertptrs/adventofcode/actions/workflows/2021.yml/badge.svg)](https://github.com/bertptrs/adventofcode/actions/workflows/2021.yml) This repository contains my solutions for Advent of Code. See: @@ -10,3 +10,4 @@ This repository contains my solutions for Advent of Code. See: - [2018 edition](./2018) - [2019 edition](./2019) - [2020 edition](./2020) +- [2021 edition](./2021)