#include "aoc.h" #include #include namespace aoc2022 { typedef elf (*elf_move)(elf); typedef bool (*elf_predicate)(elf, const std::set&); static elf nomove(elf e) { return e; } static elf north(elf e) { return elf{e.x, e.y - 1}; } static elf south(elf e) { return elf{e.x, e.y + 1}; } static elf west(elf e) { return elf{e.x - 1, e.y}; } static elf east(elf e) { return elf{e.x + 1, e.y}; } bool eight(elf e, const std::set& elves) { elf es[8] = { {e.x - 1, e.y - 1}, {e.x, e.y - 1}, {e.x + 1, e.y - 1}, {e.x - 1, e.y}, {e.x + 1, e.y}, {e.x - 1, e.y + 1}, {e.x, e.y + 1}, {e.x + 1, e.y + 1}, }; for (auto& e : es) { if (elves.find(e) != elves.end()) { return false; } } return true; } bool north_three(elf e, const std::set& elves) { elf es[3] = { {e.x - 1, e.y - 1}, {e.x, e.y - 1}, {e.x + 1, e.y - 1}, }; for (auto& e : es) { if (elves.find(e) != elves.end()) { return false; } } return true; } bool south_three(elf e, const std::set& elves) { elf es[3] = { {e.x - 1, e.y + 1}, {e.x, e.y + 1}, {e.x + 1, e.y + 1}, }; for (auto& e : es) { if (elves.find(e) != elves.end()) { return false; } } return true; } bool west_three(elf e, const std::set& elves) { elf es[3] = { {e.x - 1, e.y - 1}, {e.x - 1, e.y}, {e.x - 1, e.y + 1}, }; for (auto& e : es) { if (elves.find(e) != elves.end()) { return false; } } return true; } bool east_three(elf e, const std::set& elves) { elf es[3] = { {e.x + 1, e.y - 1}, {e.x + 1, e.y}, {e.x + 1, e.y + 1}, }; for (auto& e : es) { if (elves.find(e) != elves.end()) { return false; } } return true; } static struct elf_test { elf_predicate p; elf_move m; } moves[5] = {{eight, nomove}, {north_three, north}, {south_three, south}, {west_three, west}, {east_three, east}}; std::vector round(int i, const std::vector& elfs, const std::set& elves) { std::vector next; for (auto& e : elfs) { if (moves[0].p(e, elves)) { next.emplace_back(moves[0].m(e)); } else { for (int x = 0; x < 4; x++) { int index = (i + x) % 4 + 1; if (moves[index].p(e, elves)) { next.emplace_back(moves[index].m(e)); break; } } } } // check duplicate of next return next; } std::pair day23(line_view file) { int height{0}; std::vector elfs; per_line(file, [&height, &elfs](line_view lv) { for (size_t i = 0; i < lv.length; i++) { if (*(lv.line + i) == '#') { elfs.emplace_back(elf{(int)i, height}); } } height++; return true; }); std::set elves{elfs.begin(), elfs.end()}; return {0, 0}; } } // namespace aoc2022