From 5355de2921126e2b75e24abd57e17556e22a6ed0 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 7 Aug 2025 15:09:46 +0200 Subject: Added API function for solution variations --- cpp/examples/variations.cpp | 15 +++++++++++++++ cpp/nissy.cpp | 34 ++++++++++++++++++++++++++++++++++ cpp/nissy.h | 16 ++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 cpp/examples/variations.cpp (limited to 'cpp') diff --git a/cpp/examples/variations.cpp b/cpp/examples/variations.cpp new file mode 100644 index 0000000..3c6421d --- /dev/null +++ b/cpp/examples/variations.cpp @@ -0,0 +1,15 @@ +/* A simple example showing how to move a cube and print it in H48 format. */ + +#include "../nissy.h" +#include + +int main() { + std::string moves = "R U' Bw2 M D' x' F B(E2 F D B' Lw2 U2 U' S2 B)"; + auto v = std::get(nissy::variation::get("lastqt")); + auto variations = v.find_variations(moves).solutions; + + std::cout << "Changing the last quarter turn of " << moves << " gives:" + << std::endl << variations; + + return 0; +} diff --git a/cpp/nissy.cpp b/cpp/nissy.cpp index 90fcf20..6ca4884 100644 --- a/cpp/nissy.cpp +++ b/cpp/nissy.cpp @@ -12,6 +12,7 @@ extern "C" { long long nissy_inverse(const char *, char *); long long nissy_applymoves(const char *, const char *, char *); long long nissy_applytrans(const char *, const char *, char *); + long long nissy_variations(const char *, const char *, size_t, char*); long long nissy_getcube(long long, long long, long long, long long, long long, const char *, char *); long long nissy_solverinfo(const char *, char *); @@ -44,6 +45,7 @@ namespace nissy { const error error::INVALID_MOVES{-20}; const error error::INVALID_TRANS{-30}; const error error::INVALID_SOLVER{-50}; + const error error::INVALID_VARIATION{-51}; const error error::NULL_POINTER{-60}; const error error::BUFFER_SIZE{-61}; const error error::DATA{-70}; @@ -62,10 +64,42 @@ namespace nissy { constexpr size_t TRANSFORMATION = 12; constexpr size_t SOLVE_STATS = 10; constexpr size_t DATAID = 255; + constexpr size_t MOVES = 1000; } bool error::ok() const { return value >= 0; } + variation::variation(const std::string& str) : name{str} {} + + variation::variations_result + variation::find_variations(const std::string& moves) + { + variation::variations_result result; + + const size_t len = 3 * size::MOVES * 16; + result.solutions.resize(len); + + auto err = nissy_variations(moves.c_str(), name.c_str(), len, + result.solutions.data()); + + int size = result.solutions.find_first_of('\0'); + result.solutions.resize(size); + result.err = error{err}; + + return result; + } + + std::variant + variation::get(const std::string& name) { + char result[10]; + variation s(name); + + if (nissy_variations("", name.c_str(), 10, result) < 0) + return error::INVALID_VARIATION; + else + return s; + } + cube::cube() {} error cube::move(const std::string& moves) diff --git a/cpp/nissy.h b/cpp/nissy.h index 199af10..74bbd32 100644 --- a/cpp/nissy.h +++ b/cpp/nissy.h @@ -39,6 +39,7 @@ namespace nissy { static const error INVALID_MOVES; static const error INVALID_TRANS; static const error INVALID_SOLVER; + static const error INVALID_VARIATION; static const error NULL_POINTER; static const error BUFFER_SIZE; static const error DATA; @@ -63,6 +64,21 @@ namespace nissy { static const compare_result DIFFERENT; }; + class variation { + public: + struct variations_result { + error err; + std::string solutions; + }; + + const std::string name; + + variations_result find_variations(const std::string&); + static std::variant get(const std::string&); + private: + variation(const std::string&); + }; + class cube { public: cube(); -- cgit v1.3