h48

A prototype for an optimal Rubik's cube solver, work in progress.
git clone https://git.tronto.net/h48
Download | Log | Files | Refs | README | LICENSE

commit 1cecea625ed405c7203d1977e687da36d835fc9a
parent 0b1930307f41db3ea7552d6b2f4666b33c64d26a
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Sun,  9 Jun 2024 20:23:58 +0200

Cleanup cube.h

Diffstat:
MTODO.txt | 4+---
Csrc/cube.h -> old/cube_h_with_format_documentation | 0
Msrc/cube.h | 131+++++--------------------------------------------------------------------------
Msrc/cube_generic.h | 4++--
4 files changed, 11 insertions(+), 128 deletions(-)

diff --git a/TODO.txt b/TODO.txt @@ -1,7 +1,5 @@ Refactoring: remove cube_fast_t and add b32 format - - cleanup cube.h - remove some documentation, move to new file - create src/cube_pulic.h for implementations of cube.h stuff + - see TODO comments in cube.h - switch to b32 by default (part 1) add tests for b32 (write at some by hand) - fix utility code in utils/*.c diff --git a/src/cube.h b/old/cube_h_with_format_documentation diff --git a/src/cube.h b/src/cube.h @@ -1,139 +1,27 @@ -/****************************************************************************** -Cube type definition - -Each piece is represented by an (unsigned) 8-bit integer. The 4 -least-significant bits determine which piece it is, the other 4 determine -the orientation. - -Edges are numbered as follows (see also cube.c): -UF=0 UB=1 DB=2 DF=3 UR=4 UL=5 DL=6 DR=7 FR=8 FL=9 BL=10 BR=11 - -Corners are numbered as follows: -UFR=0 UBL=1 DFL=2 DBR=3 UFL=4 UBR=5 DFR=6 DBL=7 - -The orientation of the edges is with respect to F/B, the orientation of -corners is with respect to U/D. - -The permutation of the center pieces is not stored. This means that the -cube is assumed to be in a fixed orientation. - -TODO: define EO and CO better, explain how to use them -TODO: encode centers? - -The exact cube type structure depends on your system's configuration. If -you operate on the cube only via the functions provided below, you don't -need to worry about this. -******************************************************************************/ - -/* Apply the second cube on the first as a move sequence */ -cube_t compose(cube_t, cube_t); - -/* Invert the cube */ -cube_t inverse(cube_t); - -/* Check if a cube represent a valid state (possibly unsolvable) */ - -/* TODO comment on these and the format for moves and trans */ -/* For trans, only one trans is supported */ +/* TODO: change cube to const char [static 22], or const char * */ +/* TODO: return error code */ +/* TODO: implement all of this, or move the implementation to cube_public.h */ +/* TODO: document in a separate file, possibly leave here 1-line comments */ + +cube_t compose(cube_t cube, cube_t perm); +cube_t inverse(cube_t cube); +cube_t solvedcube(void); cube_t applymoves(cube_t, const char *); cube_t applytrans(cube_t, const char *); - -/****************************************************************************** -Read / write utilities - -Reading and writing is not done directly via stdin / stdout, but via an -array of char (called buf in the prototypes below). - -Multiple representations of the cube as text are supported: - -- H48: a human-readable format. - Each edge is represented by two letters denoting the sides it - belongs to and one number denoting its orientation (0 oriented, 1 - mis-oriented). Similarly, each corner is represented by three letters and - a number (0 oriented, 1 twisted clockwise, 2 twisted counter-clockwise). - - The solved cube looks like this: - - UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 - UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 - - The cube after the moves R'U'F looks like this: - - FL1 BR0 DB0 UR1 UF0 UB0 DL0 FR0 UL1 DF1 BL0 DR0 - UBL1 DBR1 UFR2 DFR2 DFL2 UBL2 UFL2 DBL0 - - Whitespace (including newlines) between pieces is ignored when reading the - cube. A single whitespace character is added between pieces when writing. - -- SRC: format used to generate code for internal use. - If OUT is the output in SRC format, one can use `cube_t cube = OUT` to - declare a new cube object. - -- LST: a format for internal use and generating code. - The cube is printed as a comma-separated list of 20 integers, as they appear - in cube_t. Corners come first, followed by edge (unlike H48). -******************************************************************************/ - cube_t readcube(const char *format, const char *buf); void writecube(const char *format, cube_t cube, char *buf); - -/****************************************************************************** -Solvers - -The solutions are returned as a newline-separated list of characters. Moves -are separated by single spaces. - -Unless specified otherwise, all the solutions are not trivially simplifiable. -This means that sequences like U U2 or R L R will not appear in any solution. -Moreover, two consecutive parallel moves are always going to be sorted in -increasing order. For example, L R2 may never appear in a solution, but R2 L -could. -******************************************************************************/ - int64_t solve( - /* The cube to solve. Must be solvable. */ cube_t cube, - - /* Supported solvers: - * "optimal" - currently the same as "simple" - * "simple" - a simple, slow solver without tables - */ const char *solver, - - /* Some solvers accept extra options,like "!filter". */ const char *options, - - /* Can be "normal", "inverse", "mixed" or "linear". */ const char *nisstype, - - /* The minimum number of moves. Must be >= 0. */ int8_t minmoves, - - /* The maximum number of moves. If negative, the maximum length - * is unlimited. - */ int8_t maxmoves, - - /* The maximum number of solutions. */ int64_t maxsols, - - /* All solutions at most "optimal" moves from the shortest solution - * (respecting minmoves) are found. If negative, it is ignored. - */ int8_t optimal, - - /* Some solvers require extra data to function properly (for example, - * pruning tables). This data can be generated with gendata(). - */ const void *data, - - /* The solutions (return parameter) */ char *solutions ); - -/* Solving n cubes optimally, one solutions per cube. Options are similar - * to solve(). - */ void multisolve( int n, cube_t *cube, @@ -141,7 +29,4 @@ void multisolve( const void *data, char *sols ); - -/* Returns the number of bytes written to data, -1 in case of error. - * TODO: write down how much memory every solver requires. */ int64_t gendata(const char *solver, const char *options, void *data); diff --git a/src/cube_generic.h b/src/cube_generic.h @@ -1,7 +1,7 @@ #define _move(M, c) compose(c, _move_cube_ ## M) #define _premove(M, c) compose(_move_cube_ ## M, c) -_static cube_t solvedcube(); +_static cube_t solvedcube(void); _static bool isconsistent(cube_t); _static bool issolvable(cube_t); _static bool issolved(cube_t); @@ -16,7 +16,7 @@ _static cube_t transform_corners(cube_t, uint8_t); _static cube_t transform(cube_t, uint8_t); _static cube_t -solvedcube() +solvedcube(void) { return solved; }