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

coorddata_dr.c (1252B)


      1 #include "../test.h"
      2 
      3 #define POW_3_7 2187
      4 #define BOUND   (64430 * POW_3_7 / 100)
      5 #define TGROUP  UINT64_C(4278190335)
      6 
      7 cube_t transform(cube_t, uint8_t);
      8 uint64_t coordinate_dr_coord(cube_t, const unsigned char *);
      9 cube_t coordinate_dr_cube(uint64_t, const unsigned char *);
     10 uint64_t coordinate_dr_gendata(unsigned char *);
     11 
     12 void run(void) {
     13 	bool found;
     14 	uint64_t t;
     15 	char str[STRLENMAX];
     16 	unsigned char *data;
     17 	size_t size;
     18 	cube_t cube;
     19 	uint64_t coord, coord2;
     20 
     21 	size = coordinate_dr_gendata(NULL);
     22 	data = malloc(size);
     23 	coordinate_dr_gendata(data);
     24 
     25 	for (coord = 0; coord < BOUND; coord++) {
     26 		cube = coordinate_dr_cube(coord, data);
     27 
     28 		if (!isconsistent(cube)) {
     29 			printf("Error: invcoord of %" PRId64
     30 			    " is not consistent\n", coord);
     31 			goto cleanup;
     32 		}
     33 
     34 		for (t = 0, found = false; t < 48; t++) {
     35 			if (!((UINT64_C(1) << t) & TGROUP))
     36 				continue;
     37 
     38 			coord2 = coordinate_dr_coord(transform(cube, t), data);
     39 			if (coord == coord2) {
     40 				found = true;
     41 				break;
     42 			}
     43 		}
     44 
     45 		if (!found) {
     46 			printf("Error: invcoord of %" PRId64 " returns %"
     47 			    PRId64 " with cube:\n", coord, coord2);
     48 			writecube("H48", cube, STRLENMAX, str);
     49 			printf("%s\n", str);
     50 			goto cleanup;
     51 		}
     52 	}
     53 
     54 	printf("All good\n");
     55 
     56 cleanup:
     57 	free(data);
     58 }