static int _generate_corners(uint8_t * cornersOut) { Perm * p = rand_perm(8); srand(time(NULL)); int i; for (i = 0; i < 8; i++) { int piece = p->map[i]; int coset = cube_perm_corner_coset(piece, i); int perm = rand() % 3; if (perm != 0) perm += 3; // perms are 0, 4, and 5 int orientation = symmetry_operation_compose(coset, perm); cornersOut[i] = piece | (orientation << 4); } while (!validate_corner_orientation(cornersOut)) { int sym = (cornersOut[7] >> 4) & 7; sym = symmetry_operation_compose(sym, 4); cornersOut[7] &= 0xf; cornersOut[7] |= (sym << 4); } int parity = perm_parity(p); perm_free(p); return parity; }
int main( int argc, char ** argv) { perm_t * u = perm_new(); assert( u != NULL ); printf("created perm %p\n",u); perm_set_name(u,"ken"); printf("set perm %s\n",perm_get_name(u)); assert( strcmp(perm_get_name(u),"ken") == 0 ); perm_free(u); return 0; }
static void _generate_edges(uint8_t * edgesOut, int cornerParity) { Perm * p = rand_perm(12); if (perm_parity(p) != cornerParity) { rand_change_parity(p); } uint16_t edgeOrientations = 0; int i; for (i = 0; i < 12; i++) { int piece = p->map[i]; int s1, s2; cube_perm_edge_symmetries(piece, i, &s1, &s2); int sym = rand() % 2 == 0 ? s1 : s2; edgesOut[i] = piece | (sym << 4); if (i == 11) { if (!validate_edges(edgesOut)) { int newSym = sym == s1 ? s2 : s1; edgesOut[i] = piece | (newSym << 4); } } } perm_free(p); }
void perm_release (Permissions_t perm) { unsigned h; perm_free (perm_lookup (perm, &h)); }