238 lines
5.5 KiB
JavaScript
238 lines
5.5 KiB
JavaScript
|
var cross = (function(createMove, edgeMove, createPrun, setNPerm, getNPerm, Cnk, getPruning) {
|
||
|
var permPrun, flipPrun, ecPrun, fullPrun;
|
||
|
var cmv = [];
|
||
|
var pmul = [];
|
||
|
var fmul = [];
|
||
|
|
||
|
var e1mv = [];
|
||
|
var c1mv = [];
|
||
|
|
||
|
function pmv(a,c){var b=cmv[c][~~(a/24)];return 24*~~(b/384)+pmul[a%24][(b>>4)%24]}
|
||
|
|
||
|
function fmv(b,c){var a=cmv[c][b>>4];return~~(a/384)<<4|fmul[b&15][(a>>4)%24]^a&15}
|
||
|
|
||
|
function i2f(a,c){for(var b=3;0<=b;b--)c[b]=a&1,a>>=1}
|
||
|
|
||
|
function f2i(c){for(var a=0,b=0;4>b;b++)a<<=1,a|=c[b];return a}
|
||
|
|
||
|
function fullmv(idx, move) {
|
||
|
var slice = cmv[move][~~(idx / 384)];
|
||
|
var flip = fmul[idx&15][(slice>>4)%24] ^ slice & 15;
|
||
|
var perm = pmul[(idx>>4)%24][(slice>>4)%24];
|
||
|
return (~~(slice/384)) * 384 + 16 * perm + flip;
|
||
|
}
|
||
|
|
||
|
function init() {
|
||
|
for (var i=0; i<24; i++) {
|
||
|
pmul[i] = [];
|
||
|
}
|
||
|
for (var i=0; i<16; i++) {
|
||
|
fmul[i] = [];
|
||
|
}
|
||
|
var pm1 = [];
|
||
|
var pm2 = [];
|
||
|
var pm3 = [];
|
||
|
for (var i=0; i<24; i++) {
|
||
|
for (var j=0; j<24; j++) {
|
||
|
setNPerm(pm1, i, 4);
|
||
|
setNPerm(pm2, j, 4);
|
||
|
for (var k=0; k<4; k++) {
|
||
|
pm3[k] = pm1[pm2[k]];
|
||
|
}
|
||
|
pmul[i][j] = getNPerm(pm3, 4);
|
||
|
if (i<16) {
|
||
|
i2f(i, pm1);
|
||
|
for (var k=0; k<4; k++) {
|
||
|
pm3[k] = pm1[pm2[k]];
|
||
|
}
|
||
|
fmul[i][j] = f2i(pm3);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
createMove(cmv, 495, getmv);
|
||
|
|
||
|
permPrun = [];
|
||
|
flipPrun = [];
|
||
|
createPrun(permPrun, 0, 11880, 5, pmv);
|
||
|
createPrun(flipPrun, 0, 7920, 6, fmv);
|
||
|
|
||
|
//combMove[comb][m] = comb*, flip*, perm*
|
||
|
//newcomb = comb*, newperm = perm x perm*, newflip = flip x perm* ^ flip*
|
||
|
function getmv(comb, m) {
|
||
|
var arr = [0,0,0,0,0,0,0,0,0,0,0,0];
|
||
|
var r = 4;
|
||
|
for (var i=0; i<12; i++) {
|
||
|
if (comb >= Cnk[11-i][r]) {
|
||
|
comb -= Cnk[11-i][r--];
|
||
|
arr[i] = r<<1;
|
||
|
} else {
|
||
|
arr[i] = -1;
|
||
|
}
|
||
|
}
|
||
|
edgeMove(arr, m);
|
||
|
comb = 0, r = 4;
|
||
|
var t = 0;
|
||
|
var pm = [];
|
||
|
for (var i=0; i<12; i++) {
|
||
|
if (arr[i] >= 0) {
|
||
|
comb += Cnk[11-i][r--];
|
||
|
pm[r] = arr[i] >> 1;
|
||
|
t |= (arr[i] & 1) << (3-r);
|
||
|
}
|
||
|
}
|
||
|
return (comb*24 + getNPerm(pm, 4)) << 4 | t;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function xinit() {
|
||
|
init();
|
||
|
for (var i=0; i<24; i++) {
|
||
|
c1mv[i] = [];
|
||
|
e1mv[i] = [];
|
||
|
for (var m=0; m<6; m++) {
|
||
|
c1mv[i][m] = cornMove(i, m);
|
||
|
var edge = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];
|
||
|
edge[i>>1] = i & 1;
|
||
|
edgeMove(edge, m);
|
||
|
for (var e=0; e<12; e++) {
|
||
|
if (edge[e] >= 0) {
|
||
|
e1mv[i][m] = e<<1|edge[e];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
ecPrun = [];
|
||
|
for (var obj=0; obj<4; obj++) {
|
||
|
var prun = [];
|
||
|
createPrun(prun, (obj+4)*3*24+(obj+4)*2, 576, 5, function(q, m) {return c1mv[~~(q/24)][m]*24+e1mv[q%24][m]});
|
||
|
ecPrun[obj] = prun;
|
||
|
}
|
||
|
function cornMove(corn, m) {
|
||
|
var idx = ~~(corn / 3);
|
||
|
var twst = corn % 3;
|
||
|
var idxt = [
|
||
|
[3, 1, 2, 7, 0, 5, 6, 4],
|
||
|
[0, 1, 6, 2, 4, 5, 7, 3],
|
||
|
[1, 2, 3, 0, 4, 5, 6, 7],
|
||
|
[0, 5, 1, 3, 4, 6, 2, 7],
|
||
|
[4, 0, 2, 3, 5, 1, 6, 7],
|
||
|
[0, 1, 2, 3, 7, 4, 5, 6]];
|
||
|
var twstt = [
|
||
|
[2, 0, 0, 1, 1, 0, 0, 2],
|
||
|
[0, 0, 1, 2, 0, 0, 2, 1],
|
||
|
[0, 0, 0, 0, 0, 0, 0, 0],
|
||
|
[0, 1, 2, 0, 0, 2, 1, 0],
|
||
|
[1, 2, 0, 0, 2, 1, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 0, 0, 0]];
|
||
|
twst = (twst + twstt[m][idx]) % 3;
|
||
|
return idxt[m][idx]*3+twst;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//e4perm, e4flip, e1, c1
|
||
|
//obj: -1:only cross.
|
||
|
// i-4: end when e==i*2, c==i*3
|
||
|
function idaxcross(q,t,e,c,obj,l,lm,sol){
|
||
|
if(l==0){
|
||
|
return q==0 && t==0 && e==(obj+4)*2 && c==(obj+4)*3;
|
||
|
}else{
|
||
|
if(getPruning(permPrun, q)>l || getPruning(flipPrun, t) > l || getPruning(ecPrun[obj], c*24+e)>l) return false;
|
||
|
var p,s,ex,cx,a,m;
|
||
|
for(m=0;m<6;m++){
|
||
|
if(m!=lm && m!=lm-3){
|
||
|
p=q; s=t; ex=e; cx=c;
|
||
|
for(a=0;a<3;a++){
|
||
|
p=pmv(p, m);
|
||
|
s=fmv(s, m);
|
||
|
ex=e1mv[ex][m];
|
||
|
cx=c1mv[cx][m];
|
||
|
if(idaxcross(p,s,ex,cx,obj,l-1,m,sol)) {
|
||
|
sol.push("FRUBLD".charAt(m) + " 2'".charAt(a));
|
||
|
return(true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//e4perm, e4flip
|
||
|
function idacross(q,t,l,lm,sol){
|
||
|
if(l==0){
|
||
|
return q==0 && t==0;
|
||
|
}else{
|
||
|
if(getPruning(permPrun, q) > l || getPruning(flipPrun, t) > l) return false;
|
||
|
var p,s,a,m;
|
||
|
for(m=0;m<6;m++){
|
||
|
if(m!=lm && m!=lm-3){
|
||
|
p=q; s=t;
|
||
|
for(a=0;a<3;a++){
|
||
|
p=pmv(p, m);
|
||
|
s=fmv(s, m);
|
||
|
if(idacross(p,s,l-1,m,sol)) {
|
||
|
sol.push("FRUBLD".charAt(m) + " 2'".charAt(a));
|
||
|
return(true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
var faceStr = ["D", "U", "L", "R", "F", "B"];
|
||
|
var moveIdx = ["FRUBLD", "FLDBRU", "FDRBUL", "FULBDR", "URBDLF", "DRFULB"]
|
||
|
var rotIdx = [" ", "z2", "z'", "z ", "x'", "x "];
|
||
|
|
||
|
var curScramble;
|
||
|
|
||
|
function fullInit() {
|
||
|
init();
|
||
|
fullPrun = [];
|
||
|
createPrun(fullPrun, 0, 190080, 7, fullmv, 6, 3, 6);
|
||
|
}
|
||
|
|
||
|
function getEasyCross(length) {
|
||
|
fullInit();
|
||
|
if (length > 8) {
|
||
|
length = 8;
|
||
|
}
|
||
|
var cases = mathlib.rn([1, 16, 174, 1568, 11377, 57758, 155012, 189978, 190080][length]) + 1;
|
||
|
var i;
|
||
|
for (i=0; i<190080; i++) {
|
||
|
if (getPruning(fullPrun, i) <= length && --cases == 0) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
var comb = ~~(i / 384);
|
||
|
var perm = (i >> 4) % 24;
|
||
|
var flip = i & 15;
|
||
|
|
||
|
var arrp = [];
|
||
|
var arrf = [];
|
||
|
var pm = [];
|
||
|
var fl = [];
|
||
|
i2f(flip, fl);
|
||
|
setNPerm(pm, perm, 4);
|
||
|
var r = 4;
|
||
|
var map = [7,6,5,4,10,9,8,11,3,2,1,0];
|
||
|
for (i=0; i<12; i++) {
|
||
|
if (comb >= Cnk[11-i][r]) {
|
||
|
comb -= Cnk[11-i][r--];
|
||
|
arrp[map[i]] = pm[r];
|
||
|
arrf[map[i]] = fl[r];
|
||
|
} else {
|
||
|
arrp[map[i]] = arrf[map[i]] = -1;
|
||
|
}
|
||
|
}
|
||
|
return [arrp, arrf];
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
getEasyCross: getEasyCross
|
||
|
}
|
||
|
})(mathlib.createMove, mathlib.edgeMove, mathlib.createPrun, mathlib.setNPerm, mathlib.getNPerm, mathlib.Cnk, mathlib.getPruning);
|