Part two needs a tidy-up which will come in a bit. But this is how I got the correct answer.
C++ Solutions to Advent of Code
This repository contains solutions to various years of the Advent of Code puzzles. All solutions are written in C++. The solutions aren't designed to be nice or pretty. Instead, I am using it as an experiment in understanding how I approach solving problems.
The solutions are authored by Matthew Gretton-Dann, and Copyright 2020-2021, Matthew Gretton-Dann. Licensed under Apache 2.0 - see license.
Getting the sources
To get the sources clone from git as follows:
git clone https://github.com/matt-gretton-dann/advent-of-code/
Build requirements
The following is required to build the puzzles:
- CMake
- C++20 compiler
- OpenSSL headers.
Running the Puzzles
There is a driver script (./driver.sh
) in the root of the checkout. It will build and run specific
tests. Example use is as follows:
YEAR=2020 # Year of puzzle to run
DAY=01 # Day of puzzle to run
PUZZLE=01 # ID of puzzle (1 or 2)
INPUT=input1.txt # Input to give the puzzle.
./driver.sh $YEAR $DAY $PUZZLE $INPUT
Building the puzzles
The build system uses CMake.
cmake -Bbuild -S.
cmake --build build
Note: Some puzzles require OpenSSL for the MD5 implementation. On macOS this requires you to
pass an appropriate value for OPENSSL_ROOT_DIR
to cmake
. If using homebrew
then x86 this
is -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
and on AArch64 this
is -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl
.
Sources
All code is written in C++.
Directory Layout
Each year of puzzles is in a self-contained directory YEAR
.
Within the directory there are the following files:
puzzle-DAY-NUMBER.cc
. The source for puzzle NUMBER on DAY in the year.driver-DAY-NUMBER.sh
. If present this is used as the driver to run that puzzle.puzzle-DAY-NUMBER.CMakeLists.txt
. If present this is included byCMakeLists.txt
. The variable${puzzle_name}
contains the name of the puzzle target. Some puzzles use this to depend on OpenSSL.
Command Line Interface
The executable command line interface should just take the input in on standard-input and print its result on standard-output.
If this is not possible the script driver-DAY-NUMBER.sh
within the year directory should be
provided. It should take two arguments - the executable to run and the input file to use.