#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() {} std::vector 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 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; } 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() {} std::vector 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 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 {s0, s1, s2, s3, s4, s5, s6}; } 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++; } } std::vector 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::pair day21(line_view); } // namespace aoc2017