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 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..0f16290 --- /dev/null +++ b/2021/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "aoc-2021" +version = "0.1.0" +edition = "2021" + + +[dependencies] +clap = "3.0.0-beta.5" + +[profile.release] +# Keep debug information in release for better flamegraphs +debug = true 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/2021/src/day01.rs b/2021/src/day01.rs new file mode 100644 index 0000000..113ba49 --- /dev/null +++ b/2021/src/day01.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/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 new file mode 100644 index 0000000..6d5f3ea --- /dev/null +++ b/2021/src/lib.rs @@ -0,0 +1,90 @@ +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), + } + } +} diff --git a/2021/src/main.rs b/2021/src/main.rs new file mode 100644 index 0000000..00e7778 --- /dev/null +++ b/2021/src/main.rs @@ -0,0 +1,47 @@ +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 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 = get_implementation(opts.day.get(), opts.part2)(&mut *input); + + if opts.time { + eprintln!("Execution time: {:?}", Instant::now().duration_since(begin)); + } + + println!("{}", result); +} 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)