aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-02-14 16:41:15 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-02-14 16:41:15 +0800
commit4c6da7a0f332d14c1f11c9427259e871c03cac50 (patch)
treea28aa7589641b64a35b9e280656f474b4fe78855
parentc98f08c412db75146f97b0a85375d8162af15e32 (diff)
downloadadvent-of-code-4c6da7a0f332d14c1f11c9427259e871c03cac50.tar.gz
advent-of-code-4c6da7a0f332d14c1f11c9427259e871c03cac50.zip
2017 day21 part1
-rw-r--r--src/2017/day21/aoc.cpp35
-rw-r--r--src/2017/day21/aoc.h254
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);