From 56e890cec0a28c0a485212ccebfaf774235a79a2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 3 Jan 2024 23:35:54 +0100 Subject: prepare for more puzzles ... :) --- 2023/src/day04.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 2023/src/day04.cpp (limited to '2023/src/day04.cpp') diff --git a/2023/src/day04.cpp b/2023/src/day04.cpp new file mode 100644 index 0000000..0d3e552 --- /dev/null +++ b/2023/src/day04.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +vector +read_file(string_view filename) +{ + fstream input{ filename }; + vector data; + + for ( string line; getline(input, line); ) { + data.emplace_back(line); + } + + return data; +} + +vector +split(const string& line, char sep) +{ + stringstream input{ line }; + vector parts; + + for ( string part; getline(input, part, sep); ) { + parts.emplace_back(part); + } + + return parts; +} + +template +Container +read_ints(const string& line) +{ + Container container{}; + stringstream input{ line }; + + for ( typename Container::value_type value; input >> value; ) { + container.emplace(value); + } + + return container; +} + +auto +build_data_set(string_view filename) +{ + vector values; + + for ( const auto& line: read_file(filename) ) { + const auto cards = split(line, ':'); + const auto numbers = split(cards[1], '|'); + + const auto winning_numbers = read_ints>(numbers[0]); + const auto card_numbers = read_ints>(numbers[1]); + + auto count = 0U; + for ( auto number: winning_numbers ) { + if ( card_numbers.contains(number) ) { + ++count; + } + } + values.emplace_back(count); + } + + return values; +} + +void +pass1(const vector& values) +{ + auto sum = 0U; + for ( auto value: values ) { + if ( value != 0 ) { + sum += (1U << (value - 1)); + } + } + + cout << sum << endl; +} + +void +pass2(const vector& values) +{ + auto count = 0U; + + function process = [&](size_t start, size_t end) -> void { + for ( ; start != end; ++start ) { + auto value = values[start]; + + ++count; + + process(start + 1, start + value + 1); + } + }; + + process(0, values.size()); + + cout << count << endl; +} + +int +main() +{ + const auto values = build_data_set("data/day04.txt"); + pass1(values); + pass2(values); +} -- cgit v1.3