aboutsummaryrefslogtreecommitdiff
path: root/2016/src
diff options
context:
space:
mode:
Diffstat (limited to '2016/src')
-rw-r--r--2016/src/day08.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/2016/src/day08.cpp b/2016/src/day08.cpp
new file mode 100644
index 0000000..ab3fc88
--- /dev/null
+++ b/2016/src/day08.cpp
@@ -0,0 +1,101 @@
1#include <algorithm>
2#include <fstream>
3#include <iostream>
4#include <map>
5#include <string>
6#include <vector>
7
8using namespace std;
9
10vector<tuple<char, size_t, size_t>>
11read_file(string_view filename)
12{
13 fstream input{ filename };
14
15 vector<tuple<char, size_t, size_t>> instr;
16
17 for ( string line; getline(input, line); ) {
18 size_t value_a = 0;
19 size_t value_b = 0;
20
21 if ( sscanf(line.c_str(), "rect %zu x %zu", &value_a, &value_b) == 2 ) {
22 instr.emplace_back('r', value_a, value_b);
23 }
24 else if ( sscanf(line.c_str(), "rotate column x=%zu by %zu", &value_a, &value_b) == 2 ) {
25 instr.emplace_back('x', value_a, value_b);
26 }
27 else if ( sscanf(line.c_str(), "rotate row y=%zu by %zu", &value_a, &value_b) == 2 ) {
28 instr.emplace_back('y', value_a, value_b);
29 }
30 }
31
32 return instr;
33}
34
35void
36solve(const vector<tuple<char, size_t, size_t>>& instr)
37{
38 static const size_t width = 50;
39 static const size_t height = 6;
40
41 map<tuple<size_t, size_t>, char> disp;
42
43 auto reverse_y = [&](const size_t y, size_t lhs, size_t rhs) {
44 while ( lhs < rhs ) {
45 swap(disp[{ lhs++, y }], disp[{ --rhs, y }]);
46 }
47 };
48
49 auto rotate_y = [&](const size_t y, const size_t num) {
50 reverse_y(y, 0, width);
51 reverse_y(y, 0, num);
52 reverse_y(y, num, width);
53 };
54
55 auto reverse_x = [&](const size_t x, size_t lhs, size_t rhs) {
56 while ( lhs < rhs ) {
57 swap(disp[{ x, lhs++ }], disp[{ x, --rhs }]);
58 }
59 };
60
61 auto rotate_x = [&](const size_t x, const size_t num) {
62 reverse_x(x, 0, height);
63 reverse_x(x, 0, num);
64 reverse_x(x, num, height);
65 };
66
67 for ( const auto& [chr, val_a, val_b]: instr ) {
68 if ( chr == 'r' ) {
69 for ( size_t x = 0; x != val_a; ++x ) {
70 for ( size_t y = 0; y != val_b; ++y ) {
71 disp[{ x, y }] = '#';
72 }
73 }
74 }
75 else if ( chr == 'x' ) {
76 rotate_x(val_a, val_b);
77 }
78 else if ( chr == 'y' ) {
79 rotate_y(val_a, val_b);
80 }
81 }
82
83 // part1
84 cout << count_if(disp.begin(), disp.end(), [](auto pos) { return pos.second == '#'; }) << endl;
85
86 // part2
87 for ( size_t y = 0; y != height; ++y ) {
88 for ( size_t x = 0; x != width; ++x ) {
89 cout << ((disp[{ x, y }] == '#') ? '#' : ' ');
90 }
91 cout << endl;
92 }
93 cout << endl;
94}
95
96int
97main()
98{
99 auto instr = read_file("data/day08.txt");
100 solve(instr);
101}