void cubepos::randomize(){ int parity= 0; for(int i= 0;i<7;i++){ int j= i+(int)((8-i)*myrand()); if(i!=j){ swap(c[i],c[j]); parity++; } } for(int i= 0;i<11;i++){ int j= i+(int)((12-i)*myrand()); if(i!=j){ swap(e[i],e[j]); parity++; } } if(parity&1) swap(e[10],e[11]); int s= 24; for(int i= 0;i<7;i++){ int a= (int)(3*myrand()); s-= a; c[i]= corner_val(corner_perm(c[i]),a); } c[7]= corner_val(corner_perm(c[7]),s%3); s= 0; for(int i= 0;i<11;i++){ int a= (int)(2*myrand()); e[i]= edge_ori_add(e[i],a); s^= a; } e[11]^= s; }
cubepos::cubepos(int,int,int){ for(int i= 0;i<8;i++) c[i]= corner_val(i,0); for(int i= 0;i<12;i++) e[i]= edge_val(i,0); init(); }
void permute_twist_table() { int f,t,i,o; for (f = 0; f < FACES; f ++) for (t = 0; t < 3; t++) { int m = f * TWISTS + t; int isquarter = (t == 0 || t == 2); int perminc = t + 1; if (m < 0) continue; for (i = 0; i < 4; i++) { int ii = (i + perminc) % 4; for (o = 0; o < 2; o++) { int oo = o; /* new orientation */ if (isquarter) oo ^= edge_change[f]; //bitwise xor (if edge_change=1, oo=¬oo, otherwise oo=oo) edge_trans[m * CUBIES + edge_val (edge_twist_perm[f * 4 +i], o)] = edge_val(edge_twist_perm[f * 4 + ii ], oo); } for (o = 0; o < 3; o++) { int oo = o; /* new orientation */ if (isquarter) oo = (corner_change [f * 4 + i] + oo) % 3; corner_trans [m * CUBIES + corner_val (corner_twist_perm[f * 4 + i], o)] = corner_val(corner_twist_perm[f * 4 + ii ], oo); } } } }
void cubepos::init(){ static int initialized= 0; if(initialized) return; initialized= 1; /*14:*/ #line 287 "../cubepos.w" for(int i= 0;i<CUBIES;i++){ int perm= corner_perm(i); int ori= corner_ori(i); corner_ori_inc[i]= corner_val(perm,(ori+1)%3); corner_ori_dec[i]= corner_val(perm,(ori+2)%3); corner_ori_neg_strip[i]= corner_val(0,(3-ori)%3); mod24[i]= mod24[i+CUBIES]= i; } /*:14*//*28:*/ #line 563 "../cubepos.w" for(int m= 0;m<NMOVES;m++) for(int c= 0;c<CUBIES;c++){ edge_trans[m][c]= c; corner_trans[m][c]= c; } /*:28*//*29:*/ #line 578 "../cubepos.w" for(int f= 0;f<FACES;f++) for(int t= 0;t<3;t++){ int m= f*TWISTS+t; int isquarter= (t==0||t==2); int perminc= t+1; if(m<0) continue; for(int i= 0;i<4;i++){ int ii= (i+perminc)%4; for(int o= 0;o<2;o++){ int oo= o; if(isquarter) oo^= edge_change[f]; edge_trans[m][edge_val(edge_twist_perm[f][i],o)]= edge_val(edge_twist_perm[f][ii],oo); } for(int o= 0;o<3;o++){ int oo= o; if(isquarter) oo= (corner_change[f][i]+oo)%3; corner_trans[m][corner_val(corner_twist_perm[f][i],o)]= corner_val(corner_twist_perm[f][ii],oo); } } } /*:29*//*34:*/ #line 649 "../cubepos.w" for(int i= 0;i<NMOVES;i++) inv_move[i]= TWISTS*(i/TWISTS)+(NMOVES-i-1)%TWISTS; /*:34*//*51:*/ #line 1040 "../cubepos.w" memset(lookup_edge_cubie,INVALID,sizeof(lookup_edge_cubie)); memset(lookup_corner_cubie,INVALID,sizeof(lookup_corner_cubie)); for(int i= 0;i<CUBIES;i++){ const char*tmp= 0; lookup_corner_cubie[parse_cubie(tmp= smcorners[i])-6*6*6]= i; lookup_corner_cubie[parse_cubie(tmp= smcorners[CUBIES+i])-6*6*6]= CUBIES+i; lookup_edge_cubie[parse_cubie(tmp= smedges[i])-6*6]= i; } const char*p= sing_solved; for(int i= 0;i<12;i++){ int cv= parse_edge(p); sm_edge_order[i]= edge_perm(cv); sm_edge_flipped[i]= edge_ori(cv); } for(int i= 0;i<8;i++) sm_corner_order[i]= corner_perm(parse_corner(p)); /*:51*//*60:*/ #line 1238 "../cubepos.w" unsigned char face_to_m[FACES*FACES*FACES]; for(int i= 0;i<6;i++) parse_corner_to_facemap(axis_permute_map[i],face_map[8*i]); for(int i= 0;i<8;i++) parse_corner_to_facemap(axis_negate_map[i],face_map[i]); for(int i= 1;i<6;i++) for(int j= 1;j<8;j++) face_map_multiply(face_map[8*i],face_map[j],face_map[8*i+j]); /*:60*//*61:*/ #line 1251 "../cubepos.w" for(int i= 0;i<M;i++){ int v= face_map[i][0]*36+face_map[i][1]*6+face_map[i][2]; face_to_m[v]= i; } unsigned char tfaces[6]; for(int i= 0;i<M;i++) for(int j= 0;j<M;j++){ face_map_multiply(face_map[i],face_map[j],tfaces); int v= tfaces[0]*36+tfaces[1]*6+tfaces[2]; mm[i][j]= face_to_m[v]; if(mm[i][j]==0) invm[i]= j; } for(int m= 0;m<M;m++){ int is_neg= (m^(m>>3))&1; for(int f= 0;f<6;f++){ for(int t= 0;t<TWISTS;t++){ if(is_neg) move_map[m][f*TWISTS+t]= face_map[m][f]*TWISTS+TWISTS-1-t; else move_map[m][f*TWISTS+t]= face_map[m][f]*TWISTS+t; } } } /*:61*//*62:*/ #line 1281 "../cubepos.w" for(int m= 0;m<M;m++) for(int c= 0;c<CUBIES;c++){ int v= 0; for(int i= 0;i<2;i++) v= 6*v+face_map[m][parse_face(smedges[c][i])]; rot_edge[m][c]= lookup_edge_cubie[v]; v= 0; for(int i= 0;i<3;i++) v= 6*v+face_map[m][parse_face(smcorners[c][i])]; rot_corner[m][c]= mod24[lookup_corner_cubie[v]]; } /*:62*//*73:*/ #line 1467 "../cubepos.w" for(int s= 0;s<CANONSEQSTATES;s++){ int prevface= (s-1)%FACES; canon_seq_mask[s]= (1<<NMOVES)-1; for(int mv= 0;mv<NMOVES;mv++){ int f= mv/TWISTS; int isplus= 0; if(s!=0&&(prevface==f||prevface==f+3)) { canon_seq[s][mv]= INVALID; canon_seq_mask[s]&= ~(1<<mv); }else{ canon_seq[s][mv]= f+1+FACES*isplus; } } canon_seq_mask_ext[s]= canon_seq_mask[s]; } /*:73*/ #line 262 "../cubepos.w" }