diff --git a/core/src/common/arbitrary_container.h b/core/src/common/arbitrary_container.h index 16e137ae..efaa657b 100644 --- a/core/src/common/arbitrary_container.h +++ b/core/src/common/arbitrary_container.h @@ -105,6 +105,7 @@ struct ArbitraryContainer { return result; } + // TODO: inline value_t &operator[](size_t i) { ... } inline value_t operator[](size_t i) const { return at(i); } inline size_t size() const { return internal.size() / valueBitLength; } diff --git a/core/src/shurikens/data/data.h b/core/src/shurikens/data/data.h index bf260d7c..f2655709 100644 --- a/core/src/shurikens/data/data.h +++ b/core/src/shurikens/data/data.h @@ -34,17 +34,43 @@ namespace Shurikens { struct ShurikenData { ShurikenData(std::string name, Shuriken shuriken, const Shurikens::MoveContainer &solution) - : name(std::move(name)), shuriken(std::move(shuriken)), solutions({solution}) {} + : name(std::move(name)), shuriken(std::move(shuriken)), solutions({solution}) { + } ShurikenData(std::string name, Shuriken shuriken, const Shurikens::MoveContainer &solution0, const Shurikens::MoveContainer &solution1) - : name(std::move(name)), shuriken(std::move(shuriken)), solutions({solution0, solution1}) { + : name(std::move(name)), shuriken(std::move(shuriken)), solutions({solution0, solution1}) { assert(solution0.size() == solution1.size()); } inline size_t solutionSize() const { return solutions.cbegin()->size(); } + inline bool isSolution(const Shurikens::MoveContainer &solution) const { - return solutions.find(solution) != solutions.end(); + if (solution.size() != solutions.cbegin()->size()) return false; + + const bool isExactSolution = solutions.find(solution) != solutions.end(); + if (isExactSolution) return true; + + const auto &lastMove = solution.at(solution.size() - 1); + // If the last move is a swap, it doesn't matter if it's top or bottom + if (lastMove == swap_top) { + // TODO: This for loop should've been `MoveContainer copy{solution.cbegin(), solution.cend() - 1};` instead + MoveContainer copy; + for (size_t i = 0; i < solution.size() - 1; ++i) { + copy.push(solution[i]); + } + copy.push(swap_bottom); + return solutions.find(copy) != solutions.end(); + } else if (lastMove == swap_bottom) { + MoveContainer copy; + for (size_t i = 0; i < solution.size() - 1; ++i) { + copy.push(solution[i]); + } + copy.push(swap_top); + return solutions.find(copy) != solutions.end(); + } + + return false; } const std::string name;