Best JavaScript code snippet using testcafe
coordmoves.js
Source:coordmoves.js  
1var movesDef = {2    "U" : [[0,0,0,0, 0,0,0,0], [1,2,3,0, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [1,2,3,0, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],3    "U2": [[0,0,0,0, 0,0,0,0], [2,3,0,1, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [2,3,0,1, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],4    "U'": [[0,0,0,0, 0,0,0,0], [3,0,1,2, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [3,0,1,2, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],5    "R" : [[0,1,2,0, 0,2,1,0], [0,5,1,3, 4,6,2,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,5,2,3, 4,9,1,7, 8,6,10,11], [0,1,2,3,4,5]],6    "R2": [[0,0,0,0, 0,0,0,0], [0,6,5,3, 4,2,1,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,9,2,3, 4,6,5,7, 8,1,10,11], [0,1,2,3,4,5]],       7    "R'": [[0,1,2,0, 0,2,1,0], [0,2,6,3, 4,1,5,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,6,2,3, 4,1,9,7, 8,5,10,11], [0,1,2,3,4,5]],         8    "F" : [[0,0,1,2, 0,0,2,1], [0,1,6,2, 4,5,7,3], [0,0,1,0, 0,0,1,1, 0,0,1,0], [0,1,6,3, 4,5,10,2, 8,9,7,11], [0,1,2,3,4,5]],         9    "F2": [[0,0,0,0, 0,0,0,0], [0,1,7,6, 4,5,3,2], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,10,3, 4,5,7,6, 8,9,2,11], [0,1,2,3,4,5]],         10    "F'": [[0,0,1,2, 0,0,2,1], [0,1,3,7, 4,5,2,6], [0,0,1,0, 0,0,1,1, 0,0,1,0], [0,1,7,3, 4,5,2,10, 8,9,6,11], [0,1,2,3,4,5]], 11    "L" : [[2,0,0,1, 1,0,0,2], [3,1,2,7, 0,5,6,4], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,7, 3,5,6,11, 8,9,10,4], [0,1,2,3,4,5]],                  12    "L2": [[0,0,0,0, 0,0,0,0], [7,1,2,4, 3,5,6,0], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,11, 7,5,6,4, 8,9,10,3], [0,1,2,3,4,5]],         13    "L'": [[2,0,0,1, 1,0,0,2], [4,1,2,0, 7,5,6,3], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,4, 11,5,6,3, 8,9,10,7], [0,1,2,3,4,5]],                  14    "D" : [[0,0,0,0, 0,0,0,0], [0,1,2,3, 7,4,5,6], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 11,8,9,10], [0,1,2,3,4,5]],15    "D2": [[0,0,0,0, 0,0,0,0], [0,1,2,3, 6,7,4,5], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 10,11,8,9], [0,1,2,3,4,5]],         16    "D'": [[0,0,0,0, 0,0,0,0], [0,1,2,3, 5,6,7,4], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 9,10,11,8], [0,1,2,3,4,5]],         17    "B" : [[1,2,0,0, 2,1,0,0], [4,0,2,3, 5,1,6,7], [1,0,0,0, 1,1,0,0, 1,0,0,0], [4,1,2,3, 8,0,6,7, 5,9,10,11], [0,1,2,3,4,5]],         18    "B2": [[0,0,0,0, 0,0,0,0], [5,4,2,3, 1,0,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [8,1,2,3, 5,4,6,7, 0,9,10,11], [0,1,2,3,4,5]],         19    "B'": [[1,2,0,0, 2,1,0,0], [1,5,2,3, 0,4,6,7], [1,0,0,0, 1,1,0,0, 1,0,0,0], [5,1,2,3, 0,8,6,7, 4,9,10,11], [0,1,2,3,4,5]],20    "M" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [1,0,1,0,0,0,0,0,1,0,1,0], [2,1,10,3,4,5,6,7,0,9,8,11],[1,5,2,0,4,3]],21    "M2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [10,1,8,3,4,5,6,7,2,9,0,11],[5,3,2,1,4,0]],         22    "M'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [1,0,1,0,0,0,0,0,1,0,1,0], [8,1,0,3,4,5,6,7,10,9,2,11],[3,0,2,5,4,1]],         23    "E" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,5,6,7,4,8,9,10,11], [0,4,1,2,3,5]],24    "E2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5,8,9,10,11], [0,3,4,1,2,5]],25    "E'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,7,4,5,6,8,9,10,11], [0,2,3,4,1,5]],26    "S" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,1,0,1,0,0,0,0,0,1,0,1], [0,9,2,1,4,5,6,7,8,11,10,3], [2,1,5,3,0,4]],27    "S2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [0,11,2,9,4,5,6,7,8,3,10,1], [5,1,4,3,2,0]],28    "S'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,1,0,1,0,0,0,0,0,1,0,1], [0,3,2,11,4,5,6,7,8,1,10,9], [4,1,0,3,5,2]],29    "u" : [[0,0,0,0,0,0,0,0], [1,2,3,0,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [1,2,3,0,5,6,7,4,8,9,10,11], [0,4,1,2,3,5]],30    "u2": [[0,0,0,0,0,0,0,0], [2,3,0,1,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5,8,9,10,11], [0,3,4,1,2,5]],31    "u'": [[0,0,0,0,0,0,0,0], [3,0,1,2,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [3,0,1,2,7,4,5,6,8,9,10,11], [0,2,3,4,1,5]],32    "r" : [[0,1,2,0,0,2,1,0], [0,5,1,3,4,6,2,7], [1,0,1,0,0,0,0,0,1,0,1,0], [8,5,0,3,4,9,1,7,10,6,2,11], [3,0,2,5,4,1]],         33    "r2": [[0,0,0,0,0,0,0,0], [0,6,5,3,4,2,1,7], [0,0,0,0,0,0,0,0,0,0,0,0], [10,9,8,3,4,6,5,7,2,1,0,11], [5,3,2,1,4,0]],         34    "r'": [[0,1,2,0,0,2,1,0], [0,2,6,3,4,1,5,7], [1,0,1,0,0,0,0,0,1,0,1,0], [2,6,10,3,4,1,9,7,0,5,8,11], [1,5,2,0,4,3]],        35    "f" : [[0,0,1,2,0,0,2,1], [0,1,6,2,4,5,7,3], [0,1,1,1,0,0,1,1,0,1,1,1], [0,9,6,1,4,5,10,2,8,11,7,3], [2,1,5,3,0,4]],36    "f2": [[0,0,0,0,0,0,0,0], [0,1,7,6,4,5,3,2], [0,0,0,0,0,0,0,0,0,0,0,0], [0,11,10,9,4,5,7,6,8,3,2,1], [5,1,4,3,2,0]],37    "f'": [[0,0,1,2,0,0,2,1], [0,1,3,7,4,5,2,6], [0,1,1,1,0,0,1,1,0,1,1,1], [0,3,7,11,4,5,2,10,8,1,6,9], [4,1,0,3,5,2]],38    "l" : [[2,0,0,1,1,0,0,2], [3,1,2,7,0,5,6,4], [1,0,1,0,0,0,0,0,1,0,1,0], [2,1,10,7,3,5,6,11,0,9,8,4], [1,5,2,0,4,3]],39    "l2": [[0,0,0,0,0,0,0,0], [7,1,2,4,3,5,6,0], [0,0,0,0,0,0,0,0,0,0,0,0], [10,1,8,11,7,5,6,4,2,9,0,3], [5,3,2,1,4,0]],40    "l'": [[2,0,0,1,1,0,0,2], [4,1,2,0,7,5,6,3], [1,0,1,0,0,0,0,0,1,0,1,0], [8,1,0,4,11,5,6,3,10,9,2,7], [3,0,2,5,4,1]],41    "b" : [[1,2,0,0,2,1,0,0], [4,0,2,3,5,1,6,7], [1,1,0,1,1,1,0,0,1,1,0,1], [4,3,2,11,8,0,6,7,5,1,10,9], [4,1,0,3,5,2]],42    "b2": [[0,0,0,0,0,0,0,0], [5,4,2,3,1,0,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [8,11,2,9,5,4,6,7,0,3,10,1], [5,1,4,3,2,0]],43    "b'": [[1,2,0,0,2,1,0,0], [1,5,2,3,0,4,6,7], [1,1,0,1,1,1,0,0,1,1,0,1], [5,9,2,1,0,8,6,7,4,11,10,3], [2,1,5,3,0,4]],44    "d" : [[0,0,0,0,0,0,0,0], [0,1,2,3,7,4,5,6], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,7,4,5,6,11,8,9,10], [0,2,3,4,1,5]],45    "d2": [[0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5], [0,0,0,0,0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5,10,11,8,9], [0,3,4,1,2,5]],46    "d'": [[0,0,0,0,0,0,0,0], [0,1,2,3,5,6,7,4], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,5,6,7,4,9,10,11,8], [0,4,1,2,3,5]],47    "x" : [[2,1,2,1, 1,2,1,2], [4,5,1,0, 7,6,2,3], [1,0,1,0,0,0,0,0,1,0,1,0], [8,5,0,4,11,9,1,3,10,6,2,7], [3,0,2,5,4,1]],         48    "x2": [[0,0,0,0, 0,0,0,0], [7,6,5,4, 3,2,1,0], [0,0,0,0,0,0,0,0,0,0,0,0], [10,9,8,11,7,6,5,4,2,1,0,3], [5,3,2,1,4,0]],         49    "x'": [[2,1,2,1, 1,2,1,2], [3,2,6,7, 0,1,5,4], [1,0,1,0,0,0,0,0,1,0,1,0], [2,6,10,7,3,1,9,11,0,5,8,4], [1,5,2,0,4,3]],50    "y" : [[0,0,0,0,0,0,0,0], [1,2,3,0,5,6,7,4], [0,0,0,0,1,1,1,1,0,0,0,0], [1,2,3,0,5,6,7,4,9,10,11,8], [0,4,1,2,3,5]],         51    "y2": [[0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5], [0,0,0,0,0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5,10,11,8,9], [0,3,4,1,2,5]],         52    "y'": [[0,0,0,0,0,0,0,0], [3,0,1,2,7,4,5,6], [0,0,0,0,1,1,1,1,0,0,0,0], [3,0,1,2,7,4,5,6,11,8,9,10], [0,2,3,4,1,5]],53    "z" : [[1,2,1,2,2,1,2,1], [1,5,6,2,0,4,7,3], [1,1,1,1,1,1,1,1,1,1,1,1], [5,9,6,1,0,8,10,2,4,11,7,3], [2,1,5,3,0,4]],54    "z2": [[0,0,0,0,0,0,0,0], [5,4,7,6,1,0,3,2], [0,0,0,0,0,0,0,0,0,0,0,0], [8,11,10,9,5,4,7,6,0,3,2,1], [5,1,4,3,2,0]],55    "z'": [[1,2,1,2,2,1,2,1], [4,0,3,7,5,1,2,6], [1,1,1,1,1,1,1,1,1,1,1,1], [4,3,7,11,8,0,2,10,5,1,6,9], [4,1,0,3,5,2]]56};57var moveAxes = {58    "U" : 0, "U2": 0, "U'": 0,59    "R" : 1, "R2": 1, "R'": 1, 60    "F" : 2, "F2": 2, "F'": 2, 61    "L" : 1, "L2": 1, "L'": 1, 62    "D" : 0, "D2": 0, "D'": 0, 63    "B" : 2, "B2": 2, "B'": 2,64    "M" : 1, "M2": 1, "M'": 1, 65    "E" : 0, "E2": 0, "E'": 0,66    "S" : 2, "S2": 2, "S'": 2,67    "u" : 0, "u2": 0, "u'": 0,68    "r" : 1, "r2": 1, "r'": 1, 69    "f" : 2, "f2": 2, "f'": 2,70    "l" : 1, "l2": 1, "l'": 1,71    "b" : 2, "b2": 2, "b'": 2,72    "d" : 0, "d2": 0, "d'": 0,73    "x" : 1, "x2": 1, "x'": 1,74    "y" : 0, "y2": 0, "y'": 0,75    "z" : 2, "z2": 2, "z'": 2 76};77var trivialFollowSet = {78    "U" : 0, "U2": 0, "U'": 0,79    "R" : 1, "R2": 1, "R'": 1, 80    "F" : 2, "F2": 2, "F'": 2, 81    "L" : 3, "L2": 3, "L'": 3, 82    "D" : 4, "D2": 4, "D'": 4, 83    "B" : 5, "B2": 5, "B'": 5,84    "M" : 6, "M2": 6, "M'": 6, 85    "E" : 7, "E2": 7, "E'": 7,86    "S" : 8, "S2": 8, "S'": 8,87    "u" : 9, "u2": 9, "u'": 9,88    "r" : 10, "r2": 10, "r'": 10, 89    "f" : 11, "f2": 11, "f'": 11,90    "l" : 12, "l2": 12, "l'": 12,91    "b" : 13, "b2": 13, "b'": 13,92    "d" : 14, "d2": 14, "d'": 14,93    "x" : 15, "x2": 15, "x'": 15,94    "y" : 16, "y2": 16, "y'": 16,95    "z" : 17, "z2": 17, "z'": 1796};97var isTrivialMove = function (move, moveset) {98    for (let i=moveset.length-1; i>=0; i--) {99        if (moveAxes[moveset[i]] === moveAxes[move]) {100            if (trivialFollowSet[moveset[i]] >= trivialFollowSet[move]) {101                return true; // Trivial turn102            }103        } 104        else {            105            return false; // Preceded by turn on a different axis106        }107    }    108    return false; // No trivial turns109};110var isAllowedMove = function (move, moveset) {111    if (isTrivialMove(move, moveset)) {112        return false;113    }114    if (maxMoveNumbers[move]<0) {115        return true;116    }117    count = 0;118    for (let i=moveset.length-1; i>=0; i--) {119        if (moveset[i] === move) {120            count++121        }122        if (count >= maxMoveNumbers[move]) {123            return false124        }125    }    126    return true; // No trivial turns127};128var applyRawMoveOrientation = function (oriState, moveOriEffect, movePermEffect, nOrientations) {129    let newState = applyRawMovePermutation(oriState, movePermEffect);130    for (let i=0; i < moveOriEffect.length; i++) {131        newState[i] = (newState[i] + moveOriEffect[i]) % nOrientations;132    }   133    return newState;134};135var applyRawMovePermutation = function (permState, movePermEffect) {136    let newState = permState.slice();137    for (let i=0; i < movePermEffect.length; i++) {138        newState[movePermEffect[i]] = permState[i];139    }140    return newState;    141};142var coord333HashFunction = {143    0: function (state) {144        // Corner orientation coordinate145        // Input is [CO]146        // Est size = 2,187147        let coord = 0;148        for (let i=0; i<7; i++) {149            // corner orientation of all but last corner150            coord = coord*3 + state[0][i];151        }        152        return coord;153    },154    1: function (state) {155        // Edge orientation coordinate156        // Input is [EO]157        // Est size = 2,048158        let coord = 0;159        for (let i=0; i<11; i++) {160            // edge orientation of all but last edge161            coord = coord*2 + state[0][i];162        }163        return coord;164    },165    2: function (state) {166        // Corner Permutation167        // Input is [CP]168        // Est size = 40,320169        let coord = 0;170        for (let i=0; i<8; i++) {171            // corner permutation172            coord = coord*9 + state[0][i];173        }        174        return coord;175    },176    3: function (state) {177        // Full orientation coordinate178        // Input is [CO, EO]179        // Est size = 4,478,976180        let coord = 0;181        for (let i=0; i<7; i++) {182            // corner orientation183            coord = coord*3 + state[0][i];184        }185        for (let i=0; i<11; i++) {186            // edge orientation187            coord = coord*2 + state[1][i];188        }189        return coord;190    },191    4: function (state) {192        // Full corner coordinate193        // Input is [CO, CP]194        // Est size = 11,022,480195        let coord = 0;196        for (let i=0; i<7; i++) {197            // corner orientation of all but last corner198            coord = coord*3 + state[0][i];199        }200        for (let i=0; i<7; i++) {201            // home position of corner in each position202            coord = coord*9 + state[1][i];203        }        204        return coord;205    },206    5: function (state) {207        // First four edge coordinate (U edges)208        // Input is [EO, EP]209        // Est size = 190,080210        let coord = 0;211        for (let i=0; i<12; i++) {212            // For each position, if the edge is one of the 4 edges213            coord *= 26;214            if (state[1][i] <= 4) {215                // Encode the position and orientation of the edge216                coord += state[1][i]*2 + state[0][i];                217            }218        }            219        return coord;220    },221    6: function (state) {222        // Second four edge coordinate (E edges)223        // Input is [EO, EP]224        // Est size = 190,080225        let coord = 0;226        for (let i=0; i<12; i++) {227            // For each position, if the edge is one of the 4 edges228            coord *= 26;229            if (state[1][i] > 4 && state[1][i] <= 8) {230                // Encode the position and orientation of the edge231                coord += state[1][i]*2 + state[0][i];                232            }233        }            234        return coord;235    },236    7: function (state) {237        // Third four edge coordinate (D edges)238        // Input is [EO, EP]239        // Est size = 190,080240        let coord = 0;241        for (let i=0; i<12; i++) {242            // For each position, if the edge is one of the 4 edges243            coord *= 26;244            if (state[1][i] > 8) {245                // Encode the position and orientation of the edge246                coord += state[1][i]*2 + state[0][i];                247            }248        }            249        return coord;250    },    251    8: function (state) {252        // Full centre coordinate253        // Input is [centres]254        // Est size = 24255        let coord = 0;256        for (let i=0; i<5; i++) {257            // positions of 5 of the centres258            coord = coord*7 + state[0][i];259        }        260        return coord;261    },262    9: function (state) {263        // First four edge position coordinate 264        // Input is [EP]265        // Est size = 11,880266        let coord = 0;267        for (let i=0; i<12; i++) {268            // For each position, if the edge is one of the 4 edges269            coord *= 13;270            if (state[0][i] <= 4) {271                // Encode the position and orientation of the edge272                coord += state[0][i];               273            }274        }            275        return coord;276    },277    10: function (state) {278        // Second four edge position coordinate 279        // Input is [EP]280        // Est size = 11,880281        let coord = 0;282        for (let i=0; i<12; i++) {283            // For each position, if the edge is one of the 4 edges284            coord *= 13;285            if (state[0][i] > 4 && state[0][i] <= 8) {286                // Encode the position and orientation of the edge287                coord += state[0][i];               288            }289        }            290        return coord;291    },292    11: function (state) {293        // Third four edge position coordinate 294        // Input is [EP]295        // Est size = 11,880296        let coord = 0;297        for (let i=0; i<12; i++) {298            // For each position, if the edge is one of the 4 edges299            coord *= 13;300            if (state[0][i] > 8) {301                // Encode the position and orientation of the edge302                coord += state[0][i];               303            }304        }            305        return coord;306    },307    12: function (state) {308        // Second four corner position coordinate 309        // Input is [CP]310        // Est size = 1,680311        let coord = 0;312        for (let i=0; i<8; i++) {313            // For each position, if the corner is one of the 4 corners314            coord *= 9;315            if (state[0][i] <= 4) {316                // Encode the position and orientation of the corner317                coord += state[0][i];               318            }319        }            320        return coord;321    },322    13: function (state) {323        // Second four corner position coordinate 324        // Input is [CP]325        // Est size = 1,680326        let coord = 0;327        for (let i=0; i<8; i++) {328            // For each position, if the corner is one of the 4 corners329            coord *= 9;330            if (state[0][i] > 4) {331                // Encode the position and orientation of the corner332                coord += state[0][i];               333            }334        }            335        return coord;336    }337};338var coord333RawStateMap = {339    0: function (state) {340        // Corner orientation coordinate341        // Output is [CO]342        return [state[0]];343    },344    1: function (state) {345        // Edge orientation coordinate346        // Output is [EO]347        return [state[2]];348    },349    2: function (state) {350        // Corner permutation coordinate351        // Output is [CP]352        return [state[1]];353    },354    3: function (state) {355        // Full orientation coordinate356        // Output is [CO, EO]357        return [state[0], state[2]];358    },359    4: function (state) {360        // Full corner coordinate361        // Output is [CO, CP]362        return [state[0], state[1]];363    },364    5: function (state) {365        // First four edge coordinate (U edges)366        // Output is [EO, EP]367        return [state[2], state[3]];368    },369    6: function (state) {370        // Second four edge coordinate (E edges)371        // Output is [EO, EP]372        return [state[2], state[3]];373    },374    7: function (state) {375        // Third four edge coordinate (D edges)376        // Output is [EO, EP]377        return [state[2], state[3]];378    },379    8: function (state) {380        // Full centre coordinate381        // Output is [centres]382        return [state[4]];383    },384    9: function (state) {385        // First four edge position coordinate 386        // Input is [EP]387        return [state[3]];388    },389    10: function (state) {390        // Second four edge position coordinate 391        // Input is [EP]392        return [state[3]];393    },394    11: function (state) {395        // Third four edge position coordinate 396        // Input is [EP]397        return [state[3]];398    },399    12: function (state) {400        // First four corner position coordinate 401        // Input is [CP]402        return [state[1]];403    },404    13: function (state) {405        // Second four corner position coordinate 406        // Input is [CP]407        return [state[1]];408    }409};410var coord333MoveFunction = {411    0: function (state, move) {412        // Corner orientation coordinate413        // Input is [CO]414        return [415            applyRawMoveOrientation(state[0], move[0], move[1], 3),416        ];417    },418    1: function (state, move) {419        // Edge orientation coordinate420        // Input is [EO]421        return [422            applyRawMoveOrientation(state[0], move[2], move[3], 2),423        ];424    },425    2: function (state, move) {426        // Corner permutation coordinate427        // Output is [CP]428        return [429            applyRawMovePermutation(state[0], move[1])430        ];431    },432    3: function (state, move) {433        // Full orientation coordinate434        // Input is [CO, EO]435        return [436            applyRawMoveOrientation(state[0], move[0], move[1], 3),437            applyRawMoveOrientation(state[1], move[2], move[3], 2)438        ];439    },    440    4: function (state, move) {441        // Full corner coordinate442        // Input is [CO, CP]443        return [444            applyRawMoveOrientation(state[0], move[0], move[1], 3),445            applyRawMovePermutation(state[1], move[1])446        ];447    },448    5: function (state, move) {449        // First four edge coordinate (U edges)450        // Input is [EO, EP]451        return [452            applyRawMoveOrientation(state[0], move[2], move[3], 2),453            applyRawMovePermutation(state[1], move[3])454        ];455    },456    6: function (state, move) {457        // Second four edge coordinate (E edges)458        // Input is [EO, EP]459        return [460            applyRawMoveOrientation(state[0], move[2], move[3], 2),461            applyRawMovePermutation(state[1], move[3])462        ];463    },464    7: function (state, move) {465        // Third four edge coordinate (D edges)466        // Input is [EO, EP]467        return [468            applyRawMoveOrientation(state[0], move[2], move[3], 2),469            applyRawMovePermutation(state[1], move[3])470        ];471    },472    8: function (state, move) {473        // Full centre coordinate474        // Input is [centres]475        return [476            applyRawMovePermutation(state[0], move[4])477        ];478    },479    9: function (state, move) {480        // First four edge position coordinate 481        // Input is [EP]482        return [483            applyRawMovePermutation(state[0], move[3])484        ];485    },486    10: function (state, move) {487        // Second four edge position coordinate 488        // Input is [EP]489        return [490            applyRawMovePermutation(state[0], move[3])491        ];492    },493    11: function (state, move) {494        // Third four edge position coordinate 495        // Input is [EP]496        return [497            applyRawMovePermutation(state[0], move[3])498        ];499    },500    12: function (state, move) {501        // First four corner position coordinate 502        // Input is [CP]503        return [504            applyRawMovePermutation(state[0], move[1])505        ];506    },507    13: function (state, move) {508        // Second four corner position coordinate 509        // Input is [CP]510        return [511            applyRawMovePermutation(state[0], move[1])512        ];513    }514};515var state2coord = function (coordIndex, state) {516    return coord333HashFunction[coordIndex](coord333RawStateMap[coordIndex](state))517};518var state2coordCombined = function (coordIndices, state) {519    return [state2coord(coordIndices[0], state),520            state2coord(coordIndices[1], state)]521};522var coord333Names = {523    0: "CO",524    1: "EO",525    2: "CP",526    3: "Orientation",527    4: "Corners",528    5: "Partial Edges - U layer",529    6: "Partial Edges - E slice",530    7: "Partial Edges - D layer",531    8: "Centres",532    9: "Partial EP - U layer",533    10: "Partial EP - E slice",534    11: "Partial EP - D layer",535    12: "Partial CP - U layer",536    13: "Partial CP - D layer"...kociemba.js
Source:kociemba.js  
1"use strict";2var utils = require('./utils.js');3var nChooseK = utils.nChooseK;4var tic = utils.tic;5var toc = utils.toc;6var movesDef = {7    "U" : [[0,0,0,0, 0,0,0,0], [1,2,3,0, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [1,2,3,0, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],8    "U2": [[0,0,0,0, 0,0,0,0], [2,3,0,1, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [2,3,0,1, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],9    "U'": [[0,0,0,0, 0,0,0,0], [3,0,1,2, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [3,0,1,2, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],10    "R" : [[0,1,2,0, 0,2,1,0], [0,5,1,3, 4,6,2,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,5,2,3, 4,9,1,7, 8,6,10,11], [0,1,2,3,4,5]],11    "R2": [[0,0,0,0, 0,0,0,0], [0,6,5,3, 4,2,1,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,9,2,3, 4,6,5,7, 8,1,10,11], [0,1,2,3,4,5]],       12    "R'": [[0,1,2,0, 0,2,1,0], [0,2,6,3, 4,1,5,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,6,2,3, 4,1,9,7, 8,5,10,11], [0,1,2,3,4,5]],         13    "F" : [[0,0,1,2, 0,0,2,1], [0,1,6,2, 4,5,7,3], [0,0,1,0, 0,0,1,1, 0,0,1,0], [0,1,6,3, 4,5,10,2, 8,9,7,11], [0,1,2,3,4,5]],         14    "F2": [[0,0,0,0, 0,0,0,0], [0,1,7,6, 4,5,3,2], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,10,3, 4,5,7,6, 8,9,2,11], [0,1,2,3,4,5]],         15    "F'": [[0,0,1,2, 0,0,2,1], [0,1,3,7, 4,5,2,6], [0,0,1,0, 0,0,1,1, 0,0,1,0], [0,1,7,3, 4,5,2,10, 8,9,6,11], [0,1,2,3,4,5]], 16    "L" : [[2,0,0,1, 1,0,0,2], [3,1,2,7, 0,5,6,4], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,7, 3,5,6,11, 8,9,10,4], [0,1,2,3,4,5]],                  17    "L2": [[0,0,0,0, 0,0,0,0], [7,1,2,4, 3,5,6,0], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,11, 7,5,6,4, 8,9,10,3], [0,1,2,3,4,5]],         18    "L'": [[2,0,0,1, 1,0,0,2], [4,1,2,0, 7,5,6,3], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,4, 11,5,6,3, 8,9,10,7], [0,1,2,3,4,5]],                  19    "D" : [[0,0,0,0, 0,0,0,0], [0,1,2,3, 7,4,5,6], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 11,8,9,10], [0,1,2,3,4,5]],20    "D2": [[0,0,0,0, 0,0,0,0], [0,1,2,3, 6,7,4,5], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 10,11,8,9], [0,1,2,3,4,5]],         21    "D'": [[0,0,0,0, 0,0,0,0], [0,1,2,3, 5,6,7,4], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 9,10,11,8], [0,1,2,3,4,5]],         22    "B" : [[1,2,0,0, 2,1,0,0], [4,0,2,3, 5,1,6,7], [1,0,0,0, 1,1,0,0, 1,0,0,0], [4,1,2,3, 8,0,6,7, 5,9,10,11], [0,1,2,3,4,5]],         23    "B2": [[0,0,0,0, 0,0,0,0], [5,4,2,3, 1,0,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [8,1,2,3, 5,4,6,7, 0,9,10,11], [0,1,2,3,4,5]],         24    "B'": [[1,2,0,0, 2,1,0,0], [1,5,2,3, 0,4,6,7], [1,0,0,0, 1,1,0,0, 1,0,0,0], [5,1,2,3, 0,8,6,7, 4,9,10,11], [0,1,2,3,4,5]],25    "M" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [1,0,1,0,0,0,0,0,1,0,1,0], [2,1,10,3,4,5,6,7,0,9,8,11],[1,5,2,0,4,3]],26    "M2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [10,1,8,3,4,5,6,7,2,9,0,11],[5,3,2,1,4,0]],         27    "M'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [1,0,1,0,0,0,0,0,1,0,1,0], [8,1,0,3,4,5,6,7,10,9,2,11],[3,0,2,5,4,1]],         28    "E" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,5,6,7,4,8,9,10,11], [0,4,1,2,3,5]],29    "E2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5,8,9,10,11], [0,3,4,1,2,5]],30    "E'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,7,4,5,6,8,9,10,11], [0,2,3,4,1,5]],31    "S" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,1,0,1,0,0,0,0,0,1,0,1], [0,9,2,1,4,5,6,7,8,11,10,3], [2,1,5,3,0,4]],32    "S2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [0,11,2,9,4,5,6,7,8,3,10,1], [5,1,4,3,2,0]],33    "S'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,1,0,1,0,0,0,0,0,1,0,1], [0,3,2,11,4,5,6,7,8,1,10,9], [4,1,0,3,5,2]],34    "u" : [[0,0,0,0,0,0,0,0], [1,2,3,0,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [1,2,3,0,5,6,7,4,8,9,10,11], [0,4,1,2,3,5]],35    "u2": [[0,0,0,0,0,0,0,0], [2,3,0,1,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5,8,9,10,11], [0,3,4,1,2,5]],36    "u'": [[0,0,0,0,0,0,0,0], [3,0,1,2,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [3,0,1,2,7,4,5,6,8,9,10,11], [0,2,3,4,1,5]],37    "r" : [[0,1,2,0,0,2,1,0], [0,5,1,3,4,6,2,7], [1,0,1,0,0,0,0,0,1,0,1,0], [8,5,0,3,4,9,1,7,10,6,2,11], [3,0,2,5,4,1]],         38    "r2": [[0,0,0,0,0,0,0,0], [0,6,5,3,4,2,1,7], [0,0,0,0,0,0,0,0,0,0,0,0], [10,9,8,3,4,6,5,7,2,1,0,11], [5,3,2,1,4,0]],         39    "r'": [[0,1,2,0,0,2,1,0], [0,2,6,3,4,1,5,7], [1,0,1,0,0,0,0,0,1,0,1,0], [2,6,10,3,4,1,9,7,0,5,8,11], [1,5,2,0,4,3]],        40    "f" : [[0,0,1,2,0,0,2,1], [0,1,6,2,4,5,7,3], [0,1,1,1,0,0,1,1,0,1,1,1], [0,9,6,1,4,5,10,2,8,11,7,3], [2,1,5,3,0,4]],41    "f2": [[0,0,0,0,0,0,0,0], [0,1,7,6,4,5,3,2], [0,0,0,0,0,0,0,0,0,0,0,0], [0,11,10,9,4,5,7,6,8,3,2,1], [5,1,4,3,2,0]],42    "f'": [[0,0,1,2,0,0,2,1], [0,1,3,7,4,5,2,6], [0,1,1,1,0,0,1,1,0,1,1,1], [0,3,7,11,4,5,2,10,8,1,6,9], [4,1,0,3,5,2]],43    "l" : [[2,0,0,1,1,0,0,2], [3,1,2,7,0,5,6,4], [1,0,1,0,0,0,0,0,1,0,1,0], [2,1,10,7,3,5,6,11,0,9,8,4], [1,5,2,0,4,3]],44    "l2": [[0,0,0,0,0,0,0,0], [7,1,2,4,3,5,6,0], [0,0,0,0,0,0,0,0,0,0,0,0], [10,1,8,11,7,5,6,4,2,9,0,3], [5,3,2,1,4,0]],45    "l'": [[2,0,0,1,1,0,0,2], [4,1,2,0,7,5,6,3], [1,0,1,0,0,0,0,0,1,0,1,0], [8,1,0,4,11,5,6,3,10,9,2,7], [3,0,2,5,4,1]],46    "b" : [[1,2,0,0,2,1,0,0], [4,0,2,3,5,1,6,7], [1,1,0,1,1,1,0,0,1,1,0,1], [4,3,2,11,8,0,6,7,5,1,10,9], [4,1,0,3,5,2]],47    "b2": [[0,0,0,0,0,0,0,0], [5,4,2,3,1,0,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [8,11,2,9,5,4,6,7,0,3,10,1], [5,1,4,3,2,0]],48    "b'": [[1,2,0,0,2,1,0,0], [1,5,2,3,0,4,6,7], [1,1,0,1,1,1,0,0,1,1,0,1], [5,9,2,1,0,8,6,7,4,11,10,3], [2,1,5,3,0,4]],49    "d" : [[0,0,0,0,0,0,0,0], [0,1,2,3,7,4,5,6], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,7,4,5,6,11,8,9,10], [0,2,3,4,1,5]],50    "d2": [[0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5], [0,0,0,0,0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5,10,11,8,9], [0,3,4,1,2,5]],51    "d'": [[0,0,0,0,0,0,0,0], [0,1,2,3,5,6,7,4], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,5,6,7,4,9,10,11,8], [0,4,1,2,3,5]],52    "x" : [[2,1,2,1, 1,2,1,2], [4,5,1,0, 7,6,2,3], [1,0,1,0,0,0,0,0,1,0,1,0], [8,5,0,4,11,9,1,3,10,6,2,7], [3,0,2,5,4,1]],         53    "x2": [[0,0,0,0, 0,0,0,0], [7,6,5,4, 3,2,1,0], [0,0,0,0,0,0,0,0,0,0,0,0], [10,9,8,11,7,6,5,4,2,1,0,3], [5,3,2,1,4,0]],         54    "x'": [[2,1,2,1, 1,2,1,2], [3,2,6,7, 0,1,5,4], [1,0,1,0,0,0,0,0,1,0,1,0], [2,6,10,7,3,1,9,11,0,5,8,4], [1,5,2,0,4,3]],55    "y" : [[0,0,0,0,0,0,0,0], [1,2,3,0,5,6,7,4], [0,0,0,0,1,1,1,1,0,0,0,0], [1,2,3,0,5,6,7,4,9,10,11,8], [0,4,1,2,3,5]],         56    "y2": [[0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5], [0,0,0,0,0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5,10,11,8,9], [0,3,4,1,2,5]],         57    "y'": [[0,0,0,0,0,0,0,0], [3,0,1,2,7,4,5,6], [0,0,0,0,1,1,1,1,0,0,0,0], [3,0,1,2,7,4,5,6,11,8,9,10], [0,2,3,4,1,5]],58    "z" : [[1,2,1,2,2,1,2,1], [1,5,6,2,0,4,7,3], [1,1,1,1,1,1,1,1,1,1,1,1], [5,9,6,1,0,8,10,2,4,11,7,3], [2,1,5,3,0,4]],59    "z2": [[0,0,0,0,0,0,0,0], [5,4,7,6,1,0,3,2], [0,0,0,0,0,0,0,0,0,0,0,0], [8,11,10,9,5,4,7,6,0,3,2,1], [5,1,4,3,2,0]],60    "z'": [[1,2,1,2,2,1,2,1], [4,0,3,7,5,1,2,6], [1,1,1,1,1,1,1,1,1,1,1,1], [4,3,7,11,8,0,2,10,5,1,6,9], [4,1,0,3,5,2]],61    62    "RLmirror": [[0,0,0,0,0,0,0,0], [1,0,3,2,5,4,7,6], [0,0,0,0,0,0,0,0,0,0,0,0], [0,3,2,1,5,4,7,6,8,11,10,9], [0,3,4,1,2,5]]63    // Not a real move, but useful for symmetry reductions64};65var moveAxes = {66    "U" : 0, "U2": 0, "U'": 0,67    "R" : 1, "R2": 1, "R'": 1, 68    "F" : 2, "F2": 2, "F'": 2, 69    "L" : 1, "L2": 1, "L'": 1, 70    "D" : 0, "D2": 0, "D'": 0, 71    "B" : 2, "B2": 2, "B'": 2,72    "M" : 1, "M2": 1, "M'": 1, 73    "E" : 0, "E2": 0, "E'": 0,74    "S" : 2, "S2": 2, "S'": 2,75    "u" : 0, "u2": 0, "u'": 0,76    "r" : 1, "r2": 1, "r'": 1, 77    "f" : 2, "f2": 2, "f'": 2,78    "l" : 1, "l2": 1, "l'": 1,79    "b" : 2, "b2": 2, "b'": 2,80    "d" : 0, "d2": 0, "d'": 0,81    "x" : 1, "x2": 1, "x'": 1,82    "y" : 0, "y2": 0, "y'": 0,83    "z" : 2, "z2": 2, "z'": 2 84};85/* 86Any naive search will search sequences containing consecutive moves on the same axis. 87If for example, one such sequence contains the sequence R L, then there is no point in88performing a search with L R, as the resulting state will be identical. The following89defines a hierarchy which specifies an arbitrarily chosen order to avoid searching 90duplicate move sequences.91*/92var trivialFollowSet = {93    "U" : 0, "U2": 0, "U'": 0,94    "R" : 1, "R2": 1, "R'": 1, 95    "F" : 2, "F2": 2, "F'": 2, 96    "L" : 3, "L2": 3, "L'": 3, 97    "D" : 4, "D2": 4, "D'": 4, 98    "B" : 5, "B2": 5, "B'": 5,99    "M" : 6, "M2": 6, "M'": 6, 100    "E" : 7, "E2": 7, "E'": 7,101    "S" : 8, "S2": 8, "S'": 8,102    "u" : 9, "u2": 9, "u'": 9,103    "r" : 10, "r2": 10, "r'": 10, 104    "f" : 11, "f2": 11, "f'": 11,105    "l" : 12, "l2": 12, "l'": 12,106    "b" : 13, "b2": 13, "b'": 13,107    "d" : 14, "d2": 14, "d'": 14,108    "x" : 15, "x2": 15, "x'": 15,109    "y" : 16, "y2": 16, "y'": 16,110    "z" : 17, "z2": 17, "z'": 17111};112var isTrivialMove = function (move, moveset) {113    // A move is trivial if it is preceded by the same type or a more dominant move 114    // on the same axis (see trivialFollowSet) 115    116    for (let i=moveset.length-1; i>=0; i--) {117        if (moveAxes[moveset[i]] === moveAxes[move]) {118            if (trivialFollowSet[moveset[i]] >= trivialFollowSet[move]) {119                return true; // Trivial turn120            }121        } 122        else {            123            return false; // Preceded by turn on a different axis124        }125    }    126    return false; // No trivial turns127};128var applyMoveCP = function (move, cpstate) {129    130    let moveCP = movesDef[move][1];    131    let newState = cpstate.slice(); 132    for (let i=0; i < moveCP.length; i++) {133        newState[moveCP[i]] = cpstate[i];134    }   135    136    return newState;        137};138var applyMoveEP = function (move, epstate) {139    140    let moveEP = movesDef[move][3];    141    let newState = epstate.slice(); 142    for (let i=0; i < moveEP.length; i++) {143        newState[moveEP[i]] = epstate[i];144    }   145    146    return newState;        147};148var applyMoveCentr = function (move, centrstate) {149    150    let moveCentr = movesDef[move][4];    151    let newState = centrstate.slice();152    for (let i=0; i < moveCentr.length; i++) {153        newState[moveCentr[i]] = centrstate[i];154    }   155    156    return newState;    157};158var applyMoveCO = function (move, costate) {159    160    let moveCO = movesDef[move][0];    161    let newState = applyMoveCP(move, costate); 162    163    for (let i=0; i < moveCO.length; i++) {164        newState[i] = (newState[i] + moveCO[i]) % 3;165    }   166        167    return newState;168};169var applyMoveEO = function (move, eostate) {170    171    let moveEO = movesDef[move][2];    172    let newState = applyMoveEP(move, eostate); 173    174    for (let i=0; i < moveEO.length; i++) {175        newState[i] = (newState[i] + moveEO[i]) % 2;176    }   177        178    return newState;179};180//=======================================================================================181/*182Phase 1 simple coordinates183Three simple coordinates are used : CornerTwist, EdgeFlip and a ESlice coord184These specify the corner orientation, the edge orientation and the location 185of the four edges that belong on the E slice. 186These coordinates may be reduced using symmetry.187Adapted from: http://kociemba.org/math/twophase.htm188*/189var getCoordCornTwist = function (state) {190    // Corner orientation coordinate191    // Integer from 0 to 2186192    193    let coord = 0;194    for (let i=0; i<7; i++) {195        // corner orientation of all but last corner196        coord = coord*3 + state[i];197    }        198    return coord;199};200var getCoordEdgeFlip = function (state) {201    // Edge orientation coordinate202    // Integer from 0 to 2047203    204    let coord = 0;205    for (let i=0; i<11; i++) {206        // edge orientation of all but last corner207        coord = coord*2 + state[i];208    }        209    return coord;210};211var getCoordESlice = function (state) {212    // Permutation of the four E slice 213    // Integer from 0 to 494214    215    let coord = 0;216    217    let occupied = 0218    // Loop through in a custom order.219    // The four correct locations come last so that the coordinate of the solved state is 0220    let order = [0,1,2,3,8,9,10,11,4,5,6,7]; 221    for (let idx=0; idx<order.length; idx++) {222        let i = order[idx];223        if (state[i]>=5 && state[i]<=8) {224            occupied++;        225        }226        else if (occupied) {227            coord += nChooseK(idx, occupied-1);228        }229    }    230    return coord;231};232//---------------------------------------------------------------------------------------233/*234Inverses of the above four coordinates235*/236var invertCoordCornTwist =function (coord) {237    // Inverse function for corner orientation coordinate238    239    let state = new Array(8).fill(0);240    let temp = coord;241    let last = 15; // Smallest multiple of 3 such that (last >= 2*7)242    for (let i=6; i>=0; i--) {243        state[i] = temp % 3;244        last -= state[i];245        temp = Math.floor(temp / 3);246    }247    // Last corner is set such that the sum mod 3 is zero.248    state[7] = last % 3;249    return state250}251var invertCoordEdgeFlip =function (coord) {252    // Inverse function for edge orientation253    254    let state = new Array(12).fill(0);255    let temp = coord;256    let last = 12; // Smallest multiple of 2 such that (last >= 1*11)257    for (let i=10; i>=0; i--) {258        state[i] = temp % 2;259        last -= state[i];260        temp = Math.floor(temp / 2);261    }262    // Last edge is set such that the sum mod 2 is zero.263    state[11] = last % 2;264    return state265}266var invertCoordESlice = function (coord) {267    // Inverse function for permutation of the four E slice edges268    269    let state = new Array(12).fill(0);270    271    let tempCoord = coord;272    let nEdgesLeft = 4;273    274    let nextEdge = 8; // Count down since loop goes backward: 8,7,6,5275    276    let order = [0,1,2,3,8,9,10,11,4,5,6,7]; // E slice edges come last277    278    for (let idx=0; idx<order.length; idx++) {279        if (tempCoord >= nChooseK(11-idx, nEdgesLeft-1)) {280            tempCoord -= nChooseK(11-idx, nEdgesLeft-1);281        }282        else {283            state[order[11-idx]] = (nextEdge--);284            nEdgesLeft--;285        }286        if (nEdgesLeft === 0) {287            break;288        }289        290    }291    return state;292};293//=======================================================================================294/*295Phase 1 Move Tables296Functions for constructing move tables for each coordinate. 297*/298// Constants299const nCornTwist = 2187;300const nEdgeFlip = 2048;301const nESlice = 495;302//---------------------------------------------------------------------------------------303var buildCornerTwistMoveTable = function (move) {304    let moveTable = new Array(nCornTwist).fill(0);305    306    for (let coord=0; coord<nCornTwist; coord++) {307        let state = applyMoveCO(move, invertCoordCornTwist(coord));        308        moveTable[coord] = getCoordCornTwist(state);309    }310    return moveTable;311};312var buildEdgeFlipMoveTable = function (move) {313    let moveTable = new Array(nEdgeFlip).fill(0);314    315    for (let coord=0; coord<nEdgeFlip; coord++) {316        let state = applyMoveEO(move, invertCoordEdgeFlip(coord));        317        moveTable[coord] = getCoordEdgeFlip(state);318    }319    return moveTable;320};321var buildESliceMoveTable = function (move) {322    let moveTable = new Array(nESlice).fill(0);323    324    for (let coord=0; coord<nESlice; coord++) {325        let state = applyMoveEP(move, invertCoordESlice(coord));        326        moveTable[coord] = getCoordESlice(state);327    }328    return moveTable;329};330//---------------------------------------------------------------------------------------331var buildTableForAllMoves = function (allowedMoves, tableFunction) {332    // Builds a move table for each of the move. allowedMoves is a list of moves333    // and tableFunction is a function which constructs the move table.334    let moveTables = {};335    for (let m in allowedMoves) {336        let move = allowedMoves[m];337        moveTables[move] = tableFunction(move);338    }339    return moveTables;340};341var phase1AllowedMoves = ["R","R'","R2","U","U'","U2","F","F'","F2","D","D'","D2","L","L'","L2","B","B'","B2"];342// Add some extra moves. These take up a little extra space in the move tables, 343// but make it easier and faster to calculate sym coordinates344var extendedAllowedMoves = phase1AllowedMoves.concat(['y', 'z2', 'RLmirror']);345// Build all three move tables for phase 1346var moveTableCornerTwist = buildTableForAllMoves(extendedAllowedMoves, buildCornerTwistMoveTable);347var moveTableEdgeFlip = buildTableForAllMoves(extendedAllowedMoves, buildEdgeFlipMoveTable);348var moveTableESlice = buildTableForAllMoves(extendedAllowedMoves, buildESliceMoveTable);349//=======================================================================================350/*351Symmetry reductions.352Coordinates can be reduced using symmetry.353The three symmetry transformations used are: y, z2, and RLmirror.354*/355var buildSymmetryMoveTable = function (allowedMoves, nCoordSize, moveTable) {356    let nextSymCoord = 0;357    358    let newMoveTable = 0;359    360    for (let i=0; i<nCoordSize; i++) {361        362    }363}364var getPhase1SymCoordMapTables = function (moveTables) {365    // Generate mapping tables to take raw EO and EsliceEdge coordinates to366    // a combined coordinate that is reduced by symmetry.367    368    let nextSymCoord = 0;369    let symCoordMap = [];//new Array(nPhase1Edges).fill(0);370    let symCoordInvMap = new Array(nEdgeFlip * nESliceEdgePerm).fill(0);371    372    let l = new Array(17).fill(0);373    374    for (let rawCoord=0; rawCoord < (nEdgeFlip * nESliceEdgePerm); rawCoord++) {375        let eoCoord = (rawCoord % nEdgeFlip);376        let eepCoord = Math.floor(rawCoord / nEdgeFlip);377//        console.log('  Start', eoCoord, eepCoord)378        let rawStates = [];379            380        // For each type of symmetry, calculate the state reached381        // and populate the mapping tables382        let alreadyVisited = false;383        384        let newRawCoord = 0;385        386//        console.log('start', rawCoord)387        388        for (let i=0; i<2; i++) {            389            390            if (alreadyVisited) break;391            392            eoCoord = moveTables[1]['RLmirror'][eoCoord];393            eepCoord = moveTables[2]['RLmirror'][eepCoord];394            for (let j=0; j<2; j++) {395                if (alreadyVisited) break;396                eoCoord = moveTables[1]['z2'][eoCoord];397                eepCoord = moveTables[2]['z2'][eepCoord];398                for (let k=0; k<4; k++) {399                    400                    if (alreadyVisited) break;401                    402                    eoCoord = moveTables[1]['y'][eoCoord];403                    eepCoord = moveTables[2]['y'][eepCoord];404                    newRawCoord = (eepCoord * nEdgeFlip) + eoCoord;405                    406//                    console.log('', i,j,k,'--',rawCoord, '=>', newRawCoord, '   \tEO',eoCoord,'EP',eepCoord)407                    408                    if (newRawCoord < rawCoord) {409                        alreadyVisited = true;410                        break;411                    }412                    413                    rawStates.push(newRawCoord);   414//                    console.log(rawCoord, newRawCoord);415                    416                }417            }418        }419        420//        console.log('end', newRawCoord)421        422        if (alreadyVisited) {423            continue;424        }425        426//        let nUniqueSymmStates = 1;427//        428//        for (let j=1; j<rawStates.length; j++) {429//            if (rawStates[0] === rawStates[j]) {430//                nUniqueSymmStates++;431//            }432//        }433//        l[16/nUniqueSymmStates]++;434        435        for (let i=0; i<rawStates.length; i++) {            436            symCoordInvMap[rawStates[i]] = nextSymCoord;            437        }438        439        symCoordMap[nextSymCoord] = rawCoord;440        441        nextSymCoord++;442        443    }444    445//    console.log(nEdgeOri * nESliceEdgePerm);446//    console.log(nextSymCoord);447//    console.log(64430);448//    console.log(l);449    450//    console.log(symCoordMap.length, symCoordInvMap.length)451    452    return [symCoordMap, symCoordInvMap];...moves.js
Source:moves.js  
1var movesDef = {2    "U" : [[0,0,0,0, 0,0,0,0], [1,2,3,0, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [1,2,3,0, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],3    "U2": [[0,0,0,0, 0,0,0,0], [2,3,0,1, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [2,3,0,1, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],4    "U'": [[0,0,0,0, 0,0,0,0], [3,0,1,2, 4,5,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [3,0,1,2, 4,5,6,7, 8,9,10,11], [0,1,2,3,4,5]],5    "R" : [[0,1,2,0, 0,2,1,0], [0,5,1,3, 4,6,2,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,5,2,3, 4,9,1,7, 8,6,10,11], [0,1,2,3,4,5]],6    "R2": [[0,0,0,0, 0,0,0,0], [0,6,5,3, 4,2,1,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,9,2,3, 4,6,5,7, 8,1,10,11], [0,1,2,3,4,5]],       7    "R'": [[0,1,2,0, 0,2,1,0], [0,2,6,3, 4,1,5,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,6,2,3, 4,1,9,7, 8,5,10,11], [0,1,2,3,4,5]],         8    "F" : [[0,0,1,2, 0,0,2,1], [0,1,6,2, 4,5,7,3], [0,0,1,0, 0,0,1,1, 0,0,1,0], [0,1,6,3, 4,5,10,2, 8,9,7,11], [0,1,2,3,4,5]],         9    "F2": [[0,0,0,0, 0,0,0,0], [0,1,7,6, 4,5,3,2], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,10,3, 4,5,7,6, 8,9,2,11], [0,1,2,3,4,5]],         10    "F'": [[0,0,1,2, 0,0,2,1], [0,1,3,7, 4,5,2,6], [0,0,1,0, 0,0,1,1, 0,0,1,0], [0,1,7,3, 4,5,2,10, 8,9,6,11], [0,1,2,3,4,5]], 11    "L" : [[2,0,0,1, 1,0,0,2], [3,1,2,7, 0,5,6,4], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,7, 3,5,6,11, 8,9,10,4], [0,1,2,3,4,5]],                  12    "L2": [[0,0,0,0, 0,0,0,0], [7,1,2,4, 3,5,6,0], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,11, 7,5,6,4, 8,9,10,3], [0,1,2,3,4,5]],         13    "L'": [[2,0,0,1, 1,0,0,2], [4,1,2,0, 7,5,6,3], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,4, 11,5,6,3, 8,9,10,7], [0,1,2,3,4,5]],                  14    "D" : [[0,0,0,0, 0,0,0,0], [0,1,2,3, 7,4,5,6], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 11,8,9,10], [0,1,2,3,4,5]],15    "D2": [[0,0,0,0, 0,0,0,0], [0,1,2,3, 6,7,4,5], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 10,11,8,9], [0,1,2,3,4,5]],         16    "D'": [[0,0,0,0, 0,0,0,0], [0,1,2,3, 5,6,7,4], [0,0,0,0, 0,0,0,0, 0,0,0,0], [0,1,2,3, 4,5,6,7, 9,10,11,8], [0,1,2,3,4,5]],         17    "B" : [[1,2,0,0, 2,1,0,0], [4,0,2,3, 5,1,6,7], [1,0,0,0, 1,1,0,0, 1,0,0,0], [4,1,2,3, 8,0,6,7, 5,9,10,11], [0,1,2,3,4,5]],         18    "B2": [[0,0,0,0, 0,0,0,0], [5,4,2,3, 1,0,6,7], [0,0,0,0, 0,0,0,0, 0,0,0,0], [8,1,2,3, 5,4,6,7, 0,9,10,11], [0,1,2,3,4,5]],         19    "B'": [[1,2,0,0, 2,1,0,0], [1,5,2,3, 0,4,6,7], [1,0,0,0, 1,1,0,0, 1,0,0,0], [5,1,2,3, 0,8,6,7, 4,9,10,11], [0,1,2,3,4,5]],20    "M" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [1,0,1,0,0,0,0,0,1,0,1,0], [2,1,10,3,4,5,6,7,0,9,8,11],[1,5,2,0,4,3]],21    "M2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [10,1,8,3,4,5,6,7,2,9,0,11],[5,3,2,1,4,0]],         22    "M'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [1,0,1,0,0,0,0,0,1,0,1,0], [8,1,0,3,4,5,6,7,10,9,2,11],[3,0,2,5,4,1]],         23    "E" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,5,6,7,4,8,9,10,11], [0,4,1,2,3,5]],24    "E2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5,8,9,10,11], [0,3,4,1,2,5]],25    "E'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,7,4,5,6,8,9,10,11], [0,2,3,4,1,5]],26    "S" : [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,1,0,1,0,0,0,0,0,1,0,1], [0,9,2,1,4,5,6,7,8,11,10,3], [2,1,5,3,0,4]],27    "S2": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [0,11,2,9,4,5,6,7,8,3,10,1], [5,1,4,3,2,0]],28    "S'": [[0,0,0,0,0,0,0,0], [0,1,2,3,4,5,6,7], [0,1,0,1,0,0,0,0,0,1,0,1], [0,3,2,11,4,5,6,7,8,1,10,9], [4,1,0,3,5,2]],29    "u" : [[0,0,0,0,0,0,0,0], [1,2,3,0,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [1,2,3,0,5,6,7,4,8,9,10,11], [0,4,1,2,3,5]],30    "u2": [[0,0,0,0,0,0,0,0], [2,3,0,1,4,5,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5,8,9,10,11], [0,3,4,1,2,5]],31    "u'": [[0,0,0,0,0,0,0,0], [3,0,1,2,4,5,6,7], [0,0,0,0,1,1,1,1,0,0,0,0], [3,0,1,2,7,4,5,6,8,9,10,11], [0,2,3,4,1,5]],32    "r" : [[0,1,2,0,0,2,1,0], [0,5,1,3,4,6,2,7], [1,0,1,0,0,0,0,0,1,0,1,0], [8,5,0,3,4,9,1,7,10,6,2,11], [3,0,2,5,4,1]],         33    "r2": [[0,0,0,0,0,0,0,0], [0,6,5,3,4,2,1,7], [0,0,0,0,0,0,0,0,0,0,0,0], [10,9,8,3,4,6,5,7,2,1,0,11], [5,3,2,1,4,0]],         34    "r'": [[0,1,2,0,0,2,1,0], [0,2,6,3,4,1,5,7], [1,0,1,0,0,0,0,0,1,0,1,0], [2,6,10,3,4,1,9,7,0,5,8,11], [1,5,2,0,4,3]],        35    "f" : [[0,0,1,2,0,0,2,1], [0,1,6,2,4,5,7,3], [0,1,1,1,0,0,1,1,0,1,1,1], [0,9,6,1,4,5,10,2,8,11,7,3], [2,1,5,3,0,4]],36    "f2": [[0,0,0,0,0,0,0,0], [0,1,7,6,4,5,3,2], [0,0,0,0,0,0,0,0,0,0,0,0], [0,11,10,9,4,5,7,6,8,3,2,1], [5,1,4,3,2,0]],37    "f'": [[0,0,1,2,0,0,2,1], [0,1,3,7,4,5,2,6], [0,1,1,1,0,0,1,1,0,1,1,1], [0,3,7,11,4,5,2,10,8,1,6,9], [4,1,0,3,5,2]],38    "l" : [[2,0,0,1,1,0,0,2], [3,1,2,7,0,5,6,4], [1,0,1,0,0,0,0,0,1,0,1,0], [2,1,10,7,3,5,6,11,0,9,8,4], [1,5,2,0,4,3]],39    "l2": [[0,0,0,0,0,0,0,0], [7,1,2,4,3,5,6,0], [0,0,0,0,0,0,0,0,0,0,0,0], [10,1,8,11,7,5,6,4,2,9,0,3], [5,3,2,1,4,0]],40    "l'": [[2,0,0,1,1,0,0,2], [4,1,2,0,7,5,6,3], [1,0,1,0,0,0,0,0,1,0,1,0], [8,1,0,4,11,5,6,3,10,9,2,7], [3,0,2,5,4,1]],41    "b" : [[1,2,0,0,2,1,0,0], [4,0,2,3,5,1,6,7], [1,1,0,1,1,1,0,0,1,1,0,1], [4,3,2,11,8,0,6,7,5,1,10,9], [4,1,0,3,5,2]],42    "b2": [[0,0,0,0,0,0,0,0], [5,4,2,3,1,0,6,7], [0,0,0,0,0,0,0,0,0,0,0,0], [8,11,2,9,5,4,6,7,0,3,10,1], [5,1,4,3,2,0]],43    "b'": [[1,2,0,0,2,1,0,0], [1,5,2,3,0,4,6,7], [1,1,0,1,1,1,0,0,1,1,0,1], [5,9,2,1,0,8,6,7,4,11,10,3], [2,1,5,3,0,4]],44    "d" : [[0,0,0,0,0,0,0,0], [0,1,2,3,7,4,5,6], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,7,4,5,6,11,8,9,10], [0,2,3,4,1,5]],45    "d2": [[0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5], [0,0,0,0,0,0,0,0,0,0,0,0], [0,1,2,3,6,7,4,5,10,11,8,9], [0,3,4,1,2,5]],46    "d'": [[0,0,0,0,0,0,0,0], [0,1,2,3,5,6,7,4], [0,0,0,0,1,1,1,1,0,0,0,0], [0,1,2,3,5,6,7,4,9,10,11,8], [0,4,1,2,3,5]],47    "x" : [[2,1,2,1, 1,2,1,2], [4,5,1,0, 7,6,2,3], [1,0,1,0,0,0,0,0,1,0,1,0], [8,5,0,4,11,9,1,3,10,6,2,7], [3,0,2,5,4,1]],         48    "x2": [[0,0,0,0, 0,0,0,0], [7,6,5,4, 3,2,1,0], [0,0,0,0,0,0,0,0,0,0,0,0], [10,9,8,11,7,6,5,4,2,1,0,3], [5,3,2,1,4,0]],         49    "x'": [[2,1,2,1, 1,2,1,2], [3,2,6,7, 0,1,5,4], [1,0,1,0,0,0,0,0,1,0,1,0], [2,6,10,7,3,1,9,11,0,5,8,4], [1,5,2,0,4,3]],50    "y" : [[0,0,0,0,0,0,0,0], [1,2,3,0,5,6,7,4], [0,0,0,0,1,1,1,1,0,0,0,0], [1,2,3,0,5,6,7,4,9,10,11,8], [0,4,1,2,3,5]],         51    "y2": [[0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5], [0,0,0,0,0,0,0,0,0,0,0,0], [2,3,0,1,6,7,4,5,10,11,8,9], [0,3,4,1,2,5]],         52    "y'": [[0,0,0,0,0,0,0,0], [3,0,1,2,7,4,5,6], [0,0,0,0,1,1,1,1,0,0,0,0], [3,0,1,2,7,4,5,6,11,8,9,10], [0,2,3,4,1,5]],53    "z" : [[1,2,1,2,2,1,2,1], [1,5,6,2,0,4,7,3], [1,1,1,1,1,1,1,1,1,1,1,1], [5,9,6,1,0,8,10,2,4,11,7,3], [2,1,5,3,0,4]],54    "z2": [[0,0,0,0,0,0,0,0], [5,4,7,6,1,0,3,2], [0,0,0,0,0,0,0,0,0,0,0,0], [8,11,10,9,5,4,7,6,0,3,2,1], [5,1,4,3,2,0]],55    "z'": [[1,2,1,2,2,1,2,1], [4,0,3,7,5,1,2,6], [1,1,1,1,1,1,1,1,1,1,1,1], [4,3,7,11,8,0,2,10,5,1,6,9], [4,1,0,3,5,2]]56};57var moveAxes = {58    "U" : 0, "U2": 0, "U'": 0,59    "R" : 1, "R2": 1, "R'": 1, 60    "F" : 2, "F2": 2, "F'": 2, 61    "L" : 1, "L2": 1, "L'": 1, 62    "D" : 0, "D2": 0, "D'": 0, 63    "B" : 2, "B2": 2, "B'": 2,64    "M" : 1, "M2": 1, "M'": 1, 65    "E" : 0, "E2": 0, "E'": 0,66    "S" : 2, "S2": 2, "S'": 2,67    "u" : 0, "u2": 0, "u'": 0,68    "r" : 1, "r2": 1, "r'": 1, 69    "f" : 2, "f2": 2, "f'": 2,70    "l" : 1, "l2": 1, "l'": 1,71    "b" : 2, "b2": 2, "b'": 2,72    "d" : 0, "d2": 0, "d'": 0,73    "x" : 1, "x2": 1, "x'": 1,74    "y" : 0, "y2": 0, "y'": 0,75    "z" : 2, "z2": 2, "z'": 2 76};77exports.moveAxes = moveAxes;78var trivialFollowSet = {79    "U" : 0, "U2": 0, "U'": 0,80    "R" : 1, "R2": 1, "R'": 1, 81    "F" : 2, "F2": 2, "F'": 2, 82    "L" : 3, "L2": 3, "L'": 3, 83    "D" : 4, "D2": 4, "D'": 4, 84    "B" : 5, "B2": 5, "B'": 5,85    "M" : 6, "M2": 6, "M'": 6, 86    "E" : 7, "E2": 7, "E'": 7,87    "S" : 8, "S2": 8, "S'": 8,88    "u" : 9, "u2": 9, "u'": 9,89    "r" : 10, "r2": 10, "r'": 10, 90    "f" : 11, "f2": 11, "f'": 11,91    "l" : 12, "l2": 12, "l'": 12,92    "b" : 13, "b2": 13, "b'": 13,93    "d" : 14, "d2": 14, "d'": 14,94    "x" : 15, "x2": 15, "x'": 15,95    "y" : 16, "y2": 16, "y'": 16,96    "z" : 17, "z2": 17, "z'": 1797};98exports.trivialFollowSet = trivialFollowSet;99var isTrivialMove = function (move, moveset) {100    101    for (var i=moveset.length-1; i>=0; i--) {102        if (moveAxes[moveset[i]] === moveAxes[move]) {103            if (trivialFollowSet[moveset[i]] === trivialFollowSet[move]) {104                return true; // Trivial turn105            }106        } 107        else {            108            return false; // Turn on a different axis109        }110    }    111    return false; // No trivial turns112};113exports.isTrivialMove = isTrivialMove;114var applyMoveCP = function (move, cpstate) {115    116    var moveCP = movesDef[move][1];    117    var newState = cpstate.slice(); 118    for (var i=0; i < moveCP.length; i++) {119        newState[moveCP[i]] = cpstate[i];120    }   121    122    return newState;        123};124var applyMoveEP = function (move, epstate) {125    126    var moveEP = movesDef[move][3];    127    var newState = epstate.slice(); 128    for (var i=0; i < moveEP.length; i++) {129        newState[moveEP[i]] = epstate[i];130    }   131    132    return newState;        133};134var applyMoveCentr = function (move, centrstate) {135    136    var moveCentr = movesDef[move][4];    137    var newState = centrstate.slice();138    for (var i=0; i < moveCentr.length; i++) {139        newState[moveCentr[i]] = centrstate[i];140    }   141    142    return newState;    143};144var applyMoveCO = function (move, costate) {145    146    var moveCO = movesDef[move][0];    147    var newState = applyMoveCP(move, costate); 148    149    for (var i=0; i < moveCO.length; i++) {150        newState[i] = (newState[i] + moveCO[i]) % 3;151    }   152        153    return newState;154};155var applyMoveEO = function (move, eostate) {156    157    var moveEO = movesDef[move][2];    158    var newState = applyMoveEP(move, eostate); 159    160    for (var i=0; i < moveEO.length; i++) {161        newState[i] = (newState[i] + moveEO[i]) % 2;162    }   163        164    return newState;165};166var applyMove = function (move, state) {167    return [168        applyMoveCO(move, state[0]),169        applyMoveCP(move, state[1]),170        applyMoveEO(move, state[2]),171        applyMoveEP(move, state[3]),172        applyMoveCentr(move, state[4])173    ];174};175exports.applyMoveCP = applyMoveCP;176exports.applyMoveEP = applyMoveEP;177exports.applyMoveCO = applyMoveCO;178exports.applyMoveEO = applyMoveEO;179exports.applyMoveCentr = applyMoveCentr;180exports.applyMove = applyMove;...InformativeMoveBox.jsx
Source:InformativeMoveBox.jsx  
...78  };79  handleMove = (axis, sign) => {80    const { addNotification, webSocketSendMessage, tool } = this.props;81    const { stepSize} = this.state;82    webSocketSendMessage(moveAxes( axis, stepSize*sign ));83    // addNotification({ message: <FormattedMessage id="websocket.message.preheat.sended" values={{ tool, preHeatTemp }} />, variant: 'success', autoHide: true, autoHideDuration: 500 })84    // this.setState({preHeatTempLastSend: preHeatTemp})85  };86  handleExtrusion = (extruder, sign) => {87    const { addNotification, webSocketSendMessage, tool } = this.props;88    const { stepSize} = this.state;89    webSocketSendMessage(extrudeFilament( extruder, stepSize*sign ));90  }91  render() {92    const { classes, id } = this.props;93    const {94      value, dataType, lastUpdate, isInHome, inputEnabled, color95    } = this.props;96    const {stepSize} = this.state;...status-indicator.js
Source:status-indicator.js  
...149        this.canvasContext.rotate(convertToRadian(ROTATION_ANGLE));150        this.canvasContext.translate(-this.spinnerCenter, -this.spinnerCenter);151    }152    _getRotatedGradientPoints (point) {153        var changedPoint = moveAxes(point, this.spinnerCenter);154        changedPoint = rotateAxes(changedPoint, this.rotationAngle);155        changedPoint = moveAxes(changedPoint, -this.spinnerCenter);156        return changedPoint;157    }158    _setSpinnerGradient () {159        var startGradientPoint = {160            x: Math.round(this.size * START_GRADIENT_POINT_OFFSET.x),161            y: Math.round(this.size * START_GRADIENT_POINT_OFFSET.y)162        };163        var endGradientPoint = {164            x: Math.round(this.size * END_GRADIENT_POINT_OFFSET.x),165            y: Math.round(this.size * END_GRADIENT_POINT_OFFSET.y)166        };167        if (this.rotationAngle !== 0) {168            startGradientPoint = this._getRotatedGradientPoints(startGradientPoint);169            endGradientPoint   = this._getRotatedGradientPoints(endGradientPoint);...index.js
Source:index.js  
...79           }80         });81}82// Hack to move y-axes that were being cut off. Customizing axis placement appears to be impossible or poorly documented in mpld383function moveAxes(){84    labels = $('.mpld3-text[transform]') // add [transform] so we only catch rotated labels85    labels.attr('transform', (i, value) => `${value || ""} translate(0 10)`)86}87$( window ).on( "load", function (){88    moveAxes()89})90$( document ).ajaxComplete(function(){91    defineJQueryObjects()92    createTooltips()93    moveAxes()94})95function fillLow() {96    rule_out_agi_by_field.val(2020)97    virtual_successes_field.val(0.5)98    regime_start_year_field.val(1956)99    first_trial_probability_field.val(0.001)100    g_exp_field.val(4.3)101    g_act_field.val(7)102    init_weight_calendar_field.val(.5)103    init_weight_researcher_field.val(.3)104    init_weight_agi_impossible_field.val(.2)105    init_weight_comp_relative_res_field.val(0)106    init_weight_lifetime_field.val(0)107    init_weight_evolution_field.val(0)...commands.js
Source:commands.js  
1/*2tool 'T0' 'T1' ''3 */4export const preHeatTool = (tool, temperature) => {5  if (tool === 'Bed') {6    return 'M140 S' + temperature + '\r\n';7  } else {8    return 'M104 S' + temperature + ' ' + tool + '\r\n';9  }10};11export const multipleStatRequest = () => {12  return 'M105\r\n' +13          'M997\r\n' + // M997 request printig status14          'M994\r\n' +15          'M992\r\n' + // M992 printing time16          'M27\r\n' + // M27 printing percentage17          '\r\n';18};19export const requestFileList = (path = '') => {20  return 'M20 1:' + path + '\r\n';21};22export const selectAndPrint = (file) => {23  return 'M23 ' + file + '\r\n' +24    'M24\r\n' +25    '\r\n';26};27export const printSelectFile = (file) => {28  return 'M23 ' + file + '\r\n';29};30export const printResumeStart = () => {31  return 'M24\r\n';32};33export const printPause = () => {34  return 'M25\r\n';35};36export const printStop = (file) => {37  return 'M26\r\n';38};39export const deleteFile = (file) => {40  return 'M30 1:' + file + '\r\n';41};42// From 0 to 25543export const setFanSpeed = (speed) => {44  return 'M106 S' + speed + '\r\n';45};46export const cooldown = () => {47  return 'M104 S0\r\n' +48          'M140 S0\r\n';49};50export const unlock = () => {51  return 'M84\r\n';52};53export const moveAxes = (axis, step) => {54  let xA = '0.0';55  let yA = '0.0';56  let zA = '0.0';57  if (axis.toUpperCase() === 'X') {58    xA = step + '.0';59  } else if (axis.toUpperCase() === 'Y') {60    yA = step + '.0';61  } else if (axis.toUpperCase() === 'Z') {62    zA = step + '.0';63  }64  return 'G91\r\n' +65  'G0 X' + xA + ' Y' + yA + '.0 Z' + zA + '.0 F3000\r\n' +66  'G90\r\n';67};68export const extrudeFilament = (extruder, step) => {69  return extruder + '\r\n' +70  'G91\r\n' +71  'G1 E' + step + ' F1000\r\n' +72  'G90\r\n';73};74export const homingXY = () => {75  return 'G28 X Y\r\n';76};77export const homingZ = () => {78  return 'G28 Z\r\n';79};80export const homingAll = () => {81  return 'G28 \r\n';82};83export const resetPrinter = () => {84  return 'M107\r\n' +85  'G1 Z10\r\n' +86  'M104 S0\r\n' +87  'M140 S0\r\n' +88  'M84\r\n';89};90export const coolDown = () => {91  return 'M104 S0\r\n' +92          'M140 S0\r\n' +93          'M106 S255\r\n';94};95export const unlockMotors = () => {96  return 'M84\r\n';...joystick.js
Source:joystick.js  
...12      name: '/joy',13      messageType: 'sensor_msgs/Joy'14    })15  }16  moveAxes(axesValue, moveEnd = false) {17    this.axes = axesValue18    if (moveEnd) {19      window.clearInterval(this.intervalId)20      this._sendJoyEvent()21    } else if (this.publishImmidiately) {22      // TODO: refactor this with a debounce lib ?23      this.publishImmidiately = false24      this._sendJoyEvent()25      window.clearInterval(this.intervalId)26      this.intervalId = window.setInterval(this._sendJoyEvent.bind(this), 50)27      setTimeout(() => {28        this.publishImmidiately = true29      }, 50)30    }...Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3        .click('#populate')4        .click('#submit-button')5        .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');6});7export default class Helper {8    async moveAxes (t, selector, x, y) {9            .hover(selector)10            .drag(selector, x, y);11    }12}13import { Selector } from 'testcafe';14import Helper from './test.js';15test('My first test', async t => {16    const helper = new Helper();17        .click('#populate')18        .click('#submit-button')19        .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');20});21export default class Helper {22    async moveAxes (t, selector, x, y) {23            .hover(selector)24            .drag(selector, x, y);25    }26}Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3    const slider = Selector('#tried-test-cafe');4        .click('#tried-test-cafe')5        .drag(slider, 360, 0, { offsetX: 10, offsetY: 10 });6});7import { Selector } from 'testcafe';8import { moveAxes } from 'testcafe-react-selectors';9test('My first test', async t => {10    const slider = Selector('#tried-test-cafe');11        .click('#tried-test-cafe')12        .drag(slider, moveAxes(360, 0, { offsetX: 10, offsetY: 10 }));13});14import React from 'react';15import { Selector } from 'testcafe';16import { moveAxes } from 'testcafe-react-selectors';17test('My first test', async t => {18    const slider = Selector('#tried-test-cafe');19        .click('#tried-test-cafe')20        .drag(slider, moveAxes(360, 0, { offsetX: 10, offsetY: 10 }));21});22import React from 'react';23import { Selector } from 'testcafe';24import { moveAxes } from 'testcafe-react-selectors';25test('My first test', async t => {26    const slider = Selector('#tried-test-cafe');27        .click('#tried-test-cafe')28        .drag(slider, moveAxes(360, 0, { offsetX: 10, offsetY: 10 }));29});Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3        .click('#tried-test-cafe')4        .click('#populate')5        .click('#submit-button')6        .click('#remote-testing')7        .click('#reusing-js-code')8        .click('#background-parallel-testing')9        .click('#continuous-integration-embedding')10        .click('#traffic-markup-analysis');11});12import { Selector } from 'testcafe';13test('My first test', async t => {14        .click('#tried-test-cafe')15        .click('#populate')16        .click('#submit-button')17        .click('#remote-testing')18        .click('#reusing-js-code')19        .click('#background-parallel-testing')20        .click('#continuous-integration-embedding')21        .click('#traffic-markup-analysis');22});23import { Selector } from 'testcafe';24test('My first test', async t => {25        .click('#tried-test-cafe')26        .click('#populate')27        .click('#submit-button')28        .click('#remote-testing')29        .click('#reusing-js-code')30        .click('#background-parallel-testing')31        .click('#continuous-integration-embedding')32        .click('#traffic-markup-analysis');33});34import { Selector } from 'testcafe';35test('My first test', async t => {36        .click('#tried-test-cafe')37        .click('#populate')38        .click('#submit-button')39        .click('#remote-testing')40        .click('#reusing-js-code')41        .click('#background-parallel-testing')42        .click('#continuous-integration-embedding')43        .click('#traffic-markup-analysis');44});Using AI Code Generation
1import { Selector } from 'testcafe';2test('My Test', async t => {3    const slider = Selector('#slider');4        .click(slider)5        .pressKey('right')6});7import { Selector } from 'testcafe';8test('My Test', async t => {9    const slider = Selector('#slider');10        .click(slider)11        .moveAxes(1, 0);12});13import { Selector } from 'testcafe';14test('My Test', async t => {15    const slider = Selector('#slider');16        .click(slider)17        .moveAxes(1, 0);18});19import { Selector } from 'testcafe';20test('My Test', async t => {21    const slider = Selector('#slider');22        .click(slider)23        .moveAxes(1, 0);24});25import { Selector } from 'testcafe';26test('My Test', async t => {27    const slider = Selector('#slider');28        .click(slider)29        .moveAxes(1, 0);30});31import { Selector } from 'testcafe';32test('My Test', async t => {33    const slider = Selector('#slider');34        .click(slider)35        .moveAxes(1, 0);36});37import { Selector } from 'testcafe';Using AI Code Generation
1import { Selector } from 'testcafe';2test('My test', async t => {3    const slider = Selector('#slider');4        .click(slider)5        .drag(slider, 360, 0, { offsetX: 10, offsetY: 10 });6});7import { Selector } from 'testcafe';8test('My test', async t => {9    const slider = Selector('#slider');10        .click(slider)11        .drag(slider, 360, 0, { offsetX: 10, offsetY: 10 });12});13import { Selector } from 'testcafe';14test('My test', async t => {15    const slider = Selector('#slider');16        .click(slider)17        .drag(slider, 360, 0);18});19import { Selector } from 'testcafe';20test('My test', async t => {21    const slider = Selector('#slider');22        .click(slider)23        .drag(slider, 360, 0);24});25t.drag( target, dragOffsetX, dragOffsetY [, options] )26Name Type Description offsetX number (optional) SpecifiesUsing AI Code Generation
1import { ClientFunction } from 'testcafe';2const moveAxes = ClientFunction((x, y) => window.testCafeDriver3    .move({ x, y })4    .wait(1000)5    .press()6    .wait(1000)7    .release()8    .wait(1000)9    .perform());10await moveAxes(200, 200);11await moveAxes(300, 300);12await moveAxes(400, 400);Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3        .click('#target')4        .expect(Selector('#result').innerText).eql('Clicked!');5});6test('My second test', async t => {7        .click('#target')8        .expect(Selector('#result').innerText).eql('Clicked!');9});10test('My third test', async t => {11        .click('#target')12        .expect(Selector('#result').innerText).eql('Clicked!');13});14test('My fourth test', async t => {15        .click('#target')16        .expect(Selector('#result').innerText).eql('Clicked!');17});18test('My fifth test', async t => {19        .click('#target')20        .expect(Selector('#result').innerText).eql('Clicked!');21});22test('My sixth test', async t => {23        .click('#target')24        .expect(Selector('#result').innerText).eql('Clicked!');25});26test('My seventh test', async t => {27        .click('#target')28        .expect(Selector('#result').innerText).eql('Clicked!');29});30test('My eighth test', async t => {31        .click('#target')32        .expect(Selector('#result').innerText).eql('Clicked!');33});34test('My ninth test', async t => {35        .click('#target')36        .expect(Selector('#result').innerText).eql('Clicked!');37});38test('My tenth test', async t => {39        .click('#target')40        .expect(Selector('#result').innerText).eql('Clicked!');41});Using AI Code Generation
1import {Selector} from 'testcafe';2test('Move Axes Test', async t => {3        .click('#moveAxes')4        .expect(Selector('#axis1').innerText).eql('1')5        .expect(Selector('#axis2').innerText).eql('2')6        .expect(Selector('#axis3').innerText).eql('3')7        .expect(Selector('#axis4').innerText).eql('4')8        .expect(Selector('#axis5').innerText).eql('5')9        .expect(Selector('#axis6').innerText).eql('6')10        .expect(Selector('#axis7').innerText).eql('7')11        .expect(Selector('#axis8').innerText).eql('8')12        .expect(Selector('#axis9').innerText).eql('9')13        .expect(Selector('#axis10').innerText).eql('10')14        .expect(Selector('#axis11').innerText).eql('11')15        .expect(Selector('#axis12').innerText).eql('12')16        .expect(Selector('#axis13').innerText).eql('13')17        .expect(Selector('#axis14').innerText).eql('14')18        .expect(Selector('#axis15').innerText).eql('15')19        .expect(Selector('#axis16').innerText).eql('16')20        .expect(Selector('#axis17').innerText).eql('17')21        .expect(Selector('#axis18').innerText).eql('18')22        .expect(Selector('#axis19').innerText).eql('19')23        .expect(Selector('#axis20').innerText).eql('20')24        .expect(Selector('#axis21').innerText).eql('21')25        .expect(Selector('#axis22').innerText).eql('22')26        .expect(Selector('#axis23').innerText).eql('23')27        .expect(Selector('#axis24').innerText).eql('24')28        .expect(Selector('#axis25').innerText).eql('25')29        .expect(Selector('#axis26').innerText).eql('26')30        .expect(Selector('#axis27').innerText).eql('27')31        .expect(Selector('#axis28').innerText).eql('28')Using AI Code Generation
1import { Selector } from 'testcafe';2test('Test', async t => {3        .click(Selector('#a'))4        .click(Selector('#b'))5        .click(Selector('#c'));6});7import { Selector } from 'testcafe';8test('Test', async t => {9        .click(Selector('#b'))10        .click(Selector('#a'))11        .click(Selector('#c'));12});13    .click(Selector('#a'))14    .click(Selector('#b'))15    .click(Selector('#c'));Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
