From 0635141ac6a089e9f6d0feeea6d97cbb0de74162 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 5 Nov 2022 15:46:43 +0100 Subject: [PATCH 1/4] Add skeleton for 2022 --- 2022/Cargo.toml | 26 +++++++++++ 2022/benches/days.rs | 46 ++++++++++++++++++++ 2022/inputs/.gitkeep | 0 2022/src/day01.rs | 9 ++++ 2022/src/day02.rs | 9 ++++ 2022/src/day03.rs | 9 ++++ 2022/src/day04.rs | 9 ++++ 2022/src/day05.rs | 9 ++++ 2022/src/day06.rs | 9 ++++ 2022/src/day07.rs | 9 ++++ 2022/src/day08.rs | 9 ++++ 2022/src/day09.rs | 9 ++++ 2022/src/day10.rs | 9 ++++ 2022/src/day11.rs | 9 ++++ 2022/src/day12.rs | 9 ++++ 2022/src/day13.rs | 9 ++++ 2022/src/day14.rs | 9 ++++ 2022/src/day15.rs | 9 ++++ 2022/src/day16.rs | 9 ++++ 2022/src/day17.rs | 9 ++++ 2022/src/day18.rs | 9 ++++ 2022/src/day19.rs | 9 ++++ 2022/src/day20.rs | 9 ++++ 2022/src/day21.rs | 9 ++++ 2022/src/day22.rs | 9 ++++ 2022/src/day23.rs | 9 ++++ 2022/src/day24.rs | 9 ++++ 2022/src/day25.rs | 5 +++ 2022/src/lib.rs | 90 +++++++++++++++++++++++++++++++++++++++ 2022/src/main.rs | 61 ++++++++++++++++++++++++++ 2022/src/samples/.gitkeep | 0 31 files changed, 444 insertions(+) create mode 100644 2022/Cargo.toml create mode 100644 2022/benches/days.rs create mode 100644 2022/inputs/.gitkeep create mode 100644 2022/src/day01.rs create mode 100644 2022/src/day02.rs create mode 100644 2022/src/day03.rs create mode 100644 2022/src/day04.rs create mode 100644 2022/src/day05.rs create mode 100644 2022/src/day06.rs create mode 100644 2022/src/day07.rs create mode 100644 2022/src/day08.rs create mode 100644 2022/src/day09.rs create mode 100644 2022/src/day10.rs create mode 100644 2022/src/day11.rs create mode 100644 2022/src/day12.rs create mode 100644 2022/src/day13.rs create mode 100644 2022/src/day14.rs create mode 100644 2022/src/day15.rs create mode 100644 2022/src/day16.rs create mode 100644 2022/src/day17.rs create mode 100644 2022/src/day18.rs create mode 100644 2022/src/day19.rs create mode 100644 2022/src/day20.rs create mode 100644 2022/src/day21.rs create mode 100644 2022/src/day22.rs create mode 100644 2022/src/day23.rs create mode 100644 2022/src/day24.rs create mode 100644 2022/src/day25.rs create mode 100644 2022/src/lib.rs create mode 100644 2022/src/main.rs create mode 100644 2022/src/samples/.gitkeep diff --git a/2022/Cargo.toml b/2022/Cargo.toml new file mode 100644 index 0000000..e71419a --- /dev/null +++ b/2022/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "aoc_2022" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.66" +clap = { version = "4.0.19", features = ["derive"] } +nom = "7.1.1" + +[dev-dependencies] +criterion = "0.4.0" + +[profile.release] +# Keep debug information in release for better flamegraphs +debug = true + +[profile.bench] +# And same for benchmarking +debug = true + +[[bench]] +name = "days" +harness = false diff --git a/2022/benches/days.rs b/2022/benches/days.rs new file mode 100644 index 0000000..ad42ca3 --- /dev/null +++ b/2022/benches/days.rs @@ -0,0 +1,46 @@ +use std::fs::File; +use std::io::Read; + +use aoc_2022::get_implementation; +use criterion::criterion_group; +use criterion::criterion_main; +use criterion::BenchmarkId; +use criterion::Criterion; + +/// Number of days we have an implementation to benchmark +const DAYS_IMPLEMENTED: u8 = 0; + +fn read_input(day: u8) -> Vec { + let input_path = format!("inputs/{:02}.txt", day); + + let mut buffer = Vec::new(); + File::open(input_path) + .expect("Failed to open input file") + .read_to_end(&mut buffer) + .expect("Failed to read input file"); + + buffer +} + +pub fn benchmark_days(c: &mut Criterion) { + for day in 1..=DAYS_IMPLEMENTED { + let input = read_input(day); + + let part1 = get_implementation(day, false).unwrap(); + + c.bench_with_input(BenchmarkId::new("part1", day), &input, |b, i| { + b.iter(|| part1(i)); + }); + + if day < 25 { + let part2 = get_implementation(day, true).unwrap(); + + c.bench_with_input(BenchmarkId::new("part2", day), &input, |b, i| { + b.iter(|| part2(i)); + }); + } + } +} + +criterion_group!(benches, benchmark_days); +criterion_main!(benches); diff --git a/2022/inputs/.gitkeep b/2022/inputs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/2022/src/day01.rs b/2022/src/day01.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day01.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day02.rs b/2022/src/day02.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day02.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day03.rs b/2022/src/day03.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day03.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day04.rs b/2022/src/day04.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day04.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day05.rs b/2022/src/day05.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day05.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day06.rs b/2022/src/day06.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day06.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day07.rs b/2022/src/day07.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day07.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day08.rs b/2022/src/day08.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day08.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day09.rs b/2022/src/day09.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day09.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day10.rs b/2022/src/day10.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day10.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day11.rs b/2022/src/day11.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day11.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day12.rs b/2022/src/day12.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day12.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day13.rs b/2022/src/day13.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day13.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day14.rs b/2022/src/day14.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day14.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day15.rs b/2022/src/day15.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day15.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day16.rs b/2022/src/day16.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day16.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day17.rs b/2022/src/day17.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day17.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day18.rs b/2022/src/day18.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day18.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day19.rs b/2022/src/day19.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day19.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day20.rs b/2022/src/day20.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day20.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day21.rs b/2022/src/day21.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day21.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day22.rs b/2022/src/day22.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day22.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day23.rs b/2022/src/day23.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day23.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day24.rs b/2022/src/day24.rs new file mode 100644 index 0000000..745aff3 --- /dev/null +++ b/2022/src/day24.rs @@ -0,0 +1,9 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} + +pub fn part2(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/day25.rs b/2022/src/day25.rs new file mode 100644 index 0000000..2bc42ed --- /dev/null +++ b/2022/src/day25.rs @@ -0,0 +1,5 @@ +use anyhow::Result; + +pub fn part1(_input: &[u8]) -> Result { + todo!() +} diff --git a/2022/src/lib.rs b/2022/src/lib.rs new file mode 100644 index 0000000..c659099 --- /dev/null +++ b/2022/src/lib.rs @@ -0,0 +1,90 @@ +use anyhow::Result; + +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; + +type Solution = fn(&[u8]) -> Result; + +pub fn get_implementation(day: u8, part2: bool) -> Result { + if !part2 { + match day { + 1 => Ok(day01::part1), + 2 => Ok(day02::part1), + 3 => Ok(day03::part1), + 4 => Ok(day04::part1), + 5 => Ok(day05::part1), + 6 => Ok(day06::part1), + 7 => Ok(day07::part1), + 8 => Ok(day08::part1), + 9 => Ok(day09::part1), + 10 => Ok(day10::part1), + 11 => Ok(day11::part1), + 12 => Ok(day12::part1), + 13 => Ok(day13::part1), + 14 => Ok(day14::part1), + 15 => Ok(day15::part1), + 16 => Ok(day16::part1), + 17 => Ok(day17::part1), + 18 => Ok(day18::part1), + 19 => Ok(day19::part1), + 20 => Ok(day20::part1), + 21 => Ok(day21::part1), + 22 => Ok(day22::part1), + 23 => Ok(day23::part1), + 24 => Ok(day24::part1), + 25 => Ok(day25::part1), + _ => anyhow::bail!("Invalid day for part 1: {day}"), + } + } else { + match day { + 1 => Ok(day01::part2), + 2 => Ok(day02::part2), + 3 => Ok(day03::part2), + 4 => Ok(day04::part2), + 5 => Ok(day05::part2), + 6 => Ok(day06::part2), + 7 => Ok(day07::part2), + 8 => Ok(day08::part2), + 9 => Ok(day09::part2), + 10 => Ok(day10::part2), + 11 => Ok(day11::part2), + 12 => Ok(day12::part2), + 13 => Ok(day13::part2), + 14 => Ok(day14::part2), + 15 => Ok(day15::part2), + 16 => Ok(day16::part2), + 17 => Ok(day17::part2), + 18 => Ok(day18::part2), + 19 => Ok(day19::part2), + 20 => Ok(day20::part2), + 21 => Ok(day21::part2), + 22 => Ok(day22::part2), + 23 => Ok(day23::part2), + 24 => Ok(day24::part2), + _ => anyhow::bail!("Invalid day for part 2: {day}"), + } + } +} diff --git a/2022/src/main.rs b/2022/src/main.rs new file mode 100644 index 0000000..86dc88e --- /dev/null +++ b/2022/src/main.rs @@ -0,0 +1,61 @@ +use std::fs::File; +use std::io::Read; +use std::num::NonZeroU8; +use std::path::PathBuf; +use std::time::Instant; + +use anyhow::Result; +use clap::Parser; + +use aoc_2022::get_implementation; + +/// Advent of Code 2021 runner +#[derive(Parser)] +struct Opts { + /// Which day to run + day: NonZeroU8, + + /// 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, +} + +impl Opts { + fn input_data(&self) -> Result> { + let mut buffer = Vec::new(); + + if let Some(input) = &self.input { + File::open(input)?.read_to_end(&mut buffer)?; + } else { + std::io::stdin().read_to_end(&mut buffer)?; + } + + Ok(buffer) + } +} + +fn main() -> Result<()> { + let opts: Opts = Opts::parse(); + + let input = opts.input_data()?; + + let implementation = get_implementation(opts.day.get(), opts.part2)?; + + let begin = Instant::now(); + let result = implementation(&input)?; + + if opts.time { + eprintln!("Execution time: {:?}", Instant::now().duration_since(begin)); + } + + println!("{}", result); + Ok(()) +} diff --git a/2022/src/samples/.gitkeep b/2022/src/samples/.gitkeep new file mode 100644 index 0000000..e69de29 From cabae7b1fd41de0315c8c519d7c420ad0389ba53 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 5 Nov 2022 16:08:12 +0100 Subject: [PATCH 2/4] Convert 2021 CI to 2022 --- .github/workflows/{2021.yml => 2022.yml} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename .github/workflows/{2021.yml => 2022.yml} (83%) diff --git a/.github/workflows/2021.yml b/.github/workflows/2022.yml similarity index 83% rename from .github/workflows/2021.yml rename to .github/workflows/2022.yml index 95ccbbd..6338fa2 100644 --- a/.github/workflows/2021.yml +++ b/.github/workflows/2022.yml @@ -1,7 +1,7 @@ on: - push -name: Advent of Code 2021 +name: Advent of Code 2022 jobs: ci: @@ -20,7 +20,7 @@ jobs: continue-on-error: ${{ matrix.experimental }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install toolchain uses: actions-rs/toolchain@v1 @@ -31,16 +31,16 @@ jobs: components: rustfmt, clippy - name: Build binaries - working-directory: 2021 + working-directory: 2022 run: > cargo build --all-targets - name: Run tests - working-directory: 2021 + working-directory: 2022 run: > cargo test - name: Run clippy - working-directory: 2021 + working-directory: 2022 run: > cargo clippy -- --deny warnings From af0897300db0a72668b51b03bffb8c213d5de130 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 5 Nov 2022 16:11:30 +0100 Subject: [PATCH 3/4] Add caching to CI pipeline for speed --- .github/workflows/2022.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/2022.yml b/.github/workflows/2022.yml index 6338fa2..0fc90a3 100644 --- a/.github/workflows/2022.yml +++ b/.github/workflows/2022.yml @@ -30,6 +30,12 @@ jobs: override: true components: rustfmt, clippy + - name: Set up caching + uses: Swatinem/rust-cache@v2 + with: + workspaces: > + 2022 -> target + - name: Build binaries working-directory: 2022 run: > From 4a55e5318289010ecbbe1a67a1e321a46b5e5300 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 24 Nov 2022 08:23:58 +0100 Subject: [PATCH 4/4] Update README and references --- 2022/README.md | 20 ++++++++++++++++++++ 2022/src/main.rs | 2 +- README.md | 3 ++- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 2022/README.md diff --git a/2022/README.md b/2022/README.md new file mode 100644 index 0000000..b4c59e0 --- /dev/null +++ b/2022/README.md @@ -0,0 +1,20 @@ +# Advent of Code 2022 + +Another year and another Advent of Code in Rust. Because last year went so well, this time we'll be +aiming for a total time of under 250ms. + +```console +$ target/release/aoc_2022 --help +Advent of Code 2022 runner + +Usage: aoc_2022 [OPTIONS] + +Arguments: + Which day to run + +Options: + -t, --time Print time taken + -2, --part2 Run part 2 instead of part 1 + -i, --input Read input from the given file instead of stdin + -h, --help Print help information +``` diff --git a/2022/src/main.rs b/2022/src/main.rs index 86dc88e..1369f8d 100644 --- a/2022/src/main.rs +++ b/2022/src/main.rs @@ -9,7 +9,7 @@ use clap::Parser; use aoc_2022::get_implementation; -/// Advent of Code 2021 runner +/// Advent of Code 2022 runner #[derive(Parser)] struct Opts { /// Which day to run diff --git a/README.md b/README.md index bc26309..aff022f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Advent of Code -[![Advent of Code 2021](https://github.com/bertptrs/adventofcode/actions/workflows/2021.yml/badge.svg)](https://github.com/bertptrs/adventofcode/actions/workflows/2021.yml) +[![Advent of Code 2021](https://github.com/bertptrs/adventofcode/actions/workflows/2022.yml/badge.svg)](https://github.com/bertptrs/adventofcode/actions/workflows/2022.yml) This repository contains my solutions for Advent of Code. See: @@ -11,3 +11,4 @@ This repository contains my solutions for Advent of Code. See: - [2019 edition](./2019) - [2020 edition](./2020) - [2021 edition](./2021) +- [2022 edition](./2022)