From bdd35a7bee7f23c912d0c453abc263805d8d8ccf Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 7 Nov 2025 12:04:46 +0100 Subject: aoc 2017, days 21-25 --- 2017/src/day22.cpp | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 2017/src/day22.cpp (limited to '2017/src/day22.cpp') diff --git a/2017/src/day22.cpp b/2017/src/day22.cpp new file mode 100644 index 0000000..2567fb1 --- /dev/null +++ b/2017/src/day22.cpp @@ -0,0 +1,158 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace { + +set> +read_file(const filesystem::path& filename) +{ + ifstream file{ filename }; + set> data; + + int row = 0; + for ( string line; getline(file, line); ) { + int col = 0; + + for ( char chr: line ) { + if ( chr == '#' ) { + data.emplace(col, row); + } + ++col; + } + + ++row; + } + + return data; +} + +#if 0 +void +print(const set>& grid, tuple pos) +{ + for ( int y = -5; y < 5; ++y ) { + for ( int x = -5; x < 5; ++x ) { + auto coord = make_tuple(x, y); + + if ( pos == coord ) { + cout << '['; + } + else { + cout << ' '; + } + + auto chr = grid.contains(coord) ? '#' : '.'; + cout << chr; + + if ( pos == coord ) { + cout << ']'; + } + else { + cout << ' '; + } + } + cout << '\n'; + } + cout << '\n'; +} +#endif + +void +part1(set> grid, tuple pos) +{ + const array, 4> dirs{ + make_tuple(-1, 0), + make_tuple(0, -1), + make_tuple(1, 0), + make_tuple(0, 1) + }; + unsigned dir = 1; // up + + int infections = 0; + for ( int i = 0; i != 10000; ++i ) { + if ( grid.contains(pos) ) { + dir = (dir + 1) % 4; + grid.erase(pos); + } + else { + dir = (dir + 3) % 4; + grid.insert(pos); + ++infections; + } + + auto [dx, dy] = dirs.at(dir); + get<0>(pos) += dx; + get<1>(pos) += dy; + } + cout << "Part1: " << infections << '\n'; +} + +void +part2(set> grid, tuple pos) +{ + const array, 4> dirs{ + make_tuple(-1, 0), + make_tuple(0, -1), + make_tuple(1, 0), + make_tuple(0, 1) + }; + unsigned dir = 1; // up + + static const int weak = 0; + static const int infected = 1; + static const int flagged = 2; + + map, int> grid_; + for ( const auto& value: grid ) { + grid_[value] = infected; + } + + int infections = 0; + for ( int i = 0; i != 10000000; ++i ) { + if ( !grid_.contains(pos) ) { + grid_[pos] = weak; + dir = (dir + 3) % 4; + } + else { + switch ( grid_[pos] ) { + case weak: + grid_[pos] = infected; + ++infections; + break; + case infected: + grid_[pos] = flagged; + dir = (dir + 1) % 4; + break; + case flagged: + grid_.erase(pos); + dir = (dir + 2) % 4; + break; + default: + cerr << "Wrong state!!" << '\n'; + return; + } + } + + auto [dx, dy] = dirs.at(dir); + get<0>(pos) += dx; + get<1>(pos) += dy; + } + cout << "Part2: " << infections << '\n'; +} + +} // namespace + +int +main() +{ + auto grid = read_file("data/day22.txt"); + part1(grid, { 12, 12 }); + part2(grid, { 12, 12 }); +} -- cgit v1.3