commit 3d18c831b24f93695c38386f36882836ab210a2e Author: Benjamin Kraft Date: Mon Dec 18 09:02:00 2023 +0100 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..314fdf1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/cmake-build-debug/ +session +/input/ +/xtensor/ +/xtl/ +.idea diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..7deceb7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.20) +project(AdventOfCode2023) + +set(CMAKE_CXX_STANDARD 23) + +if (WIN32) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +endif() + +file(GLOB_RECURSE SRC_FILES src/**.cpp) +add_executable(AdventOfCode2023 ${SRC_FILES}) + +include(FetchContent) +FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/libcpr/cpr.git GIT_TAG 100cf2050be7619430a615cd0d580b33c62fde6b) +FetchContent_MakeAvailable(cpr) + +target_link_libraries(AdventOfCode2023 cpr::cpr) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1fbbfdb --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +## Advent Of Code 2022 C++ Solutions + + +#### Build with CMakeLists.txt + +#### Run: + +Place a file called "session" with your session key cookie from https://adventofcode.com/ inside the Working Directory. + +Expects runtime arguments as days, for example: + +"5 9 1" executes Days 5, 9, 1 in this order. + +#### Test Inputs + +Add argument "T" after each Day to use XX_testInput.txt rather than XX_input.txt + +For Test-Inputs, it tries to fetch the content of the first code-Tag. You can control this by adding the index of the desired code-Tag. +Example: + +"3T 6T1 9" + +- Day 3 with content from inside the first code-Tag +- Day 6 with content from inside the second code-Tag +- Day 9 with regular input + +#### Get index with Browser Dev Tools: + +Select the correct code-Tag in the inspector, then paste this into the console: + + +Array.from(document.getElementsByTagName("code")).indexOf($0) + diff --git a/fill.py b/fill.py new file mode 100644 index 0000000..6af47bf --- /dev/null +++ b/fill.py @@ -0,0 +1,17 @@ +import os + + +preH = open("pre.h", "r").read() +preCpp = open("pre.cpp", "r").read() + +for dayNum in range(1, 26): + pad = f'{dayNum:02}' + dirName = f"src/days/{pad}" + try: + os.mkdir(dirName) + except OSError: + pass + with open(f"{dirName}/Day{pad}.h", "w") as file: + file.write(preH.replace("XX", pad)) + with open(f"{dirName}/Day{pad}.cpp", "w") as file: + file.write(preCpp.replace("XX", pad)) diff --git a/pre.cpp b/pre.cpp new file mode 100644 index 0000000..d1870cb --- /dev/null +++ b/pre.cpp @@ -0,0 +1,9 @@ +#include "DayXX.h" + +Result DayXX::Task1() { + return Day::Task1(); +} + +Result DayXX::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/pre.h b/pre.h new file mode 100644 index 0000000..afaf745 --- /dev/null +++ b/pre.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class DayXX : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/Day.h b/src/Day.h new file mode 100644 index 0000000..3d1e2b2 --- /dev/null +++ b/src/Day.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include "util.h" + +using namespace std::chrono; +typedef string Result; +typedef std::vector Input; + +class Day { +protected: + Input input; + + virtual Result Task1() { return ""; } + + virtual Result Task2() { return ""; } + +public: + int run(Input &_input) { + input = _input; + + auto start = high_resolution_clock::now(); + + cout << "Task 1" << endl; + Result result1 = Task1(); + auto stop1 = high_resolution_clock::now(); + auto dur1 = duration_cast(stop1 - start); + cout << "Result: " << result1 << endl; + cout << "Duration: " << double(dur1.count()) / 1000. << "ms" << endl; + + cout << "Task 2" << endl; + Result result2 = Task2(); + auto stop2 = high_resolution_clock::now(); + auto dur2 = duration_cast(stop2 - stop1); + cout << "Result: " << result2 << endl; + cout << "Duration: " << double(dur2.count()) / 1000. << "ms" << endl << endl; + + return 0; + } +}; \ No newline at end of file diff --git a/src/days/01/Day01.cpp b/src/days/01/Day01.cpp new file mode 100644 index 0000000..09d9f9c --- /dev/null +++ b/src/days/01/Day01.cpp @@ -0,0 +1,9 @@ +#include "Day01.h" + +Result Day01::Task1() { + return Day::Task1(); +} + +Result Day01::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/01/Day01.h b/src/days/01/Day01.h new file mode 100644 index 0000000..2b72458 --- /dev/null +++ b/src/days/01/Day01.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day01 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/02/Day02.cpp b/src/days/02/Day02.cpp new file mode 100644 index 0000000..f88eb65 --- /dev/null +++ b/src/days/02/Day02.cpp @@ -0,0 +1,9 @@ +#include "Day02.h" + +Result Day02::Task1() { + return Day::Task1(); +} + +Result Day02::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/02/Day02.h b/src/days/02/Day02.h new file mode 100644 index 0000000..e6a2124 --- /dev/null +++ b/src/days/02/Day02.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day02 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/03/Day03.cpp b/src/days/03/Day03.cpp new file mode 100644 index 0000000..dad3568 --- /dev/null +++ b/src/days/03/Day03.cpp @@ -0,0 +1,9 @@ +#include "Day03.h" + +Result Day03::Task1() { + return Day::Task1(); +} + +Result Day03::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/03/Day03.h b/src/days/03/Day03.h new file mode 100644 index 0000000..0ff555a --- /dev/null +++ b/src/days/03/Day03.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day03 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/04/Day04.cpp b/src/days/04/Day04.cpp new file mode 100644 index 0000000..72beed7 --- /dev/null +++ b/src/days/04/Day04.cpp @@ -0,0 +1,9 @@ +#include "Day04.h" + +Result Day04::Task1() { + return Day::Task1(); +} + +Result Day04::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/04/Day04.h b/src/days/04/Day04.h new file mode 100644 index 0000000..8084bcf --- /dev/null +++ b/src/days/04/Day04.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day04 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/05/Day05.cpp b/src/days/05/Day05.cpp new file mode 100644 index 0000000..34bffac --- /dev/null +++ b/src/days/05/Day05.cpp @@ -0,0 +1,9 @@ +#include "Day05.h" + +Result Day05::Task1() { + return Day::Task1(); +} + +Result Day05::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/05/Day05.h b/src/days/05/Day05.h new file mode 100644 index 0000000..128dacd --- /dev/null +++ b/src/days/05/Day05.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day05 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/06/Day06.cpp b/src/days/06/Day06.cpp new file mode 100644 index 0000000..256bfb5 --- /dev/null +++ b/src/days/06/Day06.cpp @@ -0,0 +1,9 @@ +#include "Day06.h" + +Result Day06::Task1() { + return Day::Task1(); +} + +Result Day06::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/06/Day06.h b/src/days/06/Day06.h new file mode 100644 index 0000000..829fca9 --- /dev/null +++ b/src/days/06/Day06.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day06 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/07/Day07.cpp b/src/days/07/Day07.cpp new file mode 100644 index 0000000..339ae0f --- /dev/null +++ b/src/days/07/Day07.cpp @@ -0,0 +1,9 @@ +#include "Day07.h" + +Result Day07::Task1() { + return Day::Task1(); +} + +Result Day07::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/07/Day07.h b/src/days/07/Day07.h new file mode 100644 index 0000000..4cbc911 --- /dev/null +++ b/src/days/07/Day07.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day07 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/08/Day08.cpp b/src/days/08/Day08.cpp new file mode 100644 index 0000000..2cef7b6 --- /dev/null +++ b/src/days/08/Day08.cpp @@ -0,0 +1,9 @@ +#include "Day08.h" + +Result Day08::Task1() { + return Day::Task1(); +} + +Result Day08::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/08/Day08.h b/src/days/08/Day08.h new file mode 100644 index 0000000..f4712e7 --- /dev/null +++ b/src/days/08/Day08.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day08 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/09/Day09.cpp b/src/days/09/Day09.cpp new file mode 100644 index 0000000..4eb2146 --- /dev/null +++ b/src/days/09/Day09.cpp @@ -0,0 +1,9 @@ +#include "Day09.h" + +Result Day09::Task1() { + return Day::Task1(); +} + +Result Day09::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/09/Day09.h b/src/days/09/Day09.h new file mode 100644 index 0000000..c73088e --- /dev/null +++ b/src/days/09/Day09.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day09 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/10/Day10.cpp b/src/days/10/Day10.cpp new file mode 100644 index 0000000..cae811b --- /dev/null +++ b/src/days/10/Day10.cpp @@ -0,0 +1,9 @@ +#include "Day10.h" + +Result Day10::Task1() { + return Day::Task1(); +} + +Result Day10::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/10/Day10.h b/src/days/10/Day10.h new file mode 100644 index 0000000..e263a56 --- /dev/null +++ b/src/days/10/Day10.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day10 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/11/Day11.cpp b/src/days/11/Day11.cpp new file mode 100644 index 0000000..6cb34b6 --- /dev/null +++ b/src/days/11/Day11.cpp @@ -0,0 +1,9 @@ +#include "Day11.h" + +Result Day11::Task1() { + return Day::Task1(); +} + +Result Day11::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/11/Day11.h b/src/days/11/Day11.h new file mode 100644 index 0000000..2883f1a --- /dev/null +++ b/src/days/11/Day11.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day11 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/12/Day12.cpp b/src/days/12/Day12.cpp new file mode 100644 index 0000000..e3cc2c4 --- /dev/null +++ b/src/days/12/Day12.cpp @@ -0,0 +1,9 @@ +#include "Day12.h" + +Result Day12::Task1() { + return Day::Task1(); +} + +Result Day12::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/12/Day12.h b/src/days/12/Day12.h new file mode 100644 index 0000000..b713fc4 --- /dev/null +++ b/src/days/12/Day12.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day12 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/13/Day13.cpp b/src/days/13/Day13.cpp new file mode 100644 index 0000000..619e886 --- /dev/null +++ b/src/days/13/Day13.cpp @@ -0,0 +1,9 @@ +#include "Day13.h" + +Result Day13::Task1() { + return Day::Task1(); +} + +Result Day13::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/13/Day13.h b/src/days/13/Day13.h new file mode 100644 index 0000000..eac7676 --- /dev/null +++ b/src/days/13/Day13.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day13 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/14/Day14.cpp b/src/days/14/Day14.cpp new file mode 100644 index 0000000..4b2001d --- /dev/null +++ b/src/days/14/Day14.cpp @@ -0,0 +1,9 @@ +#include "Day14.h" + +Result Day14::Task1() { + return Day::Task1(); +} + +Result Day14::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/14/Day14.h b/src/days/14/Day14.h new file mode 100644 index 0000000..e7af034 --- /dev/null +++ b/src/days/14/Day14.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day14 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/15/Day15.cpp b/src/days/15/Day15.cpp new file mode 100644 index 0000000..b94014d --- /dev/null +++ b/src/days/15/Day15.cpp @@ -0,0 +1,9 @@ +#include "Day15.h" + +Result Day15::Task1() { + return Day::Task1(); +} + +Result Day15::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/15/Day15.h b/src/days/15/Day15.h new file mode 100644 index 0000000..e526cb1 --- /dev/null +++ b/src/days/15/Day15.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day15 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/16/Day16.cpp b/src/days/16/Day16.cpp new file mode 100644 index 0000000..ac4e8a2 --- /dev/null +++ b/src/days/16/Day16.cpp @@ -0,0 +1,9 @@ +#include "Day16.h" + +Result Day16::Task1() { + return Day::Task1(); +} + +Result Day16::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/16/Day16.h b/src/days/16/Day16.h new file mode 100644 index 0000000..7d47781 --- /dev/null +++ b/src/days/16/Day16.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day16 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/17/Day17.cpp b/src/days/17/Day17.cpp new file mode 100644 index 0000000..d97c359 --- /dev/null +++ b/src/days/17/Day17.cpp @@ -0,0 +1,9 @@ +#include "Day17.h" + +Result Day17::Task1() { + return Day::Task1(); +} + +Result Day17::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/17/Day17.h b/src/days/17/Day17.h new file mode 100644 index 0000000..984c4ba --- /dev/null +++ b/src/days/17/Day17.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day17 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/18/Day18.cpp b/src/days/18/Day18.cpp new file mode 100644 index 0000000..0a70982 --- /dev/null +++ b/src/days/18/Day18.cpp @@ -0,0 +1,9 @@ +#include "Day18.h" + +Result Day18::Task1() { + return Day::Task1(); +} + +Result Day18::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/18/Day18.h b/src/days/18/Day18.h new file mode 100644 index 0000000..0a7c622 --- /dev/null +++ b/src/days/18/Day18.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day18 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/19/Day19.cpp b/src/days/19/Day19.cpp new file mode 100644 index 0000000..2130551 --- /dev/null +++ b/src/days/19/Day19.cpp @@ -0,0 +1,9 @@ +#include "Day19.h" + +Result Day19::Task1() { + return Day::Task1(); +} + +Result Day19::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/19/Day19.h b/src/days/19/Day19.h new file mode 100644 index 0000000..8bd9d57 --- /dev/null +++ b/src/days/19/Day19.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day19 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/20/Day20.cpp b/src/days/20/Day20.cpp new file mode 100644 index 0000000..61da045 --- /dev/null +++ b/src/days/20/Day20.cpp @@ -0,0 +1,9 @@ +#include "Day20.h" + +Result Day20::Task1() { + return Day::Task1(); +} + +Result Day20::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/20/Day20.h b/src/days/20/Day20.h new file mode 100644 index 0000000..3b1d87f --- /dev/null +++ b/src/days/20/Day20.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day20 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/21/Day21.cpp b/src/days/21/Day21.cpp new file mode 100644 index 0000000..2a70ddb --- /dev/null +++ b/src/days/21/Day21.cpp @@ -0,0 +1,9 @@ +#include "Day21.h" + +Result Day21::Task1() { + return Day::Task1(); +} + +Result Day21::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/21/Day21.h b/src/days/21/Day21.h new file mode 100644 index 0000000..0635da0 --- /dev/null +++ b/src/days/21/Day21.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day21 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/22/Day22.cpp b/src/days/22/Day22.cpp new file mode 100644 index 0000000..6e9b249 --- /dev/null +++ b/src/days/22/Day22.cpp @@ -0,0 +1,9 @@ +#include "Day22.h" + +Result Day22::Task1() { + return Day::Task1(); +} + +Result Day22::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/22/Day22.h b/src/days/22/Day22.h new file mode 100644 index 0000000..d7e2b87 --- /dev/null +++ b/src/days/22/Day22.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day22 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/23/Day23.cpp b/src/days/23/Day23.cpp new file mode 100644 index 0000000..7e048b0 --- /dev/null +++ b/src/days/23/Day23.cpp @@ -0,0 +1,9 @@ +#include "Day23.h" + +Result Day23::Task1() { + return Day::Task1(); +} + +Result Day23::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/23/Day23.h b/src/days/23/Day23.h new file mode 100644 index 0000000..06c4bf8 --- /dev/null +++ b/src/days/23/Day23.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day23 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/24/Day24.cpp b/src/days/24/Day24.cpp new file mode 100644 index 0000000..fbf2778 --- /dev/null +++ b/src/days/24/Day24.cpp @@ -0,0 +1,9 @@ +#include "Day24.h" + +Result Day24::Task1() { + return Day::Task1(); +} + +Result Day24::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/24/Day24.h b/src/days/24/Day24.h new file mode 100644 index 0000000..be8afb7 --- /dev/null +++ b/src/days/24/Day24.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day24 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/25/Day25.cpp b/src/days/25/Day25.cpp new file mode 100644 index 0000000..b461fa5 --- /dev/null +++ b/src/days/25/Day25.cpp @@ -0,0 +1,9 @@ +#include "Day25.h" + +Result Day25::Task1() { + return Day::Task1(); +} + +Result Day25::Task2() { + return Day::Task2(); +} \ No newline at end of file diff --git a/src/days/25/Day25.h b/src/days/25/Day25.h new file mode 100644 index 0000000..f4277d0 --- /dev/null +++ b/src/days/25/Day25.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../../Day.h" + +class Day25 : public Day { +protected: + Result Task1() override; + + Result Task2() override; +}; \ No newline at end of file diff --git a/src/days/days.h b/src/days/days.h new file mode 100644 index 0000000..03f3750 --- /dev/null +++ b/src/days/days.h @@ -0,0 +1,57 @@ +#pragma once + +#include "01/Day01.h" +#include "02/Day02.h" +#include "03/Day03.h" +#include "04/Day04.h" +#include "05/Day05.h" +#include "06/Day06.h" +#include "07/Day07.h" +#include "08/Day08.h" +#include "09/Day09.h" +#include "10/Day10.h" +#include "11/Day11.h" +#include "12/Day12.h" +#include "13/Day13.h" +#include "14/Day14.h" +#include "15/Day15.h" +#include "16/Day16.h" +#include "17/Day17.h" +#include "18/Day18.h" +#include "19/Day19.h" +#include "20/Day20.h" +#include "21/Day21.h" +#include "22/Day22.h" +#include "23/Day23.h" +#include "24/Day24.h" +#include "25/Day25.h" + +std::vector getAllDays() { + return { + new Day01(), + new Day02(), + new Day03(), + new Day04(), + new Day05(), + new Day06(), + new Day07(), + new Day08(), + new Day09(), + new Day10(), + new Day11(), + new Day12(), + new Day13(), + new Day14(), + new Day15(), + new Day16(), + new Day17(), + new Day18(), + new Day19(), + new Day20(), + new Day21(), + new Day22(), + new Day23(), + new Day24(), + new Day25() + }; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..b9d6a05 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,96 @@ +#include +#include +#include "days/days.h" + +Input getInput(int day, string key, bool useTestInput, int testFetchIndex) { + Input input; + + char dayStrPadded[3]; + sprintf(dayStrPadded, "%02u", day); + string postfix = useTestInput ? "_testInput.txt" : "_input.txt"; + string localFilePath = "input/" + string(dayStrPadded) + postfix; + + if (!std::filesystem::exists({localFilePath})) { + string dayStr = std::to_string(day); + string url = "https://adventofcode.com/2022/day/" + dayStr; + auto cookies = cpr::Cookies{{"session", key}}; + if (!useTestInput){ + if (key.empty()){ + cout << "Session key Cookie is missing, cannot fetch Input" << endl; + return input; + } + url += "/input"; + cout << "Input does not exist. Fetching from " + url << endl; + std::ofstream file(localFilePath); + file << cpr::Get(cpr::Url{url}, cookies).text; + file.close(); + } else { + cout << "Test Input does not exist. Fetching from " + url << " from -Tag with index " << testFetchIndex << endl; + std::ofstream file(localFilePath); + string res = cpr::Get(cpr::Url{url}).text; + size_t i1 = findAll(res, "")[testFetchIndex]; + size_t i2 = findAll(res, "")[testFetchIndex]; + string codeContent = res.substr(i1 + 6, i2 - (i1 + 6)); + removeAll(codeContent, ""); + removeAll(codeContent, ""); + file << codeContent; + file.close(); + } + } + + std::ifstream file(localFilePath); + + string line; + while (std::getline(file, line)) + input.push_back(line); + + file.close(); + + return input; +} + +string getSessionKey() { + string key; + std::ifstream file("session"); + if (!file.good()) + return ""; + file >> key; + file.close(); + return key; +} + +void parseArgument(const string& arg, int &dayNum, bool &useTestInput, int &testFetchIndex){ + size_t tIndex = arg.find('T'); + if (tIndex == string::npos) { + dayNum = stoi(arg); + return; + } + dayNum = stoi(arg.substr(0, tIndex)); + useTestInput = true; + testFetchIndex = tIndex + 1 < arg.size() ? stoi(arg.substr(tIndex + 1)) : 0; +} + +int main(int argc, char *argv[]) { + + auto key = getSessionKey(); + auto days = getAllDays(); + std::filesystem::create_directory("input"); + + for (int i = 1; i < argc; i++) { + string arg = argv[i]; + bool useTestInput = false; + int testFetchIndex; + int dayNum; + parseArgument(arg, dayNum, useTestInput, testFetchIndex); + cout << "Running day " << dayNum << endl; + Input input = getInput(dayNum, key, useTestInput, testFetchIndex); + Day *day = days[dayNum - 1]; + int code = day->run(input); + if (code != 0) + return code; + } + + days.clear(); + + return 0; +} \ No newline at end of file diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..12596ac --- /dev/null +++ b/src/util.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef uint64_t uint64; +typedef int64_t int64; + +using std::stoi, std::to_string; +using std::cout, std::endl; +using std::string, std::vector, std::pair, std::map; +using std::list, std::set, std::unordered_set; +using std::priority_queue; + +inline vector findAll(const string& data, const string& toSearch){ + vector indices; + + size_t pos = data.find(toSearch); + + while (pos != string::npos){ + indices.push_back(pos); + + pos = data.find(toSearch, pos + toSearch.size()); + } + + return indices; +} + +inline void removeAll(string& data, const string& toRemove) { + vector indices = findAll(data, toRemove); + std::sort(indices.rbegin(), indices.rend()); + for (size_t &i : indices) + data.erase(i, toRemove.size()); +} \ No newline at end of file