diff options
Diffstat (limited to 'src/2017/day11/aoc.h')
-rw-r--r-- | src/2017/day11/aoc.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/2017/day11/aoc.h b/src/2017/day11/aoc.h index 1270e1a..afd1cb2 100644 --- a/src/2017/day11/aoc.h +++ b/src/2017/day11/aoc.h @@ -6,5 +6,41 @@ 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<int64_t, int64_t> day11(line_view); } // namespace aoc2017 |