From b6bd355be739f94206046b7247da9c387b786474 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 7 Dec 2024 17:20:45 +0100 Subject: aoc 2024, day 7, part 2 --- 2024/src/day07.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to '2024') diff --git a/2024/src/day07.cpp b/2024/src/day07.cpp index 9b16b76..663e077 100644 --- a/2024/src/day07.cpp +++ b/2024/src/day07.cpp @@ -53,10 +53,69 @@ part1(const vector>>& data) cout << sum << endl; } +size_t +ipow(size_t base, size_t exp) // NOLINT +{ + size_t result = 1; + while ( exp != 0 ) { + if ( (exp & 1U) == 1 ) { + result *= base; + } + exp >>= 1U; + base *= base; + } + + return result; +} + +bool +can_evaluated2(long first, const vector& values) +{ + const auto N = ipow(3, values.size() - 1); // NOLINT + + for ( unsigned long pattern = 0; pattern != N; ++pattern ) { + auto test_pattern = pattern; + + long result = values.at(0); + for ( size_t idx = 1; idx < values.size(); ++idx ) { + auto rem = test_pattern % 3; + + if ( rem == 0 ) { + result += values.at(idx); + } + else if ( rem == 1 ) { + result *= values.at(idx); + } + else { + result = stol(to_string(result) + to_string(values.at(idx))); + } + + test_pattern /= 3; + } + if ( first == result ) { + return true; + } + } + return false; +} + +void +part2(const vector>>& data) +{ + long sum = 0; + for ( const auto& [first, values]: data ) { + if ( can_evaluated2(first, values) ) { + sum += first; + } + } + cout << sum << endl; +} + int main() { auto data = read_file("data/day07.txt"); part1(data); + part2(data); } -- cgit v1.3