diff --git a/2025/CMakeLists.txt b/2025/CMakeLists.txt index 7626e6e..348a859 100644 --- a/2025/CMakeLists.txt +++ b/2025/CMakeLists.txt @@ -32,4 +32,5 @@ add_day_executables( "day02.cpp" "day03.cpp" "day04.cpp" + "day05.cpp" ) diff --git a/2025/day05.cpp b/2025/day05.cpp new file mode 100644 index 0000000..c0d54ab --- /dev/null +++ b/2025/day05.cpp @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "fmt/std.h" + +#include "aoc/types.hpp" +#include "aoc/utils.hpp" + +using namespace std::string_view_literals; +using namespace aoc::types; + +// starts at 50 +[[maybe_unused]]constexpr auto raw_str = R"( +3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32 +)"; + +static auto entry([[maybe_unused]]std::span const& args) -> void { + // std::string str{raw_str}; + auto str = aoc::read_text("./input.txt").value_or(""); + str = aoc::trim(str); + + fmt::print("INPUT\n"); + fmt::print("⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼⎽⎼⎻⎺⎻⎼\n"); + fmt::print("{}\n", str); + fmt::print("{}\n", std::string(80, '-')); + + auto id_spec = str | std::views::split("\r\n\r\n"sv) | std::views::transform([](auto const& str) { + return aoc::trim({std::begin(str), std::end(str)}); + }) | std::ranges::to(); + + if (id_spec.size() < 2) throw std::runtime_error("ID specification is not valid"); + + auto id_range = id_spec[0] | std::views::split("\n"sv) | std::views::transform([](auto const& str) { + return std::ranges::fold_left(str | std::views::split("-"sv), std::vector{}, [](auto a, auto const& v) { + a.push_back(std::stod(std::string({std::begin(v), std::end(v)}))); + return a; + }); + }) | std::ranges::to(); + + auto ids = id_spec[1] | std::views::split("\n"sv) | std::views::transform([](auto const& str) { + return std::stod(std::string{std::begin(str), std::end(str)}); + }) | std::ranges::to(); + + f64 sum = 0; + + for (usize i = 0; i < ids.size(); ++i) { + auto const id = ids[i]; + bool is_valid = false; + for (usize j = 0; j < id_range.size(); ++j) { + auto const a = id_range[j][0]; + auto const b = id_range[j][1]; + + if (id >= a && id <= b) { + is_valid = true; + break; + } + } + + fmt::print("id: {} is {}\n", id, is_valid ? "valid" : "not valid"); + + if (is_valid) ++sum; + } + + fmt::print("res: {}\n", sum); +} + +auto main([[maybe_unused]]int argc, [[maybe_unused]]char const* argv[]) -> int { + try { + entry({argv, std::next(argv, argc)}); + } catch (std::exception const& e) { + fmt::print(stderr, "{}\n", e.what()); + return 1; + } + return 0; +}