From 9af62d7c591b7893f47f111784224eb0d5c5e4ff Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 6 Dec 2024 22:05:54 +0100 Subject: aoc 2024, day6 --- 2024/src/day06.cpp | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 2024/src/day06.cpp (limited to '2024/src') diff --git a/2024/src/day06.cpp b/2024/src/day06.cpp new file mode 100644 index 0000000..1198d54 --- /dev/null +++ b/2024/src/day06.cpp @@ -0,0 +1,139 @@ +#include +#include +#include +#include +#include +#include +using namespace std; + +using pos_type = tuple; + +map +read_file(string_view filename) +{ + fstream input{ filename }; + map data; + + size_t yPos = 0; + for ( string line; getline(input, line); ) { + for ( size_t xPos = 0; xPos != line.size(); ++xPos ) { + data[{ xPos, yPos }] = line[xPos]; + } + ++yPos; + } + + return data; +} + +set +distinct_positions(const map& data) +{ + static const array deltas = { + make_tuple(0, -1), + make_tuple(1, 0), + make_tuple(0, 1), + make_tuple(-1, 0) + }; + + size_t direction = 0; + + auto position = get<0>(*ranges::find_if(data, [](auto position) { + return get<1>(position) == '^'; + })); + + set positions; + while ( true ) { + positions.emplace(position); + + auto next_position = make_tuple(get<0>(position) + get<0>(deltas.at(direction)), + get<1>(position) + get<1>(deltas.at(direction))); + + if ( !data.contains(next_position) ) { + break; + } + + if ( data.at(next_position) == '#' ) { + direction = (direction + 1) % deltas.size(); + } + else { + position = next_position; + } + } + + return positions; +} + +void +part1(const map& data) +{ + auto positions = distinct_positions(data); + + cout << positions.size() << endl; +} + +bool +would_loop(const map& data) +{ + static const array deltas = { + make_tuple(0, -1), + make_tuple(1, 0), + make_tuple(0, 1), + make_tuple(-1, 0) + }; + + size_t direction = 0; + + auto position = get<0>(*ranges::find_if(data, [](auto position) { + return get<1>(position) == '^'; + })); + + set> positions; + + while ( true ) { + positions.emplace(position, direction); + + auto next_position = make_tuple(get<0>(position) + get<0>(deltas.at(direction)), + get<1>(position) + get<1>(deltas.at(direction))); + + if ( !data.contains(next_position) ) { + return false; + } + + if ( data.at(next_position) == '#' ) { + direction = (direction + 1) % deltas.size(); + } + else { + position = next_position; + } + + if ( positions.contains({ position, direction }) ) { + return true; + } + } +} + +void +part2(map data) +{ + const auto positions = distinct_positions(data); + + long sum = 0; + for ( const auto& position: positions ) { + if ( data.at(position) == '.' ) { + data.at(position) = '#'; + if ( would_loop(data) ) { + ++sum; + } + data.at(position) = '.'; + } + } + cout << sum << endl; +} + +int +main() +{ + auto data = read_file("data/day06.txt"); + part1(data); + part2(data); +} -- cgit v1.3