Compare commits
No commits in common. 'e62e675be22db7b00dbdede1155c9aab8fa1e265' and 'c90d2383059cc69c5fdd5da94e91dd28dab09bb3' have entirely different histories.
e62e675be2
...
c90d238305
6 changed files with 42 additions and 141 deletions
@ -1,105 +1,9 @@ |
|||||||
#include "Day12.h" |
#include "Day12.h" |
||||||
|
|
||||||
Result Day12::Task1() { |
Result Day12::Task1() { |
||||||
uint64 sum = 0; |
return Day::Task1(); |
||||||
|
|
||||||
for (const auto& [conditions, groups] : parseRecords()){ |
|
||||||
uint64 localSum = 0; |
|
||||||
auto arrangements = allArrangements({conditions, groups}); |
|
||||||
for (const auto& arrangement : arrangements){ |
|
||||||
if (matches(conditions, arrangement)) |
|
||||||
localSum++; |
|
||||||
|
|
||||||
} |
|
||||||
size_t count = arrangements.size(); |
|
||||||
sum += localSum; |
|
||||||
} |
|
||||||
|
|
||||||
return to_string(sum); |
|
||||||
} |
} |
||||||
|
|
||||||
Result Day12::Task2() { |
Result Day12::Task2() { |
||||||
uint64 sum = 0; |
return Day::Task2(); |
||||||
|
|
||||||
size_t index = 0; |
|
||||||
|
|
||||||
for (auto& [conditions, groups] : parseRecords()){ |
|
||||||
auto condCopy = conditions; |
|
||||||
auto groupsCopy = groups; |
|
||||||
for (size_t i = 0; i < 4; i++){ |
|
||||||
conditions += "?" + condCopy; |
|
||||||
groups.insert(groups.end(), groupsCopy.begin(), groupsCopy.end()); |
|
||||||
} |
|
||||||
for (const auto& arrangement : allArrangements({conditions, groups})){ |
|
||||||
if (matches(conditions, arrangement)) |
|
||||||
sum++; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
cout << index++ << endl; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
return to_string(sum); |
|
||||||
} |
|
||||||
|
|
||||||
vector<Day12::Record> Day12::parseRecords() const { |
|
||||||
vector<Record> records; |
|
||||||
|
|
||||||
for (const string &line : input){ |
|
||||||
auto both = split(line, ' '); |
|
||||||
records.emplace_back(both[0], parseUInts(both[1])); |
|
||||||
} |
|
||||||
|
|
||||||
return records; |
|
||||||
} |
|
||||||
|
|
||||||
vector<Day12::Arrangement> Day12::allArrangements(const Day12::Record &record) { |
|
||||||
auto &[conditions, groups] = record; |
|
||||||
|
|
||||||
vector<Arrangement> 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<size_t> 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; |
|
||||||
} |
|
||||||
|
|
||||||
bool Day12::matches(const string &conditions, const Day12::Arrangement &arrangement) { |
|
||||||
for (size_t i = 0; i < arrangement.size(); i++){ |
|
||||||
char cond = conditions[i]; |
|
||||||
bool broken = arrangement[i]; |
|
||||||
if (cond == '.' && broken || cond == '#' && !broken) |
|
||||||
return false; |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
} |
Loading…
Reference in new issue