From ebdab4a2e069b499fae4d18724170553328a41be Mon Sep 17 00:00:00 2001 From: ajet Date: Mon, 15 Dec 2025 09:42:38 -1000 Subject: [PATCH] do day 7 --- input/2025-7.sample.txt | 16 +++++++ src/day7.cpp | 100 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 input/2025-7.sample.txt create mode 100644 src/day7.cpp diff --git a/input/2025-7.sample.txt b/input/2025-7.sample.txt new file mode 100644 index 0000000..57a2466 --- /dev/null +++ b/input/2025-7.sample.txt @@ -0,0 +1,16 @@ +.......S....... +............... +.......^....... +............... +......^.^...... +............... +.....^.^.^..... +............... +....^.^...^.... +............... +...^.^...^.^... +............... +..^...^.....^.. +............... +.^.^.^.^.^...^. +............... diff --git a/src/day7.cpp b/src/day7.cpp new file mode 100644 index 0000000..8c5cb07 --- /dev/null +++ b/src/day7.cpp @@ -0,0 +1,100 @@ +// :autocmd BufWritePost *.cpp :silent exec "!script/async-build 7" +#include +#include +#include +#include +#include +#include +#include +#include + +using Grid = std::vector; +using Location = std::tuple; + +int64_t part_1(const Grid &grid); +int64_t part_2(const Grid &grid); + +int main() { + Grid grid; + std::ifstream file{"input/2025-7.txt"}; + std::string line; + while (std::getline(file, line)) { + grid.emplace_back(line); + } + std::cout << "Part 1: " << part_1(grid) << std::endl; + std::cout << "Part 2: " << part_2(grid) << std::endl; + return 0; +} + +char at_loc(const Grid &grid, size_t row, size_t col) { + if (row >= 0 && row < grid.size() && col >= 0 && col < grid[row].size()) { + return grid[row][col]; + } else { + return '.'; + } +} + +Location find_start(const Grid &grid) { + for (int64_t row{0}; row < grid.size(); ++row) { + for (int64_t col{0}; col < grid[row].length(); ++col) { + if (grid[row][col] == 'S') { + return Location{row, col}; + } + } + } + throw "unreachable"; +} + +int64_t part_1(const Grid &grid) { + int64_t ans{0}; + Location start = find_start(grid); + const auto [start_row, start_col]{start}; + std::set cols{}; + cols.insert(start_col); + for (size_t row{start_row}; row < grid.size(); ++row) { + std::set next_cols{}; + for (auto col : cols) { + if (at_loc(grid, row, col) == '^') { + ans += 1; + next_cols.insert(col + 1); + next_cols.insert(col - 1); + } else { + next_cols.insert(col); + } + } + cols = next_cols; + } + return ans; +} + +void insert_or_increment(std::map &cols, size_t col, + int64_t value) { + auto iter = cols.find(col); + if (iter == cols.end()) { + cols.insert({col, value}); + } else { + iter->second += value; + } +} + +int64_t part_2(const Grid &grid) { + Location start = find_start(grid); + const auto [start_row, start_col]{start}; + std::map cols; + cols.insert(std::make_pair(start_col, 1)); + for (size_t row{start_row}; row < grid.size(); ++row) { + std::map next_cols; + for (auto [col, cnt] : cols) { + if (at_loc(grid, row, col) == '^') { + insert_or_increment(next_cols, col - 1, cnt); + insert_or_increment(next_cols, col + 1, cnt); + } else { + insert_or_increment(next_cols, col, cnt); + } + } + cols = std::move(next_cols); + } + return std::accumulate( + cols.begin(), cols.end(), 0ll, + [](int64_t acc, auto entry) { return acc + entry.second; }); +}