aboutsummaryrefslogtreecommitdiff
path: root/2017/src/day10.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2017/src/day10.cpp')
-rw-r--r--2017/src/day10.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/2017/src/day10.cpp b/2017/src/day10.cpp
new file mode 100644
index 0000000..d300a06
--- /dev/null
+++ b/2017/src/day10.cpp
@@ -0,0 +1,124 @@
1#include <filesystem>
2#include <fstream>
3#include <iostream>
4#include <numeric>
5#include <sstream>
6#include <string>
7#include <vector>
8
9using namespace std;
10
11namespace {
12
13string
14read_file(const filesystem::path& filename)
15{
16 ifstream file{ filename };
17 string line;
18 getline(file, line);
19 return line;
20}
21
22vector<size_t>
23split(const string& line)
24{
25 stringstream strm{ line };
26 vector<size_t> data;
27
28 for ( string word; getline(strm, word, ','); ) {
29 data.emplace_back(stoul(word));
30 }
31
32 return data;
33}
34
35vector<unsigned>
36gen_data(size_t len)
37{
38 vector<unsigned> data(len);
39 iota(data.begin(), data.end(), 0UL);
40 return data;
41}
42
43void
44reverse(vector<unsigned>& data, size_t start, size_t len)
45{
46 auto end = start + len;
47
48 while ( start < end ) {
49 swap(data.at(start++ % data.size()), data.at(--end % data.size()));
50 }
51}
52
53void
54hash(vector<unsigned>& data, const vector<size_t>& lengths)
55{
56 size_t pos = 0;
57 for ( size_t skip = 0; skip != lengths.size(); ++skip ) {
58 reverse(data, pos, lengths.at(skip));
59 pos += lengths.at(skip) + skip;
60 }
61}
62
63void
64part1(size_t len, const string& line)
65{
66 auto data = gen_data(len);
67 auto lengths = split(line);
68
69 hash(data, lengths);
70
71 cout << "Part1: " << data.at(0) * data.at(1) << '\n';
72}
73
74void
75hash64(vector<unsigned>& data, const vector<size_t>& lengths)
76{
77 size_t pos = 0;
78 size_t skip = 0;
79 for ( size_t i = 0; i != 64; ++i ) {
80 for ( auto length: lengths ) {
81 reverse(data, pos, length);
82 pos += length + skip;
83 ++skip;
84 }
85 }
86}
87
88void
89part2(string line)
90{
91 line += char(17);
92 line += char(31);
93 line += char(73);
94 line += char(47);
95 line += char(23);
96
97 vector<size_t> lengths;
98 for ( const auto byte: line ) {
99 lengths.emplace_back(static_cast<unsigned char>(byte));
100 }
101
102 auto data = gen_data(256);
103 hash64(data, lengths);
104
105 cout << "Part2: ";
106 for ( size_t i = 0; i != 256; i += 16 ) {
107 size_t value = 0;
108 for ( size_t j = 0; j != 16; ++j ) {
109 value ^= data.at(i + j);
110 }
111 cout << setw(2) << setfill('0') << hex << (value & 0xFF);
112 }
113 cout << '\n';
114}
115
116} // namespace
117
118int
119main()
120{
121 auto line = read_file("data/day10.txt");
122 part1(256, line);
123 part2(line);
124}