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 d3db14d63a03c4a313e818ba1435433dd18acba4
parent 3b313daec1614d8a3288b8e20a06dc912a59bda8
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Sat, 13 Jul 2024 08:19:44 +0200

Improved h48set tests

Diffstat:
Msrc/solve_h48.h | 13+++++++++++++
Mtest/104_h48set/h48set_tests.c | 29++++++++++++-----------------
2 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/src/solve_h48.h b/src/solve_h48.h @@ -79,6 +79,7 @@ _static void h48set_destroy(h48set_t *); _static_inline int64_t h48set_lookup(h48set_t *, int64_t); _static_inline void h48set_insert(h48set_t *, int64_t); _static_inline bool h48set_contains(h48set_t *, int64_t); +_static inline int64_t h48set_save(h48set_t *, int64_t *); _static_inline int64_t coord_h48(cube_t, const uint32_t *, uint8_t); _static_inline int64_t coord_h48_edges(cube_t, int64_t, uint8_t, uint8_t); @@ -167,6 +168,18 @@ h48set_contains(h48set_t *set, int64_t x) return i == -1; } +_static int64_t +h48set_save(h48set_t *set, int64_t *a) +{ + int64_t i, j; + + for (i = 0, j = 0; i < set->capacity; i++) + if (set->table[i] != -1) + a[j++] = set->table[i]; + + return j; +} + _static_inline int64_t coord_h48(cube_t c, const uint32_t *cocsepdata, uint8_t h) { diff --git a/test/104_h48set/h48set_tests.c b/test/104_h48set/h48set_tests.c @@ -15,6 +15,7 @@ void h48set_destroy(h48set_t *); int64_t h48set_lookup(h48set_t *, int64_t); void h48set_insert(h48set_t *, int64_t); bool h48set_contains(h48set_t *, int64_t); +int64_t h48set_save(h48set_t *, int64_t *); int compare(const void *x, const void *y) { int64_t a = *(int64_t *)x; @@ -31,39 +32,33 @@ int64_t readl(void) { } void run(void) { - bool f; h48set_t set; - int64_t n, i, j, capacity, mod, *a, u; + int64_t n, i, k, capacity, mod, *a, *b; capacity = readl(); mod = readl(); n = readl(); a = malloc(n * sizeof(int64_t)); + b = malloc(n * sizeof(int64_t)); for (i = 0; i < n; i++) a[i] = readl(); - /* Count unique elements */ - u = 0; - for (i = 0; i < n; i++) { - for (j = 0, f = true; j < i; j++) - f = f && a[i] != a[j]; - u += f; - } - h48set_create(&set, capacity, mod); for (i = 0; i < n; i++) h48set_insert(&set, a[i]); - for (i = 0, j = 0; i < set.capacity; i++) - if (set.table[i] != -1) - a[j++] = set.table[i]; - qsort(a, j, sizeof(int64_t), compare); + k = h48set_save(&set, b); + qsort(b, k, sizeof(int64_t), compare); - printf("%" PRId64 "\n", set.n); - for (i = 0; i < j; i++) - printf("%" PRId64 "\n", a[i]); + printf("%" PRId64 "\n", k); + for (i = 0; i < k; i++) + printf("%" PRId64 "\n", b[i]); + for (i = 0; i < n; i++) + if (!h48set_contains(&set, a[i])) + printf("Set does not contain %" PRId64 "\n", a[i]); h48set_destroy(&set); free(a); + free(b); }