#include "aoc.h" #include namespace aoc2017 { struct rule { std::string k; std::string v; }; static std::vector rs; static std::map cs; template static int count(const std::vector& v) { int t{0}; for (auto& s : v) { t += s.count(); } return t; } template static void print(const std::vector& v) { for (auto& s : v) { s.print(); printf("\n"); } } template static std::string match(T t) { 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) { // printf("%s matched %s\n", s.c_str(), r.k.c_str()); return r.v; } } } return ""; } square4 convert(const square3& s3) { return match(s3); } std::vector 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}; } square3 convert(const square2& s2) { return match(s2); } std::vector convert(std::vector& s3s) { std::vector 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; } std::vector one_round(const square3& s3, int r) { // iteration 1 auto s4 = convert(s3); std::vector s20 = convert(s4); // iteration 2 std::vector s30; for (square2& s2 : s20) { s30.push_back(convert(s2)); } cs[r] += count(s30); // iteration 3 std::vector s21 = convert(s30); std::vector s31; for (square2& s2 : s21) { s31.push_back(convert(s2)); } return s31; } static void part1(std::vector s3, int r, int max) { if (r < max) { std::vector 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 day21(line_view file) { per_line(file, [](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++; } rs.emplace_back(rule{k, v}); return true; }); // .#. // ..# // ### square3 s3{".#./..#/###"}; part1({s3}, 0, 5); // for(auto&kv : cs) { // printf("%d -> %d\n", kv.first, kv.second); // } return {cs[3], 1879071}; } } // namespace aoc2017