diff --git a/src/days/05/Day05.cpp b/src/days/05/Day05.cpp index c928c21..bb001c2 100644 --- a/src/days/05/Day05.cpp +++ b/src/days/05/Day05.cpp @@ -1,9 +1,85 @@ #include "Day05.h" Result Day05::Task1() { - return Day::Task1(); + vector stacks = parseStacks(); + const vector moves = parseMoves(); + + for (const Move &move : moves){ + int src = move.second.first; + int dest = move.second.second; + for (int i = 0; i < move.first; i++){ + stacks[dest].push_back(stacks[src].back()); + stacks[src].pop_back(); + } + } + + string result; + for (const Stack &stack : stacks) + result.push_back(stack.back()); + + return result; } Result Day05::Task2() { - return Day::Task2(); -} \ No newline at end of file + vector stacks = parseStacks(); + const vector moves = parseMoves(); + + for (const Move &move : moves){ + int src = move.second.first; + int dest = move.second.second; + int count = move.first; + Stack &srcStack = stacks[src]; + for (int i = 0; i < count; i++){ + stacks[dest].push_back(srcStack[srcStack.size() - count + i]); + } + for (int i = 0; i < count; i++) srcStack.pop_back(); + } + + string result; + for (const Stack &stack : stacks) + result.push_back(stack.back()); + + return result; +} + +vector Day05::parseStacks(){ + vector parsed; + + int endIndex = splitIndex(); + string numberLine = input[endIndex - 1]; + int stackCount = atoi(&numberLine.at(numberLine.size() - 2)); + for (int i = 0; i < stackCount; i++){ + parsed.emplace_back(); + int index = 1 + 4 * i; + for (int line = endIndex - 2; line >= 0 && input[line].size() > index && input[line][index] != ' '; line--){ + Crate crate = input[line][index]; + parsed[i].push_back(crate); + } + } + + return parsed; +} + +vector Day05::parseMoves() { + vector parsed; + + int startIndex = splitIndex() + 1; + + for (int i = startIndex; i < input.size(); i++){ + string line = input[i]; + size_t fromIndex = line.find(" from"); + int count = stoi(line.substr(5, fromIndex - 5)); + int src = stoi(line.substr(fromIndex + 6, 1)) - 1; + int dest = stoi(line.substr(fromIndex + 11, 1)) - 1; + parsed.emplace_back(count, pair(src, dest)); + } + + return parsed; +} + +int Day05::splitIndex(){ + auto iter = std::find_if(input.begin(), input.end(), [](const string& element){return element == "";}); + return iter - input.begin(); +} + + diff --git a/src/days/05/Day05.h b/src/days/05/Day05.h index bf73364..a90dfa2 100644 --- a/src/days/05/Day05.h +++ b/src/days/05/Day05.h @@ -2,9 +2,17 @@ #include "../../Day.h" +typedef char Crate; +typedef vector Stack; +typedef pair> Move; + class Day05 : public Day { protected: Result Task1() override; Result Task2() override; + + int splitIndex(); + vector parseStacks(); + vector parseMoves(); }; \ No newline at end of file