master
Benjamin Kraft 2 years ago
parent b0b506d60c
commit 735deb44bf
  1. 82
      src/days/05/Day05.cpp
  2. 8
      src/days/05/Day05.h

@ -1,9 +1,85 @@
#include "Day05.h"
Result Day05::Task1() {
return Day::Task1();
vector<Stack> stacks = parseStacks();
const vector<Move> 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();
}
vector<Stack> stacks = parseStacks();
const vector<Move> 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<Stack> Day05::parseStacks(){
vector<Stack> 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<Move> Day05::parseMoves() {
vector<Move> 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();
}

@ -2,9 +2,17 @@
#include "../../Day.h"
typedef char Crate;
typedef vector<Crate> Stack;
typedef pair<int, pair<int, int>> Move;
class Day05 : public Day {
protected:
Result Task1() override;
Result Task2() override;
int splitIndex();
vector<Stack> parseStacks();
vector<Move> parseMoves();
};
Loading…
Cancel
Save