#pragma once #include "common.h" #include namespace aoc2017 { struct square2 { char s[4] = {0}; // ../.. square2(const std::string& ss) { int j = 0; for (int i = 0; i < 2; i++) { memcpy(s + 2 * i, ss.data() + 2 * i + j, 2); j++; } } square2() {} 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]; return s0; } std::vector 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::vector combo() const noexcept { std::vector c{*this, flip()}; for (auto&& s : rotate()) { c.emplace_back(s); } return c; } std::string to_string() { char sx[6] = {0}; sprintf(sx, "%c%c/%c%c", s[0], s[1], s[2], s[3]); return sx; } int count() const noexcept { int c{0}; for (int i = 0; i < 4; i++) { c += (int)s[i] == '#'; } return c; } void print() const noexcept { for (int i = 0; i < 4; i++) { printf("%c", s[i]); if ((i + 1) % 2 == 0) { printf("\n"); } } } }; struct square3 { char s[9] = {0}; // .../.../... square3(const std::string& ss) { int j = 0; for (int i = 0; i < 3; i++) { memcpy(s + 3 * i, ss.data() + 3 * i + j, 3); j++; } } square3() {} 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]; return s0; } std::vector 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]; // 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]; 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 {s1, s3, s5}; // return {s0, s1, s2, s3, s4, s5, s6}; } std::vector combo() const noexcept { std::vector c{*this, flip()}; for (auto&& s : rotate()) { c.emplace_back(s); c.emplace_back(s.flip()); } return c; } 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; } int count() const noexcept { int c{0}; for (int i = 0; i < 9; i++) { c += (int)s[i] == '#'; } return c; } void print() const noexcept { for (int i = 0; i < 9; i++) { printf("%c", s[i]); if ((i + 1) % 3 == 0) { printf("\n"); } } } }; struct square4 { char s[16] = {0}; // ##../#.../..../..#. square4(const std::string& ss) { int j = 0; for (int i = 0; i < 4; i++) { memcpy(s + 4 * i, ss.data() + 4 * i + j, 4); j++; } } void print() const noexcept { for (int i = 0; i < 16; i++) { printf("%c", s[i]); if ((i + 1) % 4 == 0) { printf("\n"); } } } }; std::pair day21(line_view); } // namespace aoc2017