From e88af2c16d719e998afdd74c3501caf236fe6cf1 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 15 Dec 2023 09:56:48 +0100 Subject: Lösung für Tag 15, Teil 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/day15.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/day15.cpp b/src/day15.cpp index 905110f..607f5f2 100644 --- a/src/day15.cpp +++ b/src/day15.cpp @@ -1,5 +1,7 @@ +#include #include #include +#include #include #include #include @@ -46,8 +48,8 @@ calculate_hash(string_view str) void part1() { - const auto line = read_file("data/day15.txt"); - const auto parts = split(line, ','); + const auto line = read_file("data/day15.txt"); + const auto parts = split(line, ','); unsigned long value = 0; for ( const auto& part: parts ) { value += calculate_hash(part); @@ -55,8 +57,50 @@ part1() cout << value << endl; } +void +part2() +{ + vector>> boxes(256); + + const auto line = read_file("data/day15.txt"); + const auto parts = split(line, ','); + for ( const auto& part: parts ) { + const auto pos = part.find_first_of("=-"); + const auto lens = part.substr(0, pos); + auto& box = boxes[calculate_hash(lens)]; + + if ( part[pos] == '=' ) { + const auto value = stol(part.substr(pos + 1)); + + auto iter = find_if(box.begin(), box.end(), [&lens](const auto& element) { return get<0>(element) == lens; }); + if ( iter == box.end() ) { + box.emplace_back(lens, value); + } + else { + *iter = { lens, value }; + } + } + else { + box.remove_if([&lens](const auto& element) { return get<0>(element) == lens; }); + } + } + + long value = 0; + for ( size_t idx = 0; idx != boxes.size(); ++idx ) { + const auto& box = boxes[idx]; + + long lens_number = 1; + for ( const auto& lens: box ) { + value += static_cast(idx + 1) * lens_number * get<1>(lens); + ++lens_number; + } + } + cout << value << endl; +} + int main() { part1(); + part2(); } -- cgit v1.3