aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/2017/day21/aoc.cpp61
-rw-r--r--src/2017/day21/aoc.h40
2 files changed, 64 insertions, 37 deletions
diff --git a/src/2017/day21/aoc.cpp b/src/2017/day21/aoc.cpp
index f3047e7..876f1a0 100644
--- a/src/2017/day21/aoc.cpp
+++ b/src/2017/day21/aoc.cpp
@@ -3,22 +3,35 @@
namespace aoc2017 {
-typedef void (*sfunc)(std::vector<square3>* vs3, std::vector<square2>* vs2,
- const std::map<std::string, std::string>& rs);
+struct rule {
+ std::string k;
+ std::string v;
+};
-void s3tos2(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::map<std::string, std::string>& rs) {
- vs2->clear();
- for (auto& s : *vs3) {
- std::string s4;
- auto vs = s.combo();
- for (auto& c : vs) {
- std::string x = c.to_string();
- auto it = rs.find(x);
- if (it != rs.end()) {
- s4 = it->second;
- break;
+typedef void (*sfunc)(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::vector<rule>& rs);
+
+template <typename T>
+static std::string match(T t, const std::vector<rule>& rs) {
+ std::string s = t.to_string();
+ for (auto& r : rs) {
+ if (r.k == s) {
+ return r.v;
+ }
+ }
+ for (auto& r : rs) {
+ for (auto&& sx : t.combo()) {
+ if (sx.to_string() == r.k) {
+ return r.v;
}
}
+ }
+ return "";
+}
+
+void s3tos2(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::vector<rule>& rs) {
+ vs2->clear();
+ for (auto& s : *vs3) {
+ std::string s4 = match(s, rs);
if (s4.empty()) {
printf("no match %s\n", s.to_string().c_str());
}
@@ -30,19 +43,10 @@ void s3tos2(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::map
printf("s3[%zu] s2[%zu]\n", vs3->size(), vs2->size());
}
-void s2tos3(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::map<std::string, std::string>& rs) {
+void s2tos3(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::vector<rule>& rs) {
vs3->clear();
for (auto& s : *vs2) {
- std::string s3;
- auto vs = s.combo();
- for (auto& c : vs) {
- std::string x = c.to_string();
- auto it = rs.find(x);
- if (it != rs.end()) {
- s3 = it->second;
- break;
- }
- }
+ std::string s3 = match(s, rs);
if (s3.empty()) {
printf("no match %s\n", s.to_string().c_str());
}
@@ -60,8 +64,7 @@ static int count(std::vector<T>* v) {
return t;
}
-static void part1(int t, int times, std::vector<square3>* vs3, std::vector<square2>* vs2,
- const std::map<std::string, std::string>& rs) {
+static void part1(int t, int times, std::vector<square3>* vs3, std::vector<square2>* vs2, const std::vector<rule>& rs) {
sfunc fs[2] = {s3tos2, s2tos3};
while (t < times) {
sfunc f = fs[t % 2];
@@ -72,7 +75,7 @@ static void part1(int t, int times, std::vector<square3>* vs3, std::vector<squar
}
std::pair<int64_t, int64_t> day21(line_view file) {
- std::map<std::string, std::string> rules;
+ std::vector<rule> rules;
per_line(file, [&rules](line_view lv) {
const char* p0 = lv.line;
@@ -89,7 +92,7 @@ std::pair<int64_t, int64_t> day21(line_view file) {
}
p1++;
}
- rules.insert({k, v});
+ rules.emplace_back(rule{k, v});
return true;
});
@@ -98,7 +101,7 @@ std::pair<int64_t, int64_t> day21(line_view file) {
// ###
std::vector<square3> vs3{{".#./..#/###"}};
std::vector<square2> vs2;
- part1(0, 6, &vs3, &vs2, rules);
+ part1(0, 5, &vs3, &vs2, rules);
// for (auto& kv : rules) {
// printf("%s => %s\n", kv.first.c_str(), kv.second.c_str());
diff --git a/src/2017/day21/aoc.h b/src/2017/day21/aoc.h
index 4b2c464..1f743c2 100644
--- a/src/2017/day21/aoc.h
+++ b/src/2017/day21/aoc.h
@@ -20,11 +20,18 @@ struct square2 {
std::vector<square2> flip() const noexcept {
square2 s0;
- for (int i = 0; i < 4; i++) {
- s0.s[i] = s[i] == '#' ? '.' : '#';
- }
+ 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};
+ return {s0, s1};
}
std::vector<square2> rotate() const noexcept {
@@ -99,11 +106,28 @@ struct square3 {
std::vector<square3> flip() const noexcept {
square3 s0;
- for (int i = 0; i < 9; i++) {
- s0.s[i] = s[i] == '#' ? '.' : '#';
- }
+ 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};
+ return {s0, s1};
}
std::vector<square3> rotate() const noexcept {