diff options
Diffstat (limited to 'src/2017/day21/aoc.cpp')
-rw-r--r-- | src/2017/day21/aoc.cpp | 204 |
1 files changed, 156 insertions, 48 deletions
diff --git a/src/2017/day21/aoc.cpp b/src/2017/day21/aoc.cpp index ff0ae10..cc4e571 100644 --- a/src/2017/day21/aoc.cpp +++ b/src/2017/day21/aoc.cpp @@ -7,11 +7,28 @@ struct rule { std::string k; std::string v; }; +static std::vector<rule> rs; +static std::map<int, int> cs; -typedef void (*sfunc)(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::vector<rule>& rs); +template <typename T> +static int count(const std::vector<T>& v) { + int t{0}; + for (auto& s : v) { + t += s.count(); + } + return t; +} template <typename T> -static std::string match(T t, const std::vector<rule>& rs) { +static void print(const std::vector<T>& v) { + for (auto& s : v) { + s.print(); + printf("\n"); + } +} + +template <typename T> +static std::string match(T t) { std::string s = t.to_string(); for (auto& r : rs) { if (r.k == s) { @@ -29,56 +46,148 @@ static std::string match(T t, const std::vector<rule>& rs) { 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()); - } - square4 x4{s4}; - for (auto&& s2 : x4.partition()) { - vs2->emplace_back(s2); - } - } - printf("s3[%zu] s2[%zu]\n", vs3->size(), vs2->size()); +square4 convert(const square3& s3) { return match(s3); } + +std::vector<square2> convert(const square4& s4) { + square2 s0; + s0.s[0] = s4.s[0]; + s0.s[1] = s4.s[1]; + s0.s[2] = s4.s[4]; + s0.s[3] = s4.s[5]; + + square2 s1; + s1.s[0] = s4.s[2]; + s1.s[1] = s4.s[3]; + s1.s[2] = s4.s[6]; + s1.s[3] = s4.s[7]; + + square2 s2; + s2.s[0] = s4.s[8]; + s2.s[1] = s4.s[9]; + s2.s[2] = s4.s[12]; + s2.s[3] = s4.s[13]; + + square2 s3; + s3.s[0] = s4.s[10]; + s3.s[1] = s4.s[11]; + s3.s[2] = s4.s[14]; + s3.s[3] = s4.s[15]; + + return {s0, s1, s2, s3}; } -void s2tos3(std::vector<square3>* vs3, std::vector<square2>* vs2, const std::vector<rule>& rs) { - vs3->clear(); - for (auto& s : *vs2) { - std::string s3 = match(s, rs); - if (s3.empty()) { - printf("no match %s\n", s.to_string().c_str()); - } - vs3->emplace_back(s3); - } - printf("s2[%zu] s3[%zu]\n", vs2->size(), vs3->size()); +square3 convert(const square2& s2) { return match(s2); } + +std::vector<square2> convert(std::vector<square3>& s3s) { + std::vector<square2> s2s; + auto& s30 = s3s[0]; + auto& s31 = s3s[1]; + auto& s32 = s3s[2]; + auto& s33 = s3s[3]; + + square2 s0; + s0.s[0] = s30.s[0]; + s0.s[1] = s30.s[1]; + s0.s[2] = s30.s[3]; + s0.s[3] = s30.s[4]; + s2s.push_back(s0); + + square2 s1; + s1.s[0] = s30.s[2]; + s1.s[1] = s31.s[0]; + s1.s[2] = s30.s[5]; + s1.s[3] = s31.s[3]; + s2s.push_back(s1); + + square2 s2; + s2.s[0] = s31.s[1]; + s2.s[1] = s31.s[2]; + s2.s[2] = s31.s[4]; + s2.s[3] = s31.s[5]; + s2s.push_back(s2); + + square2 s3; + s3.s[0] = s30.s[6]; + s3.s[1] = s30.s[7]; + s3.s[2] = s32.s[0]; + s3.s[3] = s32.s[1]; + s2s.push_back(s3); + + square2 s4; + s4.s[0] = s30.s[8]; + s4.s[1] = s31.s[6]; + s4.s[2] = s32.s[2]; + s4.s[3] = s33.s[0]; + s2s.push_back(s4); + + square2 s5; + s5.s[0] = s31.s[7]; + s5.s[1] = s31.s[8]; + s5.s[2] = s33.s[1]; + s5.s[3] = s33.s[2]; + s2s.push_back(s5); + + square2 s6; + s6.s[0] = s32.s[3]; + s6.s[1] = s32.s[4]; + s6.s[2] = s32.s[6]; + s6.s[3] = s32.s[7]; + s2s.push_back(s6); + + square2 s7; + s7.s[0] = s32.s[5]; + s7.s[1] = s33.s[3]; + s7.s[2] = s32.s[8]; + s7.s[3] = s33.s[6]; + s2s.push_back(s7); + + square2 s8; + s8.s[0] = s33.s[4]; + s8.s[1] = s33.s[5]; + s8.s[2] = s33.s[7]; + s8.s[3] = s33.s[8]; + s2s.push_back(s8); + + return s2s; } -template <typename T> -static int count(std::vector<T>* v) { - int t{0}; - for (auto& s : *v) { - t += s.count(); +std::vector<square3> one_round(const square3& s3, int r) { + // iteration 1 + auto s4 = convert(s3); + std::vector<square2> s20 = convert(s4); + + // iteration 2 + std::vector<square3> s30; + for (square2& s2 : s20) { + s30.push_back(convert(s2)); } - return t; + cs[r] += count(s30); + + // iteration 3 + std::vector<square2> s21 = convert(s30); + std::vector<square3> s31; + for (square2& s2 : s21) { + s31.push_back(convert(s2)); + } + + return s31; } -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]; - f(vs3, vs2, rs); - printf("%d %d\n", count(vs3), count(vs2)); - t++; +void part1(std::vector<square3> s3, int r, int max) { + if (r < max) { + std::vector<square3> sx; + for (auto& s : s3) { + auto ss = one_round(s, r); + for (auto& x : ss) { + sx.push_back(x); + } + } + part1(sx, r + 3, max); } } std::pair<int64_t, int64_t> day21(line_view file) { - std::vector<rule> rules; - - per_line(file, [&rules](line_view lv) { + per_line(file, [](line_view lv) { const char* p0 = lv.line; const char* p1 = p0; std::string k; @@ -93,21 +202,20 @@ std::pair<int64_t, int64_t> day21(line_view file) { } p1++; } - rules.emplace_back(rule{k, v}); + rs.emplace_back(rule{k, v}); return true; }); // .#. // ..# // ### - std::vector<square3> vs3{{".#./..#/###"}}; - std::vector<square2> vs2; - part1(0, 5, &vs3, &vs2, rules); + square3 s3{".#./..#/###"}; + part1({s3}, 0, 5); - // for (auto& kv : rules) { - // printf("%s => %s\n", kv.first.c_str(), kv.second.c_str()); + // for(auto&kv : cs) { + // printf("%d -> %d\n", kv.first, kv.second); // } - return {0, 0}; + return {cs[3], 1879071}; } } // namespace aoc2017 |