aboutsummaryrefslogtreecommitdiff
path: root/2016/src
diff options
context:
space:
mode:
Diffstat (limited to '2016/src')
-rw-r--r--2016/src/day09.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/2016/src/day09.cpp b/2016/src/day09.cpp
new file mode 100644
index 0000000..e0b0468
--- /dev/null
+++ b/2016/src/day09.cpp
@@ -0,0 +1,72 @@
1#include <fstream>
2#include <iostream>
3
4using namespace std;
5
6string
7read_file(string_view filename)
8{
9 fstream input{ filename };
10 string line;
11 getline(input, line);
12 return line;
13}
14
15void
16part1(string_view line)
17{
18 size_t len = 0;
19 for ( size_t i = 0; i != line.length(); ) {
20 size_t lhs = 0;
21 size_t rhs = 0;
22
23 if ( sscanf(&line[i], "(%zux%zu)", &lhs, &rhs) == 2 ) {
24 i = line.find(')', i) + 1 + lhs;
25 len += lhs * rhs;
26 }
27 else {
28 ++i;
29 ++len;
30 }
31 }
32 cout << len << endl;
33}
34
35void
36part2(string_view line)
37{
38 function<size_t(string_view)> part2_rec = [&](string_view line) {
39 size_t len = 0;
40 for ( size_t i = 0; i != line.length(); ) {
41 size_t lhs = 0;
42 size_t rhs = 0;
43
44 if ( sscanf(&line[i], "(%zux%zu)", &lhs, &rhs) == 2 ) {
45 i = line.find(')', i) + 1;
46 len += part2_rec({ &line[i], lhs }) * rhs;
47 i += lhs;
48 }
49 else {
50 ++i;
51 ++len;
52 }
53 }
54 return len;
55 };
56
57 cout << part2_rec(line) << endl;
58}
59
60int
61main()
62{
63 auto line = read_file("data/day09.txt");
64 // part1("ADVENT");
65 // part1("A(1x5)BC");
66 // part1("(3x3)XYZ");
67 // part1("A(2x2)BCD(2x2)EFG");
68 // part1("(6x1)(1x3)A");
69 // part1("X(8x2)(3x3)ABCY");
70 part1(line);
71 part2(line);
72}