aboutsummaryrefslogtreecommitdiff
path: root/2018/src/day09.cpp
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2025-11-16 13:23:34 +0100
committerThomas Schmucker <ts@its1.de>2025-11-16 13:23:34 +0100
commit8c96639ec1f6757570510fc27f1c5fabece35eaf (patch)
tree3a2b2146b6e8a353fa4c5edd105790320cce2b26 /2018/src/day09.cpp
parentbdd35a7bee7f23c912d0c453abc263805d8d8ccf (diff)
downloadadvent-of-code-8c96639ec1f6757570510fc27f1c5fabece35eaf.tar.gz
advent-of-code-8c96639ec1f6757570510fc27f1c5fabece35eaf.tar.bz2
advent-of-code-8c96639ec1f6757570510fc27f1c5fabece35eaf.zip
aoc 2018, days 1-11
Diffstat (limited to '2018/src/day09.cpp')
-rw-r--r--2018/src/day09.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/2018/src/day09.cpp b/2018/src/day09.cpp
new file mode 100644
index 0000000..d1b4eb0
--- /dev/null
+++ b/2018/src/day09.cpp
@@ -0,0 +1,113 @@
1#include <iostream>
2#include <vector>
3
4using namespace std;
5
6namespace {
7
8struct Marble {
9 explicit Marble(long score)
10 : score{ score }
11 {
12 }
13
14 Marble(long score, Marble* prev, Marble* next)
15 : score{ score }
16 , prev{ prev }
17 , next{ next }
18 {
19 }
20
21 [[nodiscard]]
22 Marble* insert_after_two(long value) const
23 {
24 auto* insert_after = this->next;
25
26 auto* new_marble = new Marble(value, insert_after, insert_after->next); // NOLINT
27
28 insert_after->next->prev = new_marble;
29 insert_after->next = new_marble;
30
31 return new_marble;
32 }
33
34 [[nodiscard]]
35 pair<Marble*, long> remove_seventh_back()
36 {
37 auto* to_remove = this;
38 for ( int i = 0; i != 7; ++i ) {
39 to_remove = to_remove->prev;
40 }
41
42 to_remove->prev->next = to_remove->next;
43 to_remove->next->prev = to_remove->prev;
44
45 auto* new_current = to_remove->next;
46 auto score = to_remove->score;
47
48 delete to_remove; // NOLINT
49
50 return { new_current, score };
51 }
52
53 long score;
54 Marble* prev{ this };
55 Marble* next{ this };
56};
57
58long
59solve(const size_t players, const long last_marble)
60{
61 auto current = new Marble(0); // NOLINT
62
63 vector<long> scores(players, 0);
64 size_t player = 0;
65
66 for ( long marble = 1; marble <= last_marble; ++marble ) {
67 if ( marble % 23 != 0 ) {
68 current = current->insert_after_two(marble);
69 }
70 else {
71 auto [new_current, removed_score] = current->remove_seventh_back();
72
73 scores[player] += marble + removed_score;
74 current = new_current;
75 }
76
77 player += 1;
78 player %= players;
79 }
80
81 Marble* start = current;
82 do {
83 Marble* next = start->next;
84 delete start; // NOLINT
85 start = next;
86 } while ( start != current );
87
88 return ranges::max(scores);
89}
90
91void
92part1(const size_t players, const long last_marble)
93{
94 cout << "Part 1: " << solve(players, last_marble) << '\n';
95}
96
97void
98part2(const size_t players, const long last_marble)
99{
100 cout << "Part 2: " << solve(players, last_marble * 100) << '\n';
101}
102
103} // namespace
104
105int
106main()
107{
108 static const size_t players = 400;
109 static const long points = 71864;
110
111 part1(players, points);
112 part2(players, points);
113}