From 616f6bd61016f95e18799c83122628b572bb3ca1 Mon Sep 17 00:00:00 2001 From: mnerv <24420859+mnerv@users.noreply.github.com> Date: Tue, 3 Dec 2024 01:49:01 +0100 Subject: [PATCH] aoc24: day02b not working --- aoc.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/aoc.cpp b/aoc.cpp index 1c61b01..024b902 100644 --- a/aoc.cpp +++ b/aoc.cpp @@ -12,7 +12,8 @@ using levels_t = std::vector; using reports_t = std::vector; auto main([[maybe_unused]]int argc, [[maybe_unused]]char const* argv[]) -> int { - constexpr auto filename = "./dat/24/ex/02.txt"; + // constexpr auto filename = "./dat/24/ex/02.txt"; + constexpr auto filename = "./tmp.txt"; std::ifstream strm{filename, std::ios::in | std::ios::binary}; if (!strm.is_open()) { fmt::print("Error opening file: {}\n", filename); @@ -41,12 +42,6 @@ auto main([[maybe_unused]]int argc, [[maybe_unused]]char const* argv[]) -> int { strm.get(); } - // auto diff = reports | std::views::transform([](auto const& levels) { - // return levels | std::views::slide(2) | std::views::transform([](auto pair) { - // return pair[1] - pair[0]; - // }); - // }); - auto diff = reports | std::views::transform([](auto const& levels) { return levels | std::views::adjacent_transform<2>([](auto const& a, auto const& b) { return b - a; @@ -71,21 +66,77 @@ auto main([[maybe_unused]]int argc, [[maybe_unused]]char const* argv[]) -> int { fmt::print("Part A: {}\n", safe_reports); - for (auto levels : reports) { - for (auto level : levels) { - fmt::print("{} ", level); - } - fmt::print("\n"); - } + auto lefts = std::views::zip(diff, reports) | std::views::filter([](auto const& pair) { + auto const& [d, l] = pair; + auto const n = std::ranges::all_of(d, [](auto v) { return v < 0; }); + auto const p = std::ranges::all_of(d, [](auto v) { return v > 0; }); + return !(n || p); + }) | std::views::transform([](auto const& pair) { + auto const& [d, l] = pair; + return l; + }); - fmt::print("--------------------------------------------------------------------------------\n"); + auto masks = diff | std::views::filter([](auto const& vec) { + auto const n = std::ranges::all_of(vec, [](auto v) { return v < 0; }); + auto const p = std::ranges::all_of(vec, [](auto v) { return v > 0; }); + return !(n || p); + }) | std::views::transform([](auto const& vec) { + auto const p = std::count_if(std::begin(vec), std::end(vec), [](auto const& v) { return v >= 0; }); + auto const n = std::count_if(std::begin(vec), std::end(vec), [](auto const& v) { return v < 0; }); + auto mask = vec | std::views::transform([&](auto const& v) { + if (p > n) return v >= 0 ? 1 : 0; + else return v < 0 ? 1 : 0; + }) | std::ranges::to(); + mask.push_back(1); + return mask; + }); - for (auto levels : diff) { - for (auto level : levels) { - fmt::print("{} ", level); - } - fmt::print("\n"); - } + auto const remain_reports = std::views::zip(masks, lefts) + | std::views::filter([](auto const& pair) { + auto const& [mask, level] = pair; + auto const n = std::count_if(std::begin(mask), std::end(mask), [](auto const& v) { return v == 0; }); + return n == 1; + }) + | std::views::transform([](auto const& pair){ + auto const& [mask, level] = pair; + + return std::views::zip(mask, level) | std::views::filter([](auto const& pair) { + auto const& [m, v] = pair; + return m == 1; + }) | std::views::transform([](auto const& pair) { + auto const& [m, v] = pair; + return v; + }) | std::ranges::to(); + }) + | std::ranges::to(); + + auto rem_diff = remain_reports | std::views::transform([](auto const& vec) { + return vec | std::views::adjacent_transform<2>([](auto const& a, auto const& b) { return b - a; }); + }); + + auto safe_rems_vec = rem_diff | std::views::transform([](auto const& vec) { + return vec | std::views::filter([](auto const& a) { + return std::abs(a) <= 3; + }) | std::ranges::to(); + }) | std::ranges::to(); + + auto safe_rems = safe_rems_vec | std::views::filter([](auto const& vec) { + return vec.size() > 0; + }) | std::views::filter([](auto const& vec) { + auto const n = std::ranges::all_of(vec, [](auto v) { return v < 0; }); + auto const p = std::ranges::all_of(vec, [](auto v) { return v > 0; }); + return n || p; + }); + + auto const safe_reports_rem = std::ranges::distance(safe_rems); + + // for (auto rep : safe_rems) { + // for (auto v : rep) { + // fmt::print("{} ", v); + // } + // fmt::print("\n"); + // } + fmt::print("Part B: {}\n", safe_reports + safe_reports_rem); return 0; }