#pragma once #include "common.h" #include namespace aoc2017 { enum class hd { n, ne, nw, se, sw, s }; // a, r, c // n: a, r-1, c // nw: 1-a, r-(1-a), c-(1-a) // sw: 1-a, r+a, c-(1-a) // ne: 1-a, r-(1-a), c+a // se: 1-a, r+a, c+a // s: a, r+1, c struct hexagon { int a; int r; int c; hexagon neighbour(hd d) { switch (d) { case hd::n: return {a, r - 1, c}; case hd::ne: return {1 - a, r - (1 - a), c + a}; case hd::nw: return {1 - a, r - (1 - a), c - (1 - a)}; case hd::se: return {1 - a, r + a, c + a}; case hd::sw: return {1 - a, r + a, c - (1 - a)}; case hd::s: return {a, r + 1, c}; } return *this; } friend bool operator==(hexagon h1, hexagon h2) { return h1.a == h2.a && h1.r == h2.r && h1.c == h2.c; } friend bool operator<(hexagon h1, hexagon h2) { return h1.a < h2.a ? true : h1.a > h2.a ? false : h1.r < h2.r ? true : h1.r > h2.r ? false : h1.c < h2.c; } }; std::pair day11(line_view); } // namespace aoc2017