1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
/*
This is libnissy (temporarily also known as h48), a Rubik's cube library.
If you include this file, you should also use the following includes:
#include <inttypes>
#include <stdarg>
#include <stdbool>
#include <string>
All the functions return 0 or a positive integer in case of success and
a negative integer in case of error, unless otherwise specified.
You can see the list of error codes below, or use nissy_explainerror().
All cube arguments are in B32 formats, unless otherwise specified.
Other available formats are H48 and SRC. See README.md for more info on
these formats.
Accepted moves are U, D, R, L, F and B, optionally followed by a 2,
a ' or a 3.
A transformation must be given in the format
(rotation|mirrored) (2 letters)
for example 'rotation UF' or 'mirrored BL'.
*/
/* Error codes */
#define NISSY_OK INT64_C(0)
#define NISSY_WARNING_UNSOLVABLE INT64_C(-1)
#define NISSY_WARNING_NULL_CALLBACK INT64_C(-2)
#define NISSY_ERROR_INVALID_CUBE INT64_C(-10)
#define NISSY_ERROR_UNSOLVABLE_CUBE INT64_C(-11)
#define NISSY_ERROR_INVALID_MOVES INT64_C(-20)
#define NISSY_ERROR_INVALID_TRANS INT64_C(-30)
#define NISSY_ERROR_INVALID_FORMAT INT64_C(-40)
#define NISSY_ERROR_INVALID_SOLVER INT64_C(-50)
#define NISSY_ERROR_NULL_POINTER INT64_C(-60)
#define NISSY_ERROR_BUFFER_SIZE INT64_C(-61)
#define NISSY_ERROR_DATA INT64_C(-70)
#define NISSY_ERROR_OPTIONS INT64_C(-80)
#define NISSY_ERROR_INVALID_CODE INT64_C(-90)
#define NISSY_ERROR_UNKNOWN INT64_C(-999)
/* Some constants for size for I/O buffers */
#define NISSY_SIZE_B32 UINT64_C(22)
#define NISSY_SIZE_H48 UINT64_C(88)
#define NISSY_SIZE_TRANSFORMATION UINT64_C(12)
/* Flags for NISS options */
#define NISSY_NISSFLAG_NORMAL UINT8_C(1)
#define NISSY_NISSFLAG_INVERSE UINT8_C(2)
#define NISSY_NISSFLAG_MIXED UINT8_C(4)
#define NISSY_NISSFLAG_LINEAR \
(NISSY_NISSFLAG_NORMAL | NISSY_NISSFLAG_INVERSE)
#define NISSY_NISSFLAG_ALL \
(NISSY_NISSFLAG_NORMAL | NISSY_NISSFLAG_INVERSE | NISSY_NISSFLAG_MIXED)
/*
Apply the secod argument as a permutation on the first argument.
Parameters:
cube - The first cube, in B32 format.
permutation - The second cube, in B32 format. This cube is treated as a
permutation and "applied" to the first cube.
result - The return parameter for the resulting cube, in B32 format.
Return values:
NISSY_OK - The cubes were composed succesfully.
NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is
either because at least on of the given cubes
was not solvable, or due to an unknown internal
error.
NISSY_ERROR_INVALID_CUBE - At least one of the given cubes is invalid.
NISSY_ERROR_UNKNOWN - An unknown error occurred.
*/
int64_t nissy_compose(
const char cube[static NISSY_SIZE_B32],
const char permutation[static NISSY_SIZE_B32],
char result[static NISSY_SIZE_B32]
);
/*
Compute the inverse of the given cube.
Parameters:
cube - The cube to be inverted, in B32 format.
result - The return parameter for the resulting cube, in B32 format.
Return values:
NISSY_OK - The cube was inverted succesfully.
NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is
either because the given cube was not solvable,
or due to an unknown internal error.
NISSY_ERROR_INVALID_CUBE - The given cube is invalid.
NISSY_ERROR_UNKNOWN - An unknown error occurred.
*/
int64_t nissy_inverse(
const char cube[static NISSY_SIZE_B32],
char result[static NISSY_SIZE_B32]
);
/*
Apply the given sequence of moves on the given cube.
Parameters:
cube - The cube to move, in B32 format.
moves - The moves to apply to the cube. Must be a NULL-terminated string.
result - The return parameter for the resulting cube, in B32 format.
Return values:
NISSY_OK - The moves were applied succesfully.
NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is
either because the given cube was not solvable,
or due to an unknown internal error.
NISSY_ERROR_INVALID_CUBE - The given cube is invalid.
NISSY_ERROR_INVALID_MOVES - The given moves are invalid.
NISSY_ERROR_NULL_POINTER - The 'moves' argument is NULL.
*/
int64_t nissy_applymoves(
const char cube[static NISSY_SIZE_B32],
const char *moves,
char result[static NISSY_SIZE_B32]
);
/*
Apply the single given transformation to the given cube.
Parameters:
cube - The cube to be transformed, in B32 format.
transformation - The transformation in (rotation|mirrored) xy format.
result - The return parameter for the resulting cube, in B32 format.
Return values:
NISSY_OK - The transformation was performed succesfully.
NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is
probably due to an unknown internal error.
NISSY_ERROR_INVALID_CUBE - The given cube is invalid.
NISSY_ERROR_INVALID_TRANS - The given transformation is invalid.
*/
int64_t nissy_applytrans(
const char cube[static NISSY_SIZE_B32],
const char transformation[static NISSY_SIZE_TRANSFORMATION],
char result[static NISSY_SIZE_B32]
);
/*
Apply the given moves to the solved cube.
Parameters:
moves - The moves to be applied to the solved cube. Must be a
NULL-terminated string.
result - Return parameter for the resulting cube, in B32 format.
Return values:
NISSY_OK - The moves were performed succesfully.
NISSY_WARNING_UNSOLVABLE - The resulting cube is not solvable. This is
probably due to an unknown internal error.
NISSY_ERROR_INVALID_MOVES - The given moves are invalid.
NISSY_ERROR_NULL_POINTER - The 'moves' argument is NULL.
*/
int64_t nissy_frommoves(
const char *moves,
char result[static NISSY_SIZE_B32]
);
/*
Convert the given cube between the two given formats.
Parameters:
format_in - The input format.
format_out - The output format.
cube_string - The cube, in format_in format.
retult_size - The allocated size of the result array.
result - Return parameter for the cube in format_out format.
Return values:
NISSY_OK - The conversion was performed succesfully.
NISSY_ERROR_BUFFER_SIZE - The given buffer is too small for the result.
NISSY_ERROR_INVALID_CUBE - The given cube is invalid.
NISSY_ERROR_INVALID_FORMAT - At least one of the given formats is invalid.
NISSY_ERROR_UNKNOWN - An unknown error occurred.
NISSY_ERROR_NULL_POINTER - At least one of 'format_in', 'format_out' or
'cube_string' arguments is NULL.
*/
int64_t nissy_convert(
const char *format_in,
const char *format_out,
const char *cube_string,
uint64_t result_size,
char result[result_size]
);
/*
Get the cube with the given ep, eo, cp and co values. The values must be in the
ranges specified below, but if the option "fix" is given any values outside its
range will be adjusted before using it. The option "fix" also fixes parity and
orientation issues, resulting always in a solvable cube.
Parameters:
ep - The edge permutation, 0 <= ep <= 479001600 (12!)
eo - The edge orientation, 0 <= eo <= 2047 (2^11)
cp - The corner permutation, 0 <= cp <= 40320 (8!)
co - The corner orientation, 0 <= co <= 2187 (3^7)
options - Other options.
result - The return parameter for the resulting cube, in B32 format.
Return values:
NISSY_OK - The cube was generated succesfully.
NISSY_WARNING_UNSOLVABLE - The resulting cube is unsolvable.
NISSY_ERROR_OPTIONS - One or more of the given parameters is invalid.
*/
int64_t nissy_getcube(
int64_t ep,
int64_t eo,
int64_t cp,
int64_t co,
const char *options,
char result[static NISSY_SIZE_B32]
);
/*
Compute the size of the data generated by nissy_gendata, when called with
the same parameters, or -1 in case of error.
Parameters:
solver - The name of the solver.
Return values:
NISSY_ERROR_INVALID_SOLVER - The given solver is not known.
NISSY_ERROR_NULL_POINTER - The 'solver' argument is null.
NISSY_ERROR_UNKNOWN - An unknown error occurred.
Any value >= 0 - The size of the data, in bytes.
*/
int64_t nissy_datasize(
const char *solver
);
/*
Compute the data for the given solver and store it in generated_data.
Parameters:
solver - The name of the solver.
data_size - The size of the data buffer. It is advised to use nissy_datasize
to check how much memory is needed.
data - The return parameter for the generated data.
Return values:
NISSY_ERROR_INVALID_SOLVER - The given solver is not known.
NISSY_ERROR_NULL_POINTER - The 'solver' argument is null.
NISSY_ERROR_UNKNOWN - An error occurred while generating the data.
Any value >= 0 - The size of the data, in bytes.
*/
int64_t nissy_gendata(
const char *solver,
uint64_t data_size,
char data[data_size]
);
/*
Print information on a data table via the provided callback writer.
Parameters:
data_size - The size of the data buffer.
data - The data to be read.
write - A callback writer with the same signature as printf(3).
Return values:
NISSY_OK - The data is correct.
NISSY_ERROR_DATA - The data contains errors.
*/
int64_t nissy_datainfo(
uint64_t data_size,
const char data[data_size],
void (*write)(const char *, ...)
);
/*
Check that the data is a valid data table for a solver.
Parameters:
data_size - The size of the data buffer.
data - The data for the solver. Can be computed with gendata.
Return values:
NISSY_OK - The data is valid.
NISSY_ERROR_DATA - The data is invalid.
*/
int64_t nissy_checkdata(
uint64_t data_size,
const char data[data_size]
);
/*
Solve the given cube using the given solver and options.
Parameters:
cube - The cube to solver, in B32 format.
solver - The name of the solver.
nissflag - The flags for NISS (linear, inverse, mixed, or combinations).
minmoves - The minimum number of moves for a solution.
maxmoves - The maximum number of moves for a solution.
maxsols - The maximum number of solutions.
optimal - If set to a non-negative value, the maximum number of moves
above the optimal solution length.
data_size - The size of the data buffer.
data - The data for the solver. Can be computed with gendata.
sols_size - The size of the solutions buffer.
sols - The return parameter for the solutions. The solutions are
separated by a '\n' (newline) and a '\0' (NULL character)
terminates the list.
Return values:
NISSY_OK - Cube solved succesfully.
NISSY_ERROR_INVALID_CUBE - The given cube is invalid.
NISSY_ERROR_UNSOLVABLE_CUBE - The given cube is valid, but not solvable with
the given solver.
NISSY_ERROR_OPTIONS - One or more of the given options are invalid.
NISSY_ERROR_INVALID_SOLVER - The given solver is not known.
NISSY_ERROR_NULL_POINTER - The 'solver' argument is null.
Any value >= 0 - The number of solutions found.
*/
int64_t nissy_solve(
const char cube[static NISSY_SIZE_B32],
const char *solver,
uint8_t nissflag,
int8_t minmoves,
int8_t maxmoves,
int64_t maxsolutions,
int8_t optimal,
uint64_t data_size,
const char data[data_size],
uint64_t sols_size,
char sols[sols_size]
);
/*
Set a global logger function used by this library.
Parameters:
write - A callback writer with the same signature as printf(3).
Return values:
NISSY_OK - Logger set succesfully.
NISSY_WARNING_NULL_CALLBACK - The provided callback writer is NULL.
*/
int64_t nissy_setlogger(
void (*logger_function)(const char *, ...)
);
/*
Print an explanation of the given error code via the provided callback writer.
Parameters:
error_code - The error code to be explained. It can be any value returned
by a function in this library, not necessarily an error.
write - A callback writer with the same signature as printf(3).
Must be non-NULL.
Return values:
NISSY_OK - The error code is known.
NISSY_WARNING_NULL_CALLBACK - The provided callback writer is NULL.
NISSY_ERROR_INVALID_CODE - The error code is unknown.
*/
int64_t nissy_explainerror(
int64_t error_code,
void (*write)(const char *, ...)
);
|