From 66c1c11ec13d362ddfb1b5f6abe8127969c0ad29 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 5 Jul 2024 22:16:44 +0200 Subject: Finished getcube --- src/cube_generic.h | 37 ++++++++++++++++++++++++------------- src/utils.h | 6 ++++-- 2 files changed, 28 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/cube_generic.h b/src/cube_generic.h index c40844d..fe36f90 100644 --- a/src/cube_generic.h +++ b/src/cube_generic.h @@ -185,34 +185,45 @@ frommoves(const char *buf) _static void getcube_fix(int64_t *ep, int64_t *eo, int64_t *cp, int64_t *co) { - uint8_t e[12], c[8], aux; + uint8_t e[12], c[8], coarr[8]; - *ep %= _12f; - *eo %= _2p11; - *cp %= _8f; - *cp %= _3p7; + *ep = (*ep % _12f + _12f) % _12f; + *eo = (*eo % _2p11 + _2p11) % _2p11; + *cp = (*cp % _8f + _8f) % _8f; + *co = (*cp % _3p7 + _3p7) % _3p7; indextoperm(*ep, 12, e); indextoperm(*cp, 8, c); if (permsign(e, 12) != permsign(c, 8)) { - aux = c[0]; - c[0] = c[1]; - c[1] = aux; + _swap(c[0], c[1]); *cp = permtoindex(c, 8); + + sumzerotodigits(*co, 8, 3, coarr); + _swap(coarr[0], coarr[1]); + *co = digitstosumzero(coarr, 8, 3); } } _static cube_t getcube(int64_t ep, int64_t eo, int64_t cp, int64_t co) { - uint8_t e[12], c[8]; + uint8_t i, earr[12], carr[8], eoarr[12], coarr[8]; - indextoperm(ep, 12, e); - indextoperm(cp, 8, c); + sumzerotodigits(eo, 12, 2, eoarr); + DBG_ASSERT(eoarr[0] != _error, zero, "Error making EO"); + indextoperm(ep, 12, earr); + DBG_ASSERT(earr[0] != _error, zero, "Error making EP"); + for (i = 0; i < 12; i++) + earr[i] |= eoarr[i] << _eoshift; - /* TODO: orientation */ + sumzerotodigits(co, 8, 3, coarr); + DBG_ASSERT(coarr[0] != _error, zero, "Error making CO"); + indextoperm(cp, 8, carr); + DBG_ASSERT(carr[0] != _error, zero, "Error making CP"); + for (i = 0; i < 8; i++) + carr[i] |= coarr[i] << _coshift; - return cubefromarray(c, e); + return cubefromarray(carr, earr); } _static cube_t diff --git a/src/utils.h b/src/utils.h index 3d35437..021ca75 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1,3 +1,5 @@ +#define _swap(x, y) do { x ^= y; y ^= x; x ^= y; } while (0) + _static int64_t factorial(int64_t); _static bool isperm(uint8_t *, int64_t); _static int64_t permtoindex(uint8_t *, int64_t); @@ -138,7 +140,7 @@ digitstosumzero(uint8_t *a, uint8_t n, uint8_t b) return -1; } - for (i = 1, ret = 0, p = 1; i < n; i++, p *= (int64_t)b) { + for (i = 1, ret = 0, p = 1, sum = 0; i < n; i++, p *= (int64_t)b) { if (a[i] >= b) { LOG("Error: digit %" PRIu8 " larger than maximum" " (b=%" PRIu8 "\n", a[i], b); @@ -168,7 +170,7 @@ sumzerotodigits(int64_t d, uint8_t n, uint8_t b, uint8_t *a) goto digitstosumzero_error; } - for (i = 1; i < n; i++, d /= (int64_t)b) { + for (i = 1, sum = 0; i < n; i++, d /= (int64_t)b) { a[i] = (uint8_t)(d % (int64_t)b); sum += a[i]; } -- cgit v1.3