From 19b1f4d145b62da1292e5aef93cb9032f764b5ac Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Thu, 21 Dec 2023 15:35:27 +0100 Subject: [PATCH] Day 12 Task 1 --- src/days/12/Day12.cpp | 97 +++++++++++++++++++++++++++++++++++++++++-- src/days/12/Day12.h | 4 ++ src/util.h | 7 +++- 3 files changed, 104 insertions(+), 4 deletions(-) diff --git a/src/days/12/Day12.cpp b/src/days/12/Day12.cpp index fd9f16d..cf84bc7 100644 --- a/src/days/12/Day12.cpp +++ b/src/days/12/Day12.cpp @@ -1,9 +1,100 @@ #include "Day12.h" Result Day12::Task1() { - return Day::Task1(); + uint64 sum = 0; + + for (const auto& [conditions, groups] : parseRecords()){ + for (const auto& arrangement : allArrangements({conditions, groups})){ + bool possible = true; + for (size_t i = 0; i < arrangement.size(); i++){ + char cond = conditions[i]; + bool broken = arrangement[i]; + if (cond == '.' && broken || cond == '#' && !broken){ + possible = false; + break; + } + } + if (possible) + sum++; + } + } + + return to_string(sum); } Result Day12::Task2() { - return Day::Task2(); -} \ No newline at end of file + + + + uint64 sum = 0; + + for (auto[conditions, groups] : parseRecords()){ + + for (const auto& arrangement : allArrangements({conditions, groups})){ + bool possible = true; + for (size_t i = 0; i < arrangement.size(); i++){ + char cond = conditions[i]; + bool broken = arrangement[i]; + if (cond == '.' && broken || cond == '#' && !broken){ + possible = false; + break; + } + } + if (possible) + sum++; + } + } + + return to_string(sum); +} + +vector Day12::parseRecords() const { + vector records; + + for (const string &line : input){ + auto both = split(line, ' '); + records.emplace_back(both[0], parseUInts(both[1])); + } + + return records; +} + +vector Day12::allArrangements(const Day12::Record &record) { + auto &[conditions, groups] = record; + + vector arrangements; + + if (groups.size() == 1){ + size_t group = groups[0]; + for (size_t i = 0; i < conditions.size() - group + 1; i++){ + Arrangement a(conditions.size(), false); + for (size_t j = 0; j < group; j++) + a[i + j] = true; + arrangements.push_back(a); + } + + return arrangements; + } + + vector remainingGroups(groups.size() - 1); + std::copy(++groups.begin(), groups.end(), remainingGroups.begin()); + + size_t neededSpace = sum(remainingGroups) + remainingGroups.size() - 1; + size_t startLimit = conditions.size() - neededSpace - 1; + + for (size_t i = groups[0] - 1; i < startLimit; i++){ + Arrangement base(i + 2, true); + base.back() = false; + for (size_t j = 0; j < i - groups[0] + 1; j++) + base[j] = false; + + auto addedRight = allArrangements({conditions.substr(i + 2), remainingGroups}); + for (auto &a : addedRight){ + Arrangement combined(base); + std::copy(a.begin(), a.end(), std::back_inserter(combined)); + arrangements.push_back(combined); + } + } + + return arrangements; +} diff --git a/src/days/12/Day12.h b/src/days/12/Day12.h index 1d4054d..d24bff4 100644 --- a/src/days/12/Day12.h +++ b/src/days/12/Day12.h @@ -3,6 +3,10 @@ #include "../../Day.h" class Day12 : public Day { + typedef pair> Record; + typedef vector Arrangement; + vector parseRecords() const; + static vector allArrangements(const Record &record); protected: Result Task1() override; diff --git a/src/util.h b/src/util.h index 6d3a59c..924fc54 100644 --- a/src/util.h +++ b/src/util.h @@ -31,4 +31,9 @@ bool isDigit(char c, uint8_t &result); bool isDigit(char c); vector parseUInts(const string &data); -vector parseInts(const string &data); \ No newline at end of file +vector parseInts(const string &data); + +template +T sum(const vector& values){ + return std::reduce(values.begin(), values.end(), T(), [](T a, T b){return a + b;}); +} \ No newline at end of file