aboutsummaryrefslogtreecommitdiff
path: root/2017/src/day13.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2017/src/day13.cpp')
-rw-r--r--2017/src/day13.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/2017/src/day13.cpp b/2017/src/day13.cpp
new file mode 100644
index 0000000..759f302
--- /dev/null
+++ b/2017/src/day13.cpp
@@ -0,0 +1,77 @@
1#include <filesystem>
2#include <fstream>
3#include <iostream>
4#include <tuple>
5#include <vector>
6
7using namespace std;
8
9namespace {
10
11vector<tuple<unsigned long, unsigned long>>
12read_file(const filesystem::path& filename)
13{
14 ifstream file{ filename };
15 unsigned long depth = 0;
16 unsigned long range = 0;
17 char colon = 0;
18
19 vector<tuple<unsigned long, unsigned long>> data;
20
21 while ( file >> depth >> colon >> range ) {
22 data.emplace_back(depth, range);
23 }
24
25 return data;
26}
27
28template<typename T>
29T
30get_pos(T depth, T range, T time)
31{
32 const auto period = 2 * (range - 1);
33 const auto remainder = (depth + time) % period;
34 return remainder < range ? remainder : period - remainder;
35}
36
37void
38part1(const vector<tuple<unsigned long, unsigned long>>& data)
39{
40 unsigned long sum = 0;
41 for ( const auto [depth, range]: data ) {
42 if ( get_pos(depth, range, 0UL) == 0 ) {
43 sum += depth * range;
44 }
45 }
46 cout << "Part1: " << sum << '\n';
47}
48
49void
50part2(const vector<tuple<unsigned long, unsigned long>>& data)
51{
52 for ( unsigned long delay = 0;; ++delay ) {
53 bool pass = true;
54
55 for ( const auto [depth, range]: data ) {
56 if ( get_pos(depth, range, delay) == 0 ) {
57 pass = false;
58 break;
59 }
60 }
61
62 if ( pass ) {
63 cout << "Part2: " << delay << '\n';
64 return;
65 }
66 }
67}
68
69} // namespace
70
71int
72main()
73{
74 auto data = read_file("data/day13.txt");
75 part1(data);
76 part2(data);
77}