From fcf4708efd24461ea71e3086d5fbd672d53621d2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 28 Apr 2024 10:40:25 +0200 Subject: day 3, advent of code 2022 --- 2022/src/day03.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 2022/src/day03.cpp (limited to '2022/src/day03.cpp') diff --git a/2022/src/day03.cpp b/2022/src/day03.cpp new file mode 100644 index 0000000..773ccf6 --- /dev/null +++ b/2022/src/day03.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +set +make_unique(string_view str) +{ + return { begin(str), end(str) }; +} + +map +make_lookup() +{ + map lookup; + for ( int i = 0; i != 26; ++i ) { + lookup[char('a' + i)] = i + 1; + lookup[char('A' + i)] = i + 27; + } + return lookup; +} + +vector, set>> +read_file(string_view filename) +{ + fstream input{ filename }; + vector, set>> data; + + for ( string line; getline(input, line); ) { + const auto lhs = line.substr(0, line.length() / 2); + const auto rhs = line.substr(line.length() / 2); + data.emplace_back(make_unique(lhs), make_unique(rhs)); + } + + return data; +} + +vector +read_file2(string_view filename) +{ + fstream input{ filename }; + vector data; + + for ( string line; getline(input, line); ) { + data.emplace_back(line); + } + + return data; +} + +void +part1(const vector, set>>& data) +{ + auto lookup = make_lookup(); + + int sum = 0; + for ( const auto& [lhs, rhs]: data ) { + string intersection; + set_intersection(begin(lhs), end(lhs), begin(rhs), end(rhs), back_inserter(intersection)); + + sum += lookup[intersection[0]]; + } + cout << sum << endl; +} + +void +part2(const vector& data) +{ + auto lookup = make_lookup(); + + int sum = 0; + for ( size_t i = 0; i < data.size(); i += 3 ) { + map count; + + const array, 3> sets = { make_unique(data[i]), + make_unique(data[i + 1]), + make_unique(data[i + 2]) }; + + for ( const auto& set: sets ) { + for ( const auto chr: set ) { + count[chr]++; + } + } + + for ( const auto& [key, value]: count ) { + if ( value == 3 ) { + sum += lookup[key]; + } + } + } + cout << sum << endl; +} + +int +main() +{ + const auto* const filename = "data/day03.txt"; + part1(read_file(filename)); + part2(read_file2(filename)); +} -- cgit v1.3