summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
authorFederico Igne <undyamon@disroot.org>2023-12-03 18:57:02 +0100
committerFederico Igne <undyamon@disroot.org>2023-12-03 18:57:02 +0100
commitbaaa6cd61c302c80c664e9aaa5e4ab2ab157b5cf (patch)
tree7d4d90f06b3f005f1dace2acf9ce154b22ed0e37 /2023
parent109f2eff37a72d844ad785f7bd2b9dc7d01353b6 (diff)
downloadaoc-baaa6cd61c302c80c664e9aaa5e4ab2ab157b5cf.tar.gz
aoc-baaa6cd61c302c80c664e9aaa5e4ab2ab157b5cf.zip
aoc(2302): Cube Conundrum
Diffstat (limited to '2023')
-rw-r--r--2023/02/Makefile19
-rw-r--r--2023/02/resources/input.txt100
-rw-r--r--2023/02/resources/input_small.txt5
-rw-r--r--2023/02/src/game.cpp98
-rw-r--r--2023/02/src/game.h45
-rw-r--r--2023/02/src/part1.cpp33
-rw-r--r--2023/02/src/part2.cpp31
7 files changed, 331 insertions, 0 deletions
diff --git a/2023/02/Makefile b/2023/02/Makefile
new file mode 100644
index 0000000..d1ec8c6
--- /dev/null
+++ b/2023/02/Makefile
@@ -0,0 +1,19 @@
1SRC := src/game.cpp
2HDR := $(SRC:.cpp=.h)
3OBJ := $(SRC:.cpp=.o)
4EXE := part1 part2
5
6CXXFLAGS := -std=c++17
7
8.PHONY: run clean
9
10all: $(EXE)
11
12%.o: %.cpp
13 $(CXX) -c $(CXXFLAGS) $< -o $@
14
15clean:
16 rm -rf $(EXE) $(OBJ)
17
18%: src/%.o $(OBJ)
19 $(CXX) $^ -o $@
diff --git a/2023/02/resources/input.txt b/2023/02/resources/input.txt
new file mode 100644
index 0000000..eea772e
--- /dev/null
+++ b/2023/02/resources/input.txt
@@ -0,0 +1,100 @@
1Game 1: 8 green; 5 green, 6 blue, 1 red; 2 green, 1 blue, 4 red; 10 green, 1 red, 2 blue; 2 blue, 3 red
2Game 2: 10 blue, 12 red; 8 red; 7 green, 5 red, 7 blue
3Game 3: 1 red, 15 blue, 3 green; 8 blue, 2 red, 4 green; 2 red, 5 green, 9 blue
4Game 4: 8 green, 4 blue, 1 red; 3 green; 4 blue, 1 red, 12 green; 5 green, 1 red, 8 blue; 3 green, 5 blue, 1 red
5Game 5: 2 green, 8 blue; 7 blue, 4 green; 7 blue; 5 blue; 5 green, 2 blue, 1 red
6Game 6: 6 blue, 3 green; 18 green, 8 blue; 9 green, 4 blue; 4 blue, 2 red, 3 green
7Game 7: 15 red, 12 blue, 15 green; 12 blue, 18 green; 9 blue, 11 red; 16 green, 6 blue, 18 red; 6 blue, 12 red; 14 red, 18 green, 12 blue
8Game 8: 6 red, 13 blue, 3 green; 18 blue; 3 green, 8 red
9Game 9: 3 blue, 4 red; 8 red, 2 blue; 4 green, 8 red, 3 blue; 6 red, 1 blue; 16 green, 2 red, 2 blue
10Game 10: 3 red, 7 blue, 2 green; 1 green, 15 red, 5 blue; 1 red, 5 blue; 3 blue, 4 green
11Game 11: 12 green, 3 blue; 3 red; 1 red, 6 blue, 9 green; 7 blue, 1 red, 13 green; 1 blue, 5 green, 4 red; 18 green, 3 red
12Game 12: 9 green, 13 blue; 3 red, 4 blue, 4 green; 10 green, 7 red, 5 blue; 9 red, 12 blue, 3 green
13Game 13: 15 red, 18 blue, 10 green; 11 red, 3 green, 4 blue; 2 green, 12 blue, 4 red
14Game 14: 12 blue, 6 red; 2 blue, 7 green, 6 red; 12 blue, 7 green; 4 blue, 1 green, 4 red; 9 green, 12 blue; 3 red, 5 green, 8 blue
15Game 15: 9 green, 1 blue; 14 green, 4 red, 1 blue; 1 blue, 6 green, 2 red; 7 red, 13 green, 2 blue; 4 red, 9 green; 2 green, 1 blue, 2 red
16Game 16: 3 blue, 2 green, 5 red; 4 green, 3 blue, 4 red; 6 red, 5 blue, 2 green; 3 red, 11 blue; 6 green, 15 blue, 4 red
17Game 17: 15 blue, 3 green, 2 red; 2 green, 2 red, 15 blue; 1 red, 1 blue, 7 green
18Game 18: 2 blue, 9 red; 12 red, 1 green, 6 blue; 5 red, 5 blue, 2 green
19Game 19: 3 red, 4 green, 8 blue; 10 red, 8 green, 1 blue; 13 blue, 7 green, 10 red; 6 red, 1 green, 11 blue; 9 green, 7 blue, 10 red; 7 blue, 7 red
20Game 20: 8 blue, 4 green, 14 red; 4 green, 16 red, 1 blue; 10 blue, 14 red, 8 green; 4 green, 13 blue, 20 red; 5 blue, 5 green, 1 red
21Game 21: 4 green, 10 blue, 5 red; 11 blue, 4 green, 1 red; 3 blue, 3 red, 2 green; 1 red, 11 blue, 6 green; 1 green, 9 blue, 5 red; 7 blue, 5 green
22Game 22: 3 green, 7 blue, 6 red; 12 red, 11 blue, 2 green; 1 blue, 1 green, 15 red; 6 blue, 1 green, 8 red; 4 blue, 1 red; 2 blue, 1 green, 5 red
23Game 23: 2 blue, 5 green, 13 red; 1 green, 5 blue, 16 red; 6 blue, 9 green, 9 red; 7 green, 3 blue
24Game 24: 2 green; 2 red, 7 blue, 17 green; 5 red, 6 blue, 13 green; 1 green, 6 blue; 2 green, 4 red, 2 blue; 4 blue, 2 green
25Game 25: 2 green, 5 blue, 9 red; 2 green, 8 red, 5 blue; 3 green, 1 red, 19 blue
26Game 26: 3 green, 2 blue, 8 red; 4 red, 2 blue; 11 red, 3 green; 9 red, 3 green, 6 blue; 10 red, 1 green, 2 blue; 4 blue, 4 green, 14 red
27Game 27: 1 green, 4 red, 7 blue; 13 red; 17 red
28Game 28: 5 red, 17 green, 15 blue; 7 blue; 7 red, 12 green, 10 blue; 5 red, 11 blue, 3 green
29Game 29: 4 blue, 9 red, 9 green; 2 green, 10 red, 2 blue; 3 red, 4 blue, 6 green; 2 green, 17 red, 1 blue; 2 red, 7 green, 1 blue
30Game 30: 16 red, 5 blue, 11 green; 5 blue, 5 green, 9 red; 7 green, 1 red, 6 blue
31Game 31: 3 green, 11 blue; 5 green; 8 green, 13 blue; 4 red, 10 blue, 8 green
32Game 32: 11 blue, 5 green, 4 red; 7 blue; 1 red, 1 green, 7 blue; 7 red, 1 blue, 4 green
33Game 33: 7 red, 3 green, 6 blue; 2 red, 16 green, 5 blue; 1 blue, 2 red, 8 green
34Game 34: 1 blue, 1 red, 1 green; 9 red, 6 green; 2 blue, 8 red, 6 green; 1 blue, 12 green, 13 red
35Game 35: 10 red, 9 green; 1 red, 4 blue, 4 green; 7 blue, 3 green, 4 red
36Game 36: 5 red, 6 green, 4 blue; 9 green, 1 red; 12 red, 12 green, 4 blue; 3 red; 18 green, 5 red, 4 blue
37Game 37: 10 green, 4 blue, 2 red; 1 red, 3 blue, 9 green; 5 blue, 4 green, 1 red; 6 green, 12 blue; 7 green, 1 red, 13 blue; 9 green, 20 blue, 2 red
38Game 38: 9 blue, 20 red, 2 green; 3 blue, 6 green, 19 red; 10 green, 8 red, 2 blue; 4 blue, 4 red, 3 green
39Game 39: 4 green, 2 blue, 4 red; 16 blue, 1 red, 2 green; 13 red, 2 green; 16 blue, 7 red, 3 green
40Game 40: 8 blue, 2 green, 2 red; 7 blue, 2 red, 1 green; 8 green, 12 blue, 2 red; 2 red, 3 blue, 8 green
41Game 41: 9 blue, 2 green; 10 blue, 3 green; 1 green, 9 blue, 3 red; 3 blue, 3 green; 12 blue, 1 red; 3 blue, 1 green, 1 red
42Game 42: 1 blue, 1 green, 8 red; 1 blue, 1 red; 2 red, 1 green
43Game 43: 5 red, 2 green, 8 blue; 11 blue, 10 green, 1 red; 11 blue, 7 red
44Game 44: 9 red, 3 green; 9 red, 1 blue, 6 green; 14 red, 5 green; 4 red, 2 green, 1 blue
45Game 45: 5 blue, 1 red, 1 green; 5 blue, 1 red; 6 blue; 10 blue, 1 green; 1 red
46Game 46: 4 green, 8 blue, 13 red; 12 green, 11 blue, 12 red; 1 green, 13 red, 1 blue; 12 red, 8 green, 12 blue
47Game 47: 1 green, 16 blue, 15 red; 1 blue; 18 red, 10 blue, 9 green; 17 blue, 16 red, 5 green; 2 red, 3 blue, 9 green
48Game 48: 2 blue, 4 green; 7 blue, 3 red, 2 green; 17 blue, 13 red; 2 red, 1 green, 9 blue; 2 red, 14 blue
49Game 49: 6 red, 2 blue, 3 green; 1 green, 4 blue, 7 red; 5 red, 8 green, 6 blue; 1 red, 9 green
50Game 50: 18 red, 4 blue; 6 blue, 3 green, 13 red; 1 green, 7 red, 6 blue
51Game 51: 10 blue, 1 green, 9 red; 3 green, 6 blue, 8 red; 4 red, 2 green, 12 blue
52Game 52: 7 blue, 1 red, 8 green; 2 red, 9 blue, 8 green; 16 blue, 7 green; 1 red, 11 green, 8 blue; 2 red, 20 blue
53Game 53: 8 green, 15 red, 4 blue; 5 green, 13 blue; 6 blue, 6 green, 15 red; 12 blue, 2 green, 2 red
54Game 54: 3 green, 5 red, 1 blue; 1 blue, 6 green, 2 red; 4 green, 3 red
55Game 55: 12 green, 8 red, 3 blue; 6 blue, 2 red, 7 green; 4 blue, 13 red, 11 green; 12 green, 9 blue, 7 red; 10 red, 6 blue, 3 green
56Game 56: 6 red, 1 green, 2 blue; 1 red, 1 green, 3 blue; 12 red, 4 blue, 4 green; 3 green, 5 blue, 1 red; 5 blue, 3 green, 2 red; 1 green, 5 red, 7 blue
57Game 57: 1 blue, 1 green, 3 red; 10 red, 6 green, 1 blue; 4 red, 4 green, 2 blue; 7 green, 2 blue, 1 red
58Game 58: 5 green, 2 blue, 4 red; 2 red, 2 blue; 5 red, 3 green; 3 blue, 5 green; 6 red, 2 green, 2 blue; 7 red, 3 blue, 5 green
59Game 59: 14 red, 9 green; 11 red, 2 blue, 5 green; 18 red, 2 blue, 4 green
60Game 60: 16 red, 9 green, 2 blue; 8 green, 17 red; 3 blue, 5 green, 14 red
61Game 61: 12 red, 17 blue, 18 green; 1 green, 1 blue; 1 blue, 4 green, 6 red
62Game 62: 2 blue, 5 green, 3 red; 1 blue, 7 green, 6 red; 8 blue, 1 red; 4 blue, 5 red, 12 green; 15 blue, 3 green, 1 red
63Game 63: 2 blue, 2 red, 1 green; 5 red, 10 blue, 4 green; 4 green, 5 blue, 8 red
64Game 64: 2 blue, 14 green; 9 green, 5 red; 7 red, 3 blue, 10 green; 14 green, 2 blue, 5 red
65Game 65: 4 green, 7 blue, 1 red; 3 red, 2 green, 7 blue; 5 blue, 2 red, 1 green; 6 blue, 2 green; 7 blue
66Game 66: 9 red, 2 green, 5 blue; 5 blue; 8 blue, 5 green, 11 red; 17 blue, 3 green, 14 red; 2 green, 9 blue; 11 red, 4 blue
67Game 67: 2 green, 7 red, 8 blue; 6 red, 4 green; 1 red, 3 green, 7 blue; 7 blue, 7 red, 4 green; 2 red, 1 green; 3 green, 6 red, 2 blue
68Game 68: 4 red, 2 blue, 5 green; 5 blue, 8 red, 2 green; 11 red, 2 green, 4 blue; 7 red, 5 blue, 3 green
69Game 69: 8 blue, 1 green, 4 red; 3 red, 11 blue, 9 green; 12 blue, 10 green; 1 red, 15 blue, 7 green
70Game 70: 13 blue, 1 green, 8 red; 15 blue, 10 red; 10 blue, 17 red; 15 red, 4 green, 6 blue; 11 red, 1 blue, 2 green; 14 red, 4 green, 4 blue
71Game 71: 1 red, 10 blue; 1 green, 12 blue, 2 red; 4 red, 4 green, 8 blue
72Game 72: 2 green, 6 red, 1 blue; 7 red, 4 green, 4 blue; 7 red, 4 blue, 7 green; 7 green, 3 blue; 10 green, 9 blue, 8 red; 5 red, 2 green, 8 blue
73Game 73: 8 blue, 2 green, 9 red; 2 green, 10 red, 6 blue; 3 blue, 6 green, 2 red
74Game 74: 2 blue, 10 green, 7 red; 4 blue, 13 red, 3 green; 11 green, 3 red, 4 blue
75Game 75: 14 green, 1 red, 7 blue; 15 blue, 11 green, 1 red; 11 green, 15 blue, 6 red
76Game 76: 7 green, 7 red, 2 blue; 4 blue, 18 red, 9 green; 12 red, 4 blue, 1 green
77Game 77: 3 blue, 1 green, 12 red; 10 green, 13 red, 7 blue; 7 green, 12 red; 6 blue, 10 red; 5 blue, 3 green, 17 red; 3 green, 5 blue, 13 red
78Game 78: 11 red, 9 blue; 2 red, 7 blue; 12 red, 7 blue, 3 green; 3 green, 8 red, 9 blue; 1 green, 5 red, 6 blue
79Game 79: 6 red, 12 blue; 5 red, 4 green, 11 blue; 13 blue, 2 green, 3 red
80Game 80: 7 red, 6 blue; 2 green, 7 red, 6 blue; 5 blue, 6 red, 2 green; 1 green, 7 red, 2 blue; 4 green, 6 blue, 7 red; 1 green, 6 red, 10 blue
81Game 81: 10 blue, 7 green, 3 red; 7 green, 3 red, 16 blue; 18 blue, 3 red, 7 green
82Game 82: 7 red, 5 blue, 9 green; 7 blue, 8 green, 11 red; 1 blue, 1 green, 10 red; 5 red, 8 blue, 7 green; 6 red, 10 green, 2 blue; 3 blue, 5 green, 10 red
83Game 83: 2 red, 2 green, 1 blue; 2 green, 2 red; 6 red, 1 green; 8 red, 1 blue, 1 green; 1 red, 1 green; 3 red
84Game 84: 9 red, 4 green; 1 red, 13 green, 2 blue; 2 green, 15 red, 2 blue
85Game 85: 2 green, 4 red; 1 blue; 2 green, 4 red, 1 blue
86Game 86: 2 green, 10 red, 3 blue; 3 red, 5 blue; 3 green, 2 blue, 8 red; 1 blue, 5 red, 2 green
87Game 87: 19 green, 9 blue, 7 red; 12 red, 15 green; 4 blue, 8 green; 6 green, 3 red, 11 blue; 16 green, 4 blue, 11 red; 10 red, 4 blue, 9 green
88Game 88: 6 red, 2 green; 10 red, 4 green, 4 blue; 1 blue, 8 red, 12 green; 7 green, 2 blue, 12 red; 1 green, 5 blue, 16 red; 10 red, 5 blue
89Game 89: 1 red, 14 blue, 1 green; 1 red, 12 blue, 8 green; 2 red, 13 blue, 11 green; 8 blue, 4 red, 16 green; 4 red, 5 blue; 6 blue, 1 red, 1 green
90Game 90: 3 blue, 9 green, 5 red; 4 green, 6 red, 1 blue; 2 blue, 12 green, 5 red; 1 green, 1 blue, 3 red; 5 red, 3 green
91Game 91: 8 green, 3 blue, 8 red; 8 green, 4 blue, 4 red; 5 red, 1 green
92Game 92: 1 green, 9 red; 1 red, 4 blue; 9 red, 2 green; 3 red, 1 blue
93Game 93: 1 red, 16 green, 5 blue; 1 red, 1 green, 4 blue; 4 blue, 6 red, 13 green
94Game 94: 9 red, 9 blue, 3 green; 5 green, 11 blue, 1 red; 3 red, 6 blue
95Game 95: 2 green, 4 blue; 8 green, 2 blue, 12 red; 10 red, 9 green; 4 red, 2 blue, 4 green; 8 blue, 7 green, 14 red; 1 blue, 4 red, 8 green
96Game 96: 12 red, 2 blue, 8 green; 6 green, 6 red; 7 blue, 8 green, 6 red; 14 red, 8 green; 2 blue, 4 green, 10 red; 6 green, 7 blue, 7 red
97Game 97: 4 green, 12 red, 2 blue; 8 blue, 3 red, 3 green; 2 blue, 2 red, 7 green; 17 blue, 1 green, 7 red; 19 blue, 1 red, 6 green; 6 green, 7 red, 9 blue
98Game 98: 13 red, 15 green, 14 blue; 6 blue, 1 green; 14 blue, 12 red, 1 green
99Game 99: 1 green, 11 red, 12 blue; 7 red, 20 blue, 1 green; 5 blue, 5 red; 6 blue, 4 red; 1 blue, 1 green; 6 red, 8 blue
100Game 100: 2 red, 9 green, 11 blue; 13 blue, 4 red, 16 green; 8 green, 13 blue; 10 green, 1 red, 12 blue
diff --git a/2023/02/resources/input_small.txt b/2023/02/resources/input_small.txt
new file mode 100644
index 0000000..295c36d
--- /dev/null
+++ b/2023/02/resources/input_small.txt
@@ -0,0 +1,5 @@
1Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
2Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
3Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
4Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
5Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
diff --git a/2023/02/src/game.cpp b/2023/02/src/game.cpp
new file mode 100644
index 0000000..a99b8a2
--- /dev/null
+++ b/2023/02/src/game.cpp
@@ -0,0 +1,98 @@
1#include "game.h"
2
3#include <iostream>
4#include <sstream>
5
6Game::Game(int id) : id_{ id }
7{
8}
9
10void Game::push_back(const std::vector<int>& draw)
11{
12 draws.push_back(draw);
13}
14
15bool Game::is_valid(int blue, int red, int green) const
16{
17 for (const auto& draw : draws)
18 {
19 if (draw[0] > blue or draw[1] > red or draw[2] > green)
20 {
21 return false;
22 }
23 }
24 return true;
25}
26
27int Game::power() const
28{
29 int blue{}, red{}, green{};
30 for (const auto& draw : draws)
31 {
32 blue = std::max(draw[0], blue);
33 red = std::max(draw[1], red);
34 green = std::max(draw[2], green);
35 }
36
37 return blue * red * green;
38}
39
40std::string Game::to_string() const
41{
42 std::ostringstream out;
43 out << "Game " << id_ << ": ";
44 for (const auto& draw : draws)
45 {
46 out << draw[0] << " " << draw[1] << " " << draw[2] << ";";
47 }
48
49 return out.str();
50}
51
52Game Game::from_string(const std::string& line)
53{
54 std::istringstream in(line);
55
56 std::string id;
57 in >> skip<game_t> >> id;
58 id.pop_back();
59 Game game{ std::stoi(id) };
60
61 int n;
62 std::string kind;
63 std::vector<int> draw{ 0, 0, 0};
64
65 while (in >> n >> kind)
66 {
67 char sep{ kind.back() };
68 if (sep == ';' or sep == ',')
69 {
70 kind.pop_back();
71 }
72 else
73 {
74 sep = ';';
75 }
76
77 if (kind == "blue")
78 {
79 draw[0] += n;
80 }
81 else if (kind == "red")
82 {
83 draw[1] += n;
84 }
85 else if (kind == "green")
86 {
87 draw[2] += n;
88 }
89
90 if (sep == ';')
91 {
92 game.push_back(draw);
93 draw = { 0, 0, 0 };
94 }
95 }
96
97 return game;
98}
diff --git a/2023/02/src/game.h b/2023/02/src/game.h
new file mode 100644
index 0000000..1c8002a
--- /dev/null
+++ b/2023/02/src/game.h
@@ -0,0 +1,45 @@
1#ifndef GAME_H
2#define GAME_H
3
4#include <stdexcept>
5#include <string>
6#include <tuple>
7#include <vector>
8
9template<const char* keyword, typename CharT, typename Traits>
10std::basic_istream<CharT, Traits>& skip(std::basic_istream<CharT, Traits>& stream)
11{
12 std::string word;
13 stream >> word;
14 if (word != keyword)
15 {
16 throw std::invalid_argument("Malformed input");
17 }
18
19 return stream;
20}
21
22class Game
23{
24 int id_;
25 std::vector<std::vector<int>> draws{};
26
27 static constexpr char game_t[] = "Game";
28
29 public:
30 Game(int id);
31
32 inline int id() const
33 {
34 return id_;
35 }
36
37 bool is_valid(int blue, int red, int green) const;
38 int power() const;
39 void push_back(const std::vector<int>& draw);
40 std::string to_string() const;
41
42 static Game from_string(const std::string& line);
43};
44
45#endif //GAME_H
diff --git a/2023/02/src/part1.cpp b/2023/02/src/part1.cpp
new file mode 100644
index 0000000..c9fe48c
--- /dev/null
+++ b/2023/02/src/part1.cpp
@@ -0,0 +1,33 @@
1#include <iostream>
2#include <fstream>
3
4#include "game.h"
5
6int main(void)
7{
8 int answer{};
9 std::vector<Game> games{};
10
11 std::ifstream input{ "resources/input.txt" };
12 if (input.is_open())
13 {
14 std::string line;
15
16 while (not std::getline(input,line).eof())
17 {
18 games.push_back(Game::from_string(line));
19 }
20 }
21 input.close();
22
23 for (const auto& game : games)
24 {
25 if (game.is_valid(14, 12, 13))
26 {
27 answer += game.id();
28 }
29 }
30
31 std::cout << answer << std::endl;
32 return 0;
33}
diff --git a/2023/02/src/part2.cpp b/2023/02/src/part2.cpp
new file mode 100644
index 0000000..52b8fc8
--- /dev/null
+++ b/2023/02/src/part2.cpp
@@ -0,0 +1,31 @@
1#include <algorithm>
2#include <iostream>
3#include <fstream>
4
5#include "game.h"
6
7int main(void)
8{
9 int answer{};
10 std::vector<Game> games{};
11
12 std::ifstream input{ "resources/input.txt" };
13 if (input.is_open())
14 {
15 std::string line;
16
17 while (not std::getline(input,line).eof())
18 {
19 games.push_back(Game::from_string(line));
20 }
21 }
22 input.close();
23
24 for (const auto& game : games)
25 {
26 answer += game.power();
27 }
28
29 std::cout << answer << std::endl;
30 return 0;
31}