aboutsummaryrefslogtreecommitdiff
path: root/2018/src/day14.cpp
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2025-11-19 23:18:20 +0100
committerThomas Schmucker <ts@its1.de>2025-11-19 23:18:20 +0100
commit3f1e9844dbe58428e3b9528e9418c363266ceae4 (patch)
treeb06bc6369594d8bbe03d749d15018b654e4ba0a4 /2018/src/day14.cpp
parentf29300ee1b3a3bada6297aa9b017435a5da9b17d (diff)
downloadadvent-of-code-3f1e9844dbe58428e3b9528e9418c363266ceae4.tar.gz
advent-of-code-3f1e9844dbe58428e3b9528e9418c363266ceae4.tar.bz2
advent-of-code-3f1e9844dbe58428e3b9528e9418c363266ceae4.zip
aoc 2018, days 13 & 14aoc-2018
Diffstat (limited to '2018/src/day14.cpp')
-rw-r--r--2018/src/day14.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/2018/src/day14.cpp b/2018/src/day14.cpp
new file mode 100644
index 0000000..95d0717
--- /dev/null
+++ b/2018/src/day14.cpp
@@ -0,0 +1,88 @@
1#include <iostream>
2#include <vector>
3
4using namespace std;
5
6namespace {
7
8void
9part1(const size_t n)
10{
11 vector<size_t> v{ 3, 7 };
12 size_t first = 0;
13 size_t second = 1;
14
15 while ( v.size() < n + 10 ) {
16 auto value = v[first] + v[second];
17 if ( value >= 10 ) {
18 v.emplace_back(1);
19 value -= 10;
20 }
21 v.emplace_back(value);
22
23 first = (first + v[first] + 1) % v.size();
24 second = (second + v[second] + 1) % v.size();
25 }
26
27 cout << "Part 1: ";
28 for ( size_t i = n; i != n + 10; ++i ) {
29 cout << v[i];
30 }
31 cout << '\n';
32}
33
34void
35part2(const size_t n)
36{
37 vector<size_t> v{ 3, 7 };
38 size_t first = 0;
39 size_t second = 1;
40
41 const size_t len = to_string(n).length();
42
43 auto check = [&] {
44 if ( v.size() < len ) {
45 return false;
46 }
47
48 size_t value = 0;
49 for ( size_t i = len; i > 0; --i ) {
50 value *= 10;
51 value += v[v.size() - i];
52 }
53
54 return value == n;
55 };
56
57 for ( ;; ) {
58 auto value = v[first] + v[second];
59 if ( value >= 10 ) {
60 v.emplace_back(1);
61 if ( check() ) {
62 break;
63 }
64
65 value -= 10;
66 }
67
68 v.emplace_back(value);
69 if ( check() ) {
70 break;
71 }
72
73 first = (first + v[first] + 1) % v.size();
74 second = (second + v[second] + 1) % v.size();
75 }
76
77 cout << "Part 2: " << v.size() - len << '\n';
78}
79
80} // namespace
81
82int
83main()
84{
85 const size_t input = 607331;
86 part1(input);
87 part2(input);
88}