aboutsummaryrefslogtreecommitdiff
path: root/2017/src/day06.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2017/src/day06.cpp')
-rw-r--r--2017/src/day06.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/2017/src/day06.cpp b/2017/src/day06.cpp
new file mode 100644
index 0000000..596ca2c
--- /dev/null
+++ b/2017/src/day06.cpp
@@ -0,0 +1,82 @@
1#include <filesystem>
2#include <fstream>
3#include <iostream>
4#include <map>
5#include <set>
6#include <vector>
7
8using namespace std;
9
10namespace {
11
12vector<int>
13read_lines(const filesystem::path& filename)
14{
15 ifstream file{ filename };
16 vector<int> lines;
17
18 for ( int value{}; file >> value; ) {
19 lines.emplace_back(value);
20 }
21
22 return lines;
23}
24
25void
26distribute(vector<int>& values)
27{
28 auto iter = ranges::max_element(values);
29 auto max_value = *iter;
30
31 *iter = 0;
32
33 while ( max_value-- > 0 ) {
34 ++iter;
35 if ( iter == values.end() ) {
36 iter = values.begin();
37 }
38 *iter += 1;
39 }
40}
41
42void
43part1(vector<int> values)
44{
45 set<vector<int>> seen;
46 for ( int step = 0;; ++step ) {
47 if ( seen.contains(values) ) {
48 cout << "Part1: " << step << '\n';
49 return;
50 }
51
52 seen.insert(values);
53
54 distribute(values);
55 }
56}
57
58void
59part2(vector<int> values)
60{
61 map<vector<int>, int> seen;
62 for ( int step = 0;; ++step ) {
63 if ( seen.contains(values) ) {
64 cout << "Part2: " << step - seen.at(values) << '\n';
65 return;
66 }
67
68 seen.emplace(values, step);
69
70 distribute(values);
71 }
72}
73
74} // namespace
75
76int
77main()
78{
79 auto values = read_lines("data/day06.txt");
80 part1(values);
81 part2(values);
82}