From ebd39eb65fb5f9deee098b97c8c70156718b2b9f Mon Sep 17 00:00:00 2001 From: Thraix Date: Tue, 2 Dec 2025 08:06:06 +0100 Subject: [PATCH] Add solution for 2025 Day 2 --- res/2025/day02/test_input.txt | 1 + src/2025/Day01.cpp | 4 -- src/2025/Day02.cpp | 81 +++++++++++++++++++++++++++++------ src/common/lib/Helper.h | 65 ++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 17 deletions(-) create mode 100644 res/2025/day02/test_input.txt diff --git a/res/2025/day02/test_input.txt b/res/2025/day02/test_input.txt new file mode 100644 index 0000000..a3f22ef --- /dev/null +++ b/res/2025/day02/test_input.txt @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124 diff --git a/src/2025/Day01.cpp b/src/2025/Day01.cpp index a89a4d7..42d6ff7 100644 --- a/src/2025/Day01.cpp +++ b/src/2025/Day01.cpp @@ -10,10 +10,6 @@ namespace y2025::day01 REGISTER_TEST_EXAMPLE(2025, Day01, ExampleInput, 2, 6); REGISTER_TEST(2025, Day01, Input, 2, 6671); - void test(int i) - { - } - READ_INPUT(input) { std::vector vec; diff --git a/src/2025/Day02.cpp b/src/2025/Day02.cpp index e18d0c5..292a96d 100644 --- a/src/2025/Day02.cpp +++ b/src/2025/Day02.cpp @@ -2,35 +2,90 @@ namespace y2025::day02 { - using InputType = std::vector; - REGISTER_DAY(2025, Day02, InputType, int); + using InputType = std::vector>; + REGISTER_DAY(2025, Day02, InputType, int64_t); - REGISTER_TEST_EXAMPLE(2025, Day02, ExampleInput, 1, 0); - REGISTER_TEST(2025, Day02, Input, 1, 0); - REGISTER_TEST_EXAMPLE(2025, Day02, ExampleInput, 2, 0); - REGISTER_TEST(2025, Day02, Input, 2, 0); + REGISTER_TEST_EXAMPLE(2025, Day02, ExampleInput, 1, 1227775554); + REGISTER_TEST(2025, Day02, Input, 1, 19219508902); + REGISTER_TEST_EXAMPLE(2025, Day02, ExampleInput, 2, 4174379265); + REGISTER_TEST(2025, Day02, Input, 2, 27180728081); READ_INPUT(input) { - std::vector vec; + std::vector> vec; std::string str; - while (std::getline(input, str)) + while (std::getline(input, str, ',')) { std::stringstream ss{str}; - int n; - ss >> n; - vec.emplace_back(n); + int64_t i, j; + ss >> i >> "-" >> j; + vec.emplace_back(i, j); } return vec; } + bool IsRepeating(int64_t n, int digits, int repeats) + { + if (digits % repeats != 0) + return false; + + int64_t val = n; + int64_t x = Helper::Pow10(digits / repeats); + int64_t repeat = n % x; + for (int i = 1; i < repeats; i++) + { + val /= x; + if (val % x != repeat) + return false; + } + return true; + } + + bool IsInvalidP1(int64_t n) + { + return IsRepeating(n, Helper::GetNumberOfDigits(n), 2); + } + + bool IsInvalidP2(int64_t n) + { + int digits = Helper::GetNumberOfDigits(n); + for (int repeats = 2; repeats <= digits; repeats++) + { + if (IsRepeating(n, digits, repeats)) + return true; + } + return false; + } + OUTPUT1(input) { - return 0; + int64_t sum{0}; + for (const auto& pair : input) + { + for (int64_t i = pair.first; i <= pair.second; i++) + { + if (IsInvalidP1(i)) + { + sum += i; + } + } + } + return sum; } OUTPUT2(input) { - return 0; + int64_t sum{0}; + for (const auto& pair : input) + { + for (int64_t i = pair.first; i <= pair.second; i++) + { + if (IsInvalidP2(i)) + { + sum += i; + } + } + } + return sum; } } diff --git a/src/common/lib/Helper.h b/src/common/lib/Helper.h index dd176f1..69a87be 100644 --- a/src/common/lib/Helper.h +++ b/src/common/lib/Helper.h @@ -15,6 +15,18 @@ #define BIT(x) (1 << (x)) +template +static std::ostream& operator<<(std::ostream& stream, const std::vector& container); + +template +static std::ostream& operator<<(std::ostream& stream, const std::set& container); + +template +static std::ostream& operator<<(std::ostream& stream, const std::map& container); + +template +static std::ostream& operator<<(std::ostream& stream, const std::pair& pair); + struct Helper { template @@ -38,6 +50,59 @@ struct Helper return c >= '0' && c <= '9'; } + static int GetNumberOfDigits(int n) + { + assert(n > 0); + // clang-format off + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1'000) return 3; + if (n < 10'000) return 4; + if (n < 100'000) return 5; + if (n < 1'000'000) return 6; + if (n < 10'000'000) return 7; + if (n < 100'000'000) return 8; + if (n < 1'000'000'000) return 9; + // clang-format on + return 10; + } + + static int GetNumberOfDigits(int64_t n) + { + assert(n > 0); + // clang-format off + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1'000) return 3; + if (n < 10'000) return 4; + if (n < 100'000) return 5; + if (n < 1'000'000) return 6; + if (n < 10'000'000) return 7; + if (n < 100'000'000) return 8; + if (n < 1'000'000'000) return 9; + if (n < 10'000'000'000) return 10; + if (n < 100'000'000'000) return 11; + if (n < 1'000'000'000'000) return 12; + if (n < 10'000'000'000'000) return 13; + if (n < 100'000'000'000'000) return 14; + if (n < 1'000'000'000'000'000) return 15; + if (n < 10'000'000'000'000'000) return 16; + if (n < 100'000'000'000'000'000) return 17; + if (n < 1'000'000'000'000'000'000) return 18; + // clang-format on + return 19; + } + + static int64_t Pow10(int pow) + { + int64_t p = 10; + for (int i = 1; i < pow; i++) + { + p *= 10; + } + return p; + } + // Converts a binary string to an int32_t ie "10100111001" to 1337 static int BinStrToInt(const std::string& str) {