From 4de110a51759849af88d8ba974b82f001f9cf15e Mon Sep 17 00:00:00 2001 From: Thraix Date: Tue, 4 Aug 2026 23:13:43 +0200 Subject: [PATCH] Add solution for 2015 Day 24 --- res/2015/day24/test_input.txt | 10 +++ src/2015/Day24.cpp | 128 +++++++++++++++++++++++++++++++--- 2 files changed, 127 insertions(+), 11 deletions(-) diff --git a/res/2015/day24/test_input.txt b/res/2015/day24/test_input.txt index e69de29..f4909b4 100644 --- a/res/2015/day24/test_input.txt +++ b/res/2015/day24/test_input.txt @@ -0,0 +1,10 @@ +1 +2 +3 +4 +5 +7 +8 +9 +10 +11 diff --git a/src/2015/Day24.cpp b/src/2015/Day24.cpp index dcfa9a8..6f365df 100644 --- a/src/2015/Day24.cpp +++ b/src/2015/Day24.cpp @@ -2,30 +2,136 @@ namespace y2015::day24 { - REGISTER_DAY(2015, Day24, std::vector, int); + REGISTER_DAY(2015, Day24, std::vector, uint64_t); - REGISTER_TEST_EXAMPLE(2015, Day24, ExampleInput, 1, 0); - REGISTER_TEST(2015, Day24, Input, 1, 0); - REGISTER_TEST_EXAMPLE(2015, Day24, ExampleInput, 2, 0); - REGISTER_TEST(2015, Day24, Input, 2, 0); + REGISTER_TEST_EXAMPLE(2015, Day24, ExampleInput, 1, 99); + REGISTER_TEST(2015, Day24, Input, 1, 11266889531); + REGISTER_TEST_EXAMPLE(2015, Day24, ExampleInput, 2, 44); + REGISTER_TEST(2015, Day24, Input, 2, 77387711); READ_INPUT(input) { - std::vector vec; - std::string str; - while (getline(input, str)) + return Input::ReadInts(input); + } + + void GetAllSumCombinations(std::vector& listLeft, + std::vector& currentList, + std::vector>& result, + int sumLeft, + size_t offset) + { + if (sumLeft < 0) + return; + if (sumLeft == 0) { + result.emplace_back(currentList); + return; } - return vec; + + for (size_t i = offset; i < listLeft.size(); i++) + { + if (listLeft[i] == 0) + continue; + if (sumLeft < listLeft[i]) + break; + currentList.emplace_back(listLeft[i]); + int number = listLeft[i]; + listLeft[i] = 0; + GetAllSumCombinations(listLeft, currentList, result, sumLeft - number, i + 1); + currentList.pop_back(); + listLeft[i] = number; + } + } + + std::vector> GetAllSumCombinations(std::vector list, int sum, int groups) + { + std::vector currentList{}; + std::vector> result{}; + GetAllSumCombinations(list, currentList, result, sum / groups, 0); + return result; + } + + bool Overlap(const std::vector& list1, const std::vector& list2) + { + size_t i1 = 0; + size_t i2 = 0; + while (i1 < list1.size() && i2 < list2.size()) + { + if (list1[i1] == list2[i2]) + return true; + + if (list1[i1] < list2[i2]) + i1++; + else + i2++; + } + return false; + } + + bool Overlap(const std::vector& combination, const std::vector*>& combinationList) + { + for (const auto& elem : combinationList) + { + if (Overlap(combination, *elem)) + return true; + } + return false; + } + + bool HasSolution(const std::vector>& sumCombinations, + const std::vector*>& list, + size_t offset, + int groupsLeft) + { + for (size_t i = offset; i < sumCombinations.size(); i++) + { + if (Overlap(sumCombinations[i], list)) + continue; + if (groupsLeft == 1) + return true; + + std::vector*> newList = list; + newList.emplace_back(&sumCombinations[i]); + if (HasSolution(sumCombinations, newList, i + 1, groupsLeft - 1)) + return true; + } + return false; + } + + uint64_t Solve(const std::vector& list, int groups) + { + int sum = Helper::Sum(list); + std::vector> sumCombinations = GetAllSumCombinations(list, sum, groups); + + size_t minSize = std::numeric_limits::max(); + for (size_t i = 0; i < sumCombinations.size(); i++) + { + minSize = std::min(minSize, sumCombinations[i].size()); + } + + uint64_t minProd = std::numeric_limits::max(); + for (size_t i = 0; i < sumCombinations.size(); i++) + { + if (sumCombinations[i].size() != minSize) + continue; + size_t product = Helper::Product(sumCombinations[i]); + if (product >= minProd) + continue; + + if (HasSolution(sumCombinations, {&sumCombinations[i]}, 0, groups - 1)) + minProd = product; + } + + return minProd; } OUTPUT1(input) { - return 0; + return Solve(input, 3); } OUTPUT2(input) { - return 0; + return Solve(input, 4); } }