From ea701df2dda12a865e5fe1d17562a13983c2ea69 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 4 Dec 2024 12:47:56 +0100 Subject: aoc 2024, day4 --- 2024/src/day04.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 2024/src/day04.cpp (limited to '2024/src/day04.cpp') diff --git a/2024/src/day04.cpp b/2024/src/day04.cpp new file mode 100644 index 0000000..f586afb --- /dev/null +++ b/2024/src/day04.cpp @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +using namespace std; + +map, char> +read_file(string_view filename) +{ + fstream input{ filename }; + map, char> 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; +} + +void +part1(map, char> data, size_t size) +{ + static const tuple dirs[] = { + { -1, -1 }, + { 0, -1 }, + { 1, -1 }, + { 1, 0 }, + { 1, 1 }, + { 0, 1 }, + { -1, 1 }, + { -1, 0 }, + }; + long count = 0; + for ( size_t y = 0; y != size; ++y ) { + for ( size_t x = 0; x != size; ++x ) { + for ( const auto& [dx, dy]: dirs ) { + if ( data[{ x, y }] == 'X' && + data[{ x + 1 * dx, y + 1 * dy }] == 'M' && + data[{ x + 2 * dx, y + 2 * dy }] == 'A' && + data[{ x + 3 * dx, y + 3 * dy }] == 'S' ) { + ++count; + } + } + } + } + cout << count << endl; +} + +void +part2(map, char> data, size_t size) +{ + long count = 0; + for ( size_t y = 0; y != size; ++y ) { + for ( size_t x = 0; x != size; ++x ) { + if ( data[{ x, y }] == 'A' && + data[{ x - 1, y - 1 }] == 'M' && + data[{ x - 1, y + 1 }] == 'M' && + data[{ x + 1, y - 1 }] == 'S' && + data[{ x + 1, y + 1 }] == 'S' ) { + ++count; + } + if ( data[{ x, y }] == 'A' && + data[{ x - 1, y - 1 }] == 'S' && + data[{ x - 1, y + 1 }] == 'M' && + data[{ x + 1, y - 1 }] == 'S' && + data[{ x + 1, y + 1 }] == 'M' ) { + ++count; + } + if ( data[{ x, y }] == 'A' && + data[{ x - 1, y - 1 }] == 'S' && + data[{ x - 1, y + 1 }] == 'S' && + data[{ x + 1, y - 1 }] == 'M' && + data[{ x + 1, y + 1 }] == 'M' ) { + ++count; + } + if ( data[{ x, y }] == 'A' && + data[{ x - 1, y - 1 }] == 'M' && + data[{ x - 1, y + 1 }] == 'S' && + data[{ x + 1, y - 1 }] == 'M' && + data[{ x + 1, y + 1 }] == 'S' ) { + ++count; + } + } + } + cout << count << endl; +} + +int +main() +{ + auto data = read_file("data/day04.txt"); + part1(data, 140); + part2(data, 140); +} -- cgit v1.3