Line data Source code
1 : #pragma once
2 :
3 : #include <chrono>
4 : #include <string>
5 : #include <string_view>
6 : #include <vector>
7 :
8 : class Puzzle {
9 : public:
10 : using Day = std::chrono::day;
11 : using Year = std::chrono::year;
12 :
13 : Puzzle(Year const year_, Day const day_);
14 :
15 11628 : virtual ~Puzzle() = default;
16 :
17 11628 : [[nodiscard]] Year year() const { return _year; }
18 11628 : [[nodiscard]] Day day() const { return _day; }
19 : [[nodiscard]] std::string const name() const;
20 :
21 152 : [[nodiscard]] std::string_view input() const { return _input; }
22 76 : [[nodiscard]] std::string_view solutionPart1() const { return _solutionPart1; }
23 76 : [[nodiscard]] std::string_view solutionPart2() const { return _solutionPart2; }
24 :
25 : virtual std::string runPart1(std::string_view const input) const = 0; // NOLINT
26 : virtual std::string runPart2(std::string_view const input) const = 0; // NOLINT
27 :
28 76 : [[nodiscard]] std::string runPart1() const { return runPart1(input()); }
29 76 : [[nodiscard]] std::string runPart2() const { return runPart2(input()); }
30 :
31 : [[nodiscard]] static Year latestYear();
32 : [[nodiscard]] static Day latestDay(Year const year);
33 : [[nodiscard]] static std::unique_ptr<Puzzle> create(Year const year, Day const day);
34 0 : [[nodiscard]] static std::unique_ptr<Puzzle> create(Day const day) {
35 0 : return create(latestYear(), day);
36 0 : };
37 0 : [[nodiscard]] static std::unique_ptr<Puzzle> createLatest() {
38 0 : return create(latestDay(latestYear()));
39 0 : };
40 : [[nodiscard]] static std::vector<std::unique_ptr<Puzzle>> createAll();
41 : [[nodiscard]] static std::vector<std::unique_ptr<Puzzle>> createAll(Year const year);
42 0 : [[nodiscard]] static std::vector<std::unique_ptr<Puzzle>> createAllLatestYear() {
43 0 : return createAll(latestYear());
44 0 : };
45 :
46 : private:
47 : Year _year;
48 : Day _day;
49 : std::string _input;
50 : std::string _solutionPart1;
51 : std::string _solutionPart2;
52 : };
|