From aaff50eae940068b81b928d87d898560755e266d Mon Sep 17 00:00:00 2001 From: mnerv <24420859+mnerv@users.noreply.github.com> Date: Mon, 9 Dec 2024 01:30:49 +0100 Subject: [PATCH] aoc24: day05a add back --- sol/24/day05.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/sol/24/day05.cpp b/sol/24/day05.cpp index d6a4795..fb30020 100644 --- a/sol/24/day05.cpp +++ b/sol/24/day05.cpp @@ -1,7 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include +#include + #include "aoc.hpp" #include "aoc/utils.hpp" #include "fmt/format.h" -auto aoc24::day05([[maybe_unused]]std::span const& args) -> std::expected { - return aoc::make_error("day 5", std::errc::not_supported); +namespace vfp { +using namespace aoc::types; +using order_rule = std::vector; +} + +auto aoc24::day05([[maybe_unused]]std::span const& args) -> std::expected { + using namespace std::string_view_literals; + // auto txtres = aoc::read_text("./dat/24/ex/05.txt"); + auto txtres = aoc::read_text("./dat/24/re/05.txt"); + if (!txtres) return std::unexpected(txtres.error()); + auto const txt = *txtres; + + auto const not_empty = [](auto const& str) { return !str.empty(); }; + auto lines = txt | std::views::split("\n"sv) + | std::views::transform([](auto const& str) { return std::string_view(str); }); + + auto rules_str = lines | std::views::take_while(not_empty) + | std::ranges::to(); + auto updates_str = lines | std::views::drop_while(not_empty) + | std::views::drop(1) + | std::views::take_while(not_empty) + | std::ranges::to(); + + // fmt::print("rules:\n"); + // std::ranges::for_each(rules_str, [](auto const& str) { + // fmt::print(" \"{}\"\n", str); + // }); + // fmt::print("\n"); + // + // fmt::print("updates:\n"); + // std::ranges::for_each(updates_str, [](auto const& str) { + // fmt::print(" \"{}\"\n", str); + // }); + + auto order_rules = rules_str | std::views::transform([](auto const& str) { + return str | std::views::split("|"sv) + | std::views::transform([](auto const& num_str) { + return std::stoi(std::string{std::begin(num_str), std::end(num_str)}); + }) | std::ranges::to(); + }) | std::ranges::to(); + + auto updates = updates_str | std::views::transform([](auto const& str) { + return str | std::views::split(","sv) + | std::views::transform([](auto const& num_str) { + return std::stoi(std::string{std::begin(num_str), std::end(num_str)}); + }) | std::ranges::to(); + }) | std::ranges::to(); + + // std::ranges::for_each(order_rules, [](auto const& rule) { + // std::ranges::for_each(rule, [](auto const& page) { + // fmt::print("{} ", page); + // }); + // fmt::print("\n"); + // }); + // + // std::ranges::for_each(updates, [](auto const& update) { + // std::ranges::for_each(update, [](auto const& page) { + // fmt::print("{}, ", page); + // }); + // fmt::print("\n"); + // }); + + auto valid_updates = updates | std::views::filter([&](auto const& pages) { + return std::ranges::all_of(order_rules, [&](auto const& rule) { + auto const a = std::ranges::find(pages, rule[0]); + auto const b = std::ranges::find(pages, rule[1]); + return a < b || a == std::end(pages) || b == std::end(pages) || a == b; + }); + }); + + // std::ranges::for_each(valid_updates, [](auto const& update){ + // std::ranges::for_each(update, [](auto const& page) { + // fmt::print("{}, ", page); + // }); + // fmt::print("\n"); + // }); + + auto mids = valid_updates | std::views::transform([](auto const& updates) { + return *std::ranges::next(std::begin(updates), updates.size() / 2); + }); + + // std::ranges::for_each(mids, [](auto const& mid) { + // fmt::print("{}\n", mid); + // }); + + auto const sum = std::accumulate(std::begin(mids), std::end(mids), 0); + fmt::print("Part A: {}\n", sum); + return {}; }