From 7634cf6ee1a1681586cc550942eaff87076add02 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 6 Dec 2025 10:48:04 +0100 Subject: aoc 2025, day 6 --- 2025/src/day06.cpp | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 2025/src/day06.cpp (limited to '2025/src') diff --git a/2025/src/day06.cpp b/2025/src/day06.cpp new file mode 100644 index 0000000..af562cd --- /dev/null +++ b/2025/src/day06.cpp @@ -0,0 +1,151 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace { + +using Grid = vector>; +using Ops = vector; + +vector +read_file(const filesystem::path& filename) +{ + ifstream file{ filename }; + vector lines; + + for ( string line; getline(file, line); ) { + lines.emplace_back(line); + } + + return lines; +} + +vector +read_ops(const string& line) +{ + stringstream strm{ line }; + vector ops; + for ( char chr{}; strm >> chr; ) { + ops.emplace_back(chr); + } + return ops; +} + +vector +read_numbers(const string& line) +{ + stringstream strm{ line }; + vector numbers; + for ( long number{}; strm >> number; ) { + numbers.emplace_back(number); + } + return numbers; +} + +void +part1(vector lines) +{ + ranges::reverse(lines); + + const auto ops = read_ops(lines[0]); + + vector> grid; + for ( size_t i = 1; i < lines.size(); ++i ) { + grid.emplace_back(read_numbers(lines[i])); + } + + long sum = 0; + for ( size_t col = 0; col != ops.size(); ++col ) { + long value = ops[col] == '*' ? 1 : 0; + for ( auto& row: grid ) { + if ( ops[col] == '*' ) { + value *= row[col]; + } + else { + value += row[col]; + } + } + sum += value; + } + cout << "Part 1: " << sum << '\n'; +} + +vector +rotateLeft90(const vector& matrix) +{ + if ( matrix.empty() ) { + return {}; + } + + auto rows = matrix.size(); + auto cols = matrix[0].size(); + + vector res(cols, string(rows, ' ')); + + for ( size_t row = 0; row != rows; ++row ) { + for ( size_t col = 0; col != cols; ++col ) { + // Position aus ursprünglicher Matrix auf neue übertragen + res[cols - 1 - col][row] = matrix[row][col]; + } + } + + return res; +} + +void +part2(vector lines) +{ + auto ops = read_ops(lines.back()); + ranges::reverse(ops); + lines.pop_back(); // ops entfernen + + // Matrix drehen + lines = rotateLeft90(lines); + lines.emplace_back(""); + + vector> grid; + vector curr; + + // Matrix neu aufbauen + for ( const auto& line: lines ) { + if ( long number{}; sscanf(line.data(), "%ld", &number) == 1 ) { + curr.emplace_back(number); + } + else { + grid.emplace_back(curr); + curr.clear(); + } + } + + // ausrechnen + long sum = 0; + for ( size_t row = 0; row != ops.size(); ++row ) { + long value = ops[row] == '*' ? 1 : 0; + for ( const auto number: grid[row] ) { + if ( ops[row] == '*' ) { + value *= number; + } + else { + value += number; + } + } + sum += value; + } + cout << "Part 2: " << sum << '\n'; +} + +} // namespace + +int +main() +{ + const auto lines = read_file("data/day06.txt"); + part1(lines); + part2(lines); +} -- cgit v1.3