Line data Source code
1 : #include "PuzzleImpl.h"
2 : #include "Vector.h"
3 :
4 : #include <libassert/assert.hpp>
5 :
6 : #include <array>
7 : #include <unordered_set>
8 :
9 : namespace {
10 : using Coord = Vec2<int>;
11 :
12 0 : constexpr std::array<Coord, 128u> makeDirLut() {
13 0 : std::array<Coord, 128u> lut{};
14 0 : lut['^'] = {0, 1};
15 0 : lut['>'] = {1, 0};
16 0 : lut['v'] = {0, -1};
17 0 : lut['<'] = {-1, 0};
18 0 : return lut;
19 0 : }
20 :
21 : static constexpr std::array<Coord, 128u> dirLut = makeDirLut();
22 :
23 : } // namespace
24 :
25 1 : template <> size_t part1<2015, 3>(std::string_view const input) {
26 1 : std::unordered_set<Coord> visitedHouses;
27 1 : Coord coord{0, 0};
28 1 : visitedHouses.insert(coord);
29 8192 : for (char const c : input) {
30 8192 : coord += dirLut[c];
31 8192 : visitedHouses.insert(coord);
32 8192 : }
33 1 : return visitedHouses.size();
34 1 : }
35 :
36 1 : template <> size_t part2<2015, 3>(std::string_view const input) {
37 1 : std::unordered_set<Coord> visitedHouses;
38 1 : std::array<Coord, 2u> coords = {{{0, 0}, {0, 0}}};
39 1 : visitedHouses.emplace(0, 0);
40 1 : unsigned int coordIdx = 0;
41 8192 : for (char const c : input) {
42 8192 : coords[coordIdx] += dirLut[c];
43 8192 : visitedHouses.insert(coords[coordIdx]);
44 8192 : coordIdx ^= 1u;
45 8192 : }
46 1 : return visitedHouses.size();
47 1 : }
|