diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-02-14 16:41:15 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-02-14 16:41:15 +0800 |
commit | 4c6da7a0f332d14c1f11c9427259e871c03cac50 (patch) | |
tree | a28aa7589641b64a35b9e280656f474b4fe78855 | |
parent | c98f08c412db75146f97b0a85375d8162af15e32 (diff) | |
download | advent-of-code-4c6da7a0f332d14c1f11c9427259e871c03cac50.tar.gz advent-of-code-4c6da7a0f332d14c1f11c9427259e871c03cac50.zip |
2017 day21 part1
-rw-r--r-- | src/2017/day21/aoc.cpp | 35 | ||||
-rw-r--r-- | src/2017/day21/aoc.h | 254 |
2 files changed, 251 insertions, 38 deletions
diff --git a/src/2017/day21/aoc.cpp b/src/2017/day21/aoc.cpp index 706fa8a..716d4e6 100644 --- a/src/2017/day21/aoc.cpp +++ b/src/2017/day21/aoc.cpp @@ -1,6 +1,39 @@ #include "aoc.h" +#include <map> namespace aoc2017 { -std::pair<int64_t, int64_t> day21(line_view) { return {0, 0}; } +std::pair<int64_t, int64_t> day21(line_view file) { + std::map<std::string, std::string> rules; + + per_line(file, [&rules](line_view lv) { + const char* p0 = lv.line; + const char* p1 = p0; + std::string k; + std::string v; + while (p1 < lv.line + lv.length) { + if (*p1 == '=') { + k = std::string{p0, (size_t)(p1 - p0 - 1)}; + p0 = p1 + 3; + } + if (*p1 == '\n') { + v = std::string{p0, (size_t)(p1 - p0)}; + } + p1++; + } + rules.insert({k, v}); + return true; + }); + + // .#. + // ..# + // ### + square3 s3{".#./..#/###"}; + + // for (auto& kv : rules) { + // printf("%s => %s\n", kv.first.c_str(), kv.second.c_str()); + // } + + return {0, 0}; +} } // namespace aoc2017 diff --git a/src/2017/day21/aoc.h b/src/2017/day21/aoc.h index fe2fc56..1ee9711 100644 --- a/src/2017/day21/aoc.h +++ b/src/2017/day21/aoc.h @@ -9,18 +9,67 @@ struct square2 { // ../.. square2(const std::string& ss) { - s[0] = *ss.data(); - s[1] = *(ss.data() + 1); - s[2] = *(ss.data() + 3); - s[3] = *(ss.data() + 4); + int j = 0; + for (int i = 0; i < 2; i++) { + memcpy(s + 2 * i, ss.data() + 2 * i + j, 2); + j++; + } } - std::vector<square2> flip() { return {}; } - std::vector<square2> rotate() { return {}; } + + square2() {} + + std::vector<square2> flip() const noexcept { + square2 s0; + s0.s[0] = s[1]; + s0.s[1] = s[0]; + s0.s[2] = s[3]; + s0.s[3] = s[2]; + + square2 s1; + s1.s[0] = s[2]; + s1.s[1] = s[3]; + s1.s[2] = s[0]; + s1.s[3] = s[1]; + + return {s0, s1}; + } + + std::vector<square2> rotate() const noexcept { + square2 s0; + s0.s[0] = s[2]; + s0.s[1] = s[0]; + s0.s[2] = s[3]; + s0.s[3] = s[1]; + + square2 s1; + s1.s[0] = s[3]; + s1.s[1] = s[2]; + s1.s[2] = s[1]; + s1.s[3] = s[0]; + + square2 s2; + s2.s[0] = s[1]; + s2.s[1] = s[3]; + s2.s[2] = s[0]; + s2.s[3] = s[2]; + + return {s0, s1, s2}; + } + std::string to_string() { char sx[6] = {0}; sprintf(sx, "%c%c/%c%c", s[0], s[1], s[2], s[3]); return sx; } + + void print() const noexcept { + for (int i = 0; i < 4; i++) { + printf("%c", s[i]); + if ((i + 1) % 2 == 0) { + printf("\n"); + } + } + } }; struct square3 { @@ -28,25 +77,135 @@ struct square3 { // .../.../... square3(const std::string& ss) { - s[0] = *ss.data(); - s[1] = *(ss.data() + 1); - s[2] = *(ss.data() + 2); + int j = 0; + for (int i = 0; i < 3; i++) { + memcpy(s + 3 * i, ss.data() + 3 * i + j, 3); + j++; + } + } + square3() {} + + std::vector<square3> flip() const noexcept { + square3 s0; + s0.s[0] = s[2]; + s0.s[1] = s[1]; + s0.s[2] = s[0]; + s0.s[3] = s[5]; + s0.s[4] = s[4]; + s0.s[5] = s[3]; + s0.s[6] = s[8]; + s0.s[7] = s[7]; + s0.s[8] = s[6]; + + square3 s1; + s1.s[0] = s[6]; + s1.s[6] = s[0]; + s1.s[3] = s[3]; + s1.s[1] = s[7]; + s1.s[7] = s[1]; + s1.s[4] = s[4]; + s1.s[2] = s[8]; + s1.s[8] = s[2]; + s1.s[5] = s[5]; + + return {s0, s1}; + } + + std::vector<square3> rotate() const noexcept { + square3 s0; + s0.s[0] = s[3]; + s0.s[1] = s[0]; + s0.s[2] = s[1]; + s0.s[3] = s[6]; + s0.s[4] = s[4]; + s0.s[5] = s[2]; + s0.s[6] = s[7]; + s0.s[7] = s[8]; + s0.s[8] = s[5]; + + square3 s1; + s1.s[0] = s[6]; + s1.s[1] = s[3]; + s1.s[2] = s[0]; + s1.s[3] = s[7]; + s1.s[4] = s[4]; + s1.s[5] = s[1]; + s1.s[6] = s[8]; + s1.s[7] = s[5]; + s1.s[8] = s[2]; + + square3 s2; + s2.s[0] = s[7]; + s2.s[1] = s[6]; + s2.s[2] = s[3]; + s2.s[3] = s[8]; + s2.s[4] = s[4]; + s2.s[5] = s[0]; + s2.s[6] = s[5]; + s2.s[7] = s[2]; + s2.s[8] = s[1]; + + square3 s3; + s3.s[0] = s[8]; + s3.s[1] = s[7]; + s3.s[2] = s[6]; + s3.s[3] = s[5]; + s3.s[4] = s[4]; + s3.s[5] = s[3]; + s3.s[6] = s[2]; + s3.s[7] = s[1]; + s3.s[8] = s[0]; - s[3] = *(ss.data() + 4); - s[4] = *(ss.data() + 5); - s[5] = *(ss.data() + 6); + square3 s4; + s4.s[0] = s[5]; + s4.s[1] = s[8]; + s4.s[2] = s[7]; + s4.s[3] = s[2]; + s4.s[4] = s[4]; + s4.s[5] = s[6]; + s4.s[6] = s[1]; + s4.s[7] = s[0]; + s4.s[8] = s[3]; - s[6] = *(ss.data() + 8); - s[7] = *(ss.data() + 9); - s[8] = *(ss.data() + 10); + square3 s5; + s5.s[0] = s[2]; + s5.s[1] = s[5]; + s5.s[2] = s[8]; + s5.s[3] = s[1]; + s5.s[4] = s[4]; + s5.s[5] = s[7]; + s5.s[6] = s[0]; + s5.s[7] = s[3]; + s5.s[8] = s[6]; + + square3 s6; + s6.s[0] = s[1]; + s6.s[1] = s[2]; + s6.s[2] = s[5]; + s6.s[3] = s[0]; + s6.s[4] = s[4]; + s6.s[5] = s[8]; + s6.s[6] = s[3]; + s6.s[7] = s[6]; + s6.s[8] = s[7]; + + return {s0, s1, s2, s3, s4, s5, s6}; } - std::vector<square3> flip() { return {}; } - std::vector<square3> rotate() { return {}; } + std::string to_string() { char sx[12] = {0}; sprintf(sx, "%c%c%c/%c%c%c/%c%c%c", s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8]); return sx; } + + void print() const noexcept { + for (int i = 0; i < 9; i++) { + printf("%c", s[i]); + if ((i + 1) % 3 == 0) { + printf("\n"); + } + } + } }; struct square4 { @@ -54,27 +213,48 @@ struct square4 { // ##../#.../..../..#. square4(const std::string& ss) { - s[0] = *ss.data(); - s[1] = *(ss.data() + 1); - s[2] = *(ss.data() + 2); - s[3] = *(ss.data() + 3); - - s[4] = *(ss.data() + 5); - s[5] = *(ss.data() + 6); - s[6] = *(ss.data() + 7); - s[7] = *(ss.data() + 8); - - s[8] = *(ss.data() + 10); - s[9] = *(ss.data() + 11); - s[10] = *(ss.data() + 12); - s[11] = *(ss.data() + 13); - - s[12] = *(ss.data() + 15); - s[13] = *(ss.data() + 16); - s[14] = *(ss.data() + 17); - s[15] = *(ss.data() + 18); + int j = 0; + for (int i = 0; i < 4; i++) { + memcpy(s + 4 * i, ss.data() + 4 * i + j, 4); + j++; + } + } + std::vector<square2> partition() { + square2 s0; + s0.s[0] = s[0]; + s0.s[1] = s[1]; + s0.s[2] = s[4]; + s0.s[3] = s[5]; + + square2 s1; + s1.s[0] = s[2]; + s1.s[1] = s[3]; + s1.s[2] = s[6]; + s1.s[3] = s[7]; + + square2 s2; + s2.s[0] = s[8]; + s2.s[1] = s[9]; + s2.s[2] = s[12]; + s2.s[3] = s[13]; + + square2 s3; + s3.s[0] = s[10]; + s3.s[1] = s[11]; + s3.s[2] = s[14]; + s3.s[3] = s[15]; + + return {s0, s1, s2, s3}; + } + + void print() const noexcept { + for (int i = 0; i < 16; i++) { + printf("%c", s[i]); + if ((i + 1) % 4 == 0) { + printf("\n"); + } + } } - std::vector<square2> partition() { return {}; } }; std::pair<int64_t, int64_t> day21(line_view); |