Skip to content

Commit

Permalink
clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
cs0x7f committed Apr 14, 2024
1 parent b16d749 commit 1898dca
Show file tree
Hide file tree
Showing 3 changed files with 259 additions and 15 deletions.
161 changes: 161 additions & 0 deletions experiment/bleHack.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
DEBUGBL = true;

var bleHacker = (function() {
//moves = [[move, timestamp], [], ..., []]
//return [finalState, msgs]
function moves2rawmsg(moves, initState) {
var cc1 = new mathlib.CubieCube();
var cc2 = new mathlib.CubieCube();
cc1.fromFacelet(initState);
var prevMoves = [0, 0, 0, 0, 0, 0, 0];
var prevStamp = [0, 0, 0, 0, 0, 0, 0];
var ret = [];
var cnt = 100;
var prevts = 0;
for (var i = 0; i < moves.length; i++) {
var m = moves[i][0];
var curTs = moves[i][1];
mathlib.CubieCube.EdgeMult(cc1, mathlib.CubieCube.moveCube[m], cc2);
mathlib.CubieCube.CornMult(cc1, mathlib.CubieCube.moveCube[m], cc2);
var tmp = cc1;
cc1 = cc2;
cc2 = tmp;
var axis = ~~(m / 3);
var pow = m % 3;
if (pow == 0 || pow == 2) {
prevMoves.unshift(axis << 1 | pow >> 1);
prevStamp.unshift(curTs - prevts);
cnt++;
} else {
prevMoves.unshift(axis << 1 | 0);
prevMoves.unshift(axis << 1 | 0);
prevStamp.unshift(curTs - prevts);
prevStamp.unshift(curTs - prevts);
cnt += 2;
}
prevMoves.length = 7;
prevStamp.length = 7;
ret.push(buildMoveMsg(cnt, prevMoves, prevStamp));
if (i % 2 == 1) {
ret.push(buildCubeMsg(cnt, cc1));
}
}
return [cc1.toFaceCube(), ret];
}

var prevMoves = [0, 0, 0, 0, 0, 0, 0];
var prevStamp = [0, 0, 0, 0, 0, 0, 0];
var cc1 = new mathlib.CubieCube();
var cc2 = new mathlib.CubieCube();
var moveCnt = 0;
var prevTs = 0;
var state = mathlib.SOLVED_FACELET;

function procMove(move, state) {
cc1.fromFacelet(state);
var curTs = $.now();
mathlib.CubieCube.EdgeMult(cc1, mathlib.CubieCube.moveCube[move], cc2);
mathlib.CubieCube.CornMult(cc1, mathlib.CubieCube.moveCube[move], cc2);
var tmp = cc1;
cc1 = cc2;
cc2 = tmp;
var axis = ~~(move / 3);
var pow = move % 3;
var ret = [];
if (pow == 0 || pow == 2) {
prevMoves.unshift(axis << 1 | pow >> 1);
prevStamp.unshift(curTs - prevTs);
moveCnt++;
} else {
prevMoves.unshift(axis << 1 | 0);
prevMoves.unshift(axis << 1 | 0);
prevStamp.unshift(curTs - prevTs);
prevStamp.unshift(curTs - prevTs);
moveCnt += 2;
}
prevTs = curTs;
prevMoves.length = 7;
prevStamp.length = 7;
ret.push(buildMoveMsg(moveCnt, prevMoves, prevStamp));
if (moveCnt % 5 == 4) {
ret.push(buildCubeMsg(moveCnt, cc1));
}
return [cc1.toFaceCube(), ret];
}

function buildMoveMsg(cnt, prevMoves, prevStamp) {
var ret = [];
ret.push('0010');
ret.push((cnt & 0xff | 0x100).toString(2).slice(1));
for (var i = 0; i < 7; i++) {
ret.push((prevMoves[i] & 0x1f | 0x20).toString(2).slice(1));
}
for (var i = 0; i < 7; i++) {
ret.push((prevStamp[i] & 0xffff | 0x10000).toString(2).slice(1));
}
ret.push('0');
return ret.join('');
}

function buildCubeMsg(cnt, cc) {
var ret = [];
ret.push('0100');
ret.push((cnt & 0xff | 0x100).toString(2).slice(1));
for (var i = 0; i < 7; i++) {
ret.push((cc.ca[i] & 0x7 | 0x8).toString(2).slice(1));
}
for (var i = 0; i < 7; i++) {
ret.push((cc.ca[i] >> 3 & 0x3 | 0x4).toString(2).slice(1));
}
for (var i = 0; i < 11; i++) {
ret.push((cc.ea[i] >> 1 & 0xf | 0x10).toString(2).slice(1));
}
for (var i = 0; i < 11; i++) {
ret.push((cc.ea[i] & 0x1 | 0x2).toString(2).slice(1));
}
for (var i = 0; i < 58; i++) {
ret.push('0');
}
return ret.join('');
}

function bin2arr(val) {
var ret = [];
for (var i = 0; i < val.length; i+=8) {
ret.push(parseInt(val.slice(i, i + 8), 2));
}
return new DataView(new Uint8Array(ret).buffer);
}

var keymap = {
74: 0, //U
70: 2, //U'
73: 3, //R
75: 5, //R'
72: 6, //F
71: 8, //F'
83: 9, //D
76: 11, //D'
68: 12, //L
69: 14, //L'
87: 15, //B
79: 17 //B'
}

function keydown(signal, value) {
var code = value.which;
var m = keymap[code];
if (m !== undefined) {
var val = procMove(m, state);
state = val[0];
for (var i = 0; i < val[1].length; i++) {
// console.log(bin2arr(val[1][i]));
$.parseV2Data(bin2arr(val[1][i]));
}
}
}

$(function() {
kernel.regListener('bleHacker', 'keydown', keydown);
});
})();
88 changes: 88 additions & 0 deletions experiment/puzzleAnalyze.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
var puzzleAnalyzer = (function() {
"use strict";

function getPuzzle(puzzle) {
if (typeof(puzzle) == 'string') {
var chk = poly3d.getFamousPuzzle(puzzle);
var param = chk ? chk.polyParam : poly3d.parsePolyParam(puzzle);
puzzle = poly3d.makePuzzle.apply(poly3d, param);
}
return puzzle;
}

function fixMoveTable(puzzle, moveTable, rotTable) {
for (var i = 0; i < puzzle.moveTable.length; i++) {
var curPerm = puzzle.moveTable[i];
var isRotate = true;
for (var j = 0; j < curPerm.length; j++) {
if (curPerm[j] == -1) {
curPerm[j] = j;
isRotate = false;
}
}
if (isRotate) {
rotTable.push(curPerm);
} else {
moveTable.push(curPerm);
}
}
return [moveTable, rotTable];
}

function countState(puzzle) {
puzzle = getPuzzle(puzzle);
var moveTable = [];
var rotTable = [];
fixMoveTable(puzzle, moveTable, rotTable);
var moverot = new grouplib.SchreierSims(moveTable.concat(rotTable));
console.log('Move+Rot=', moverot.size(true));
var move = new grouplib.SchreierSims(moveTable);
console.log('Move=', move.size(true));
var rot = new grouplib.SchreierSims(rotTable);
console.log('Rot=', rot.size(true));
console.log('(Move+Rot)/Rot=', moverot.size(true) / rot.size(true));
return moverot.size(true) / rot.size(true);
}

function countCanonSeqs(puzzle, depth, canonDepth) {
puzzle = getPuzzle(puzzle);
var moveTable = [];
var rotTable = [];
fixMoveTable(puzzle, moveTable, rotTable);
//expand move table
var validMoves = [];
var isVisited = {};
for (var i = 0; i < moveTable.length; i++) {
var curPerm = moveTable[i];
var perm = curPerm.slice();
var pow = 1;
while (true) {
var hash = perm.join(',');
if (!(hash in isVisited)) {
isVisited[hash] = 1;
validMoves.push(perm.slice());
}
var isIdent = true;
for (var j = 0; j < curPerm.length; j++) {
perm[j] = curPerm[perm[j]];
if (perm[j] != j) {
isIdent = false;
}
}
if (isIdent) {
break;
}
pow++;
}
}
console.log(validMoves);
var canon = new grouplib.CanonSeqGen(validMoves);
canon.initTrie(canonDepth || 2);
console.log(canon.countSeq(depth, true));
}

return {
countState: countState,
countCanonSeqs: countCanonSeqs
}
})();
25 changes: 10 additions & 15 deletions src/js/lib/grouplib.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,17 +170,11 @@ var grouplib = (function(rn) {
}
}

SchreierSims.prototype.size = function() {
SchreierSims.prototype.size = function(accuracy) {
var n = this.sgs.length;
var size = 1;
var size = accuracy ? BigInt(1) : 1;
for (var j = 0; j < n; j++) {
var cnt = 0;
for (var k = 0; k < n; k++) {
if (this.sgs[j][k]) {
cnt++;
}
}
size *= cnt;
size *= accuracy ? BigInt(this.i2t[j].length) : this.i2t[j].length;
}
return size;
}
Expand Down Expand Up @@ -586,22 +580,23 @@ var grouplib = (function(rn) {
}.bind(this));
}

CanonSeqGen.prototype.countSeq = function(depth) {
var counts = [0, 1];
var ret = [1];
CanonSeqGen.prototype.countSeq = function(depth, accuracy) {
var ZERO = accuracy ? BigInt(0) : 0;
var counts = accuracy ? [BigInt(0), BigInt(1)] : [0, 1];
var ret = accuracy ? [BigInt(0), BigInt(1)] : [1];
for (var d = 0; d < depth; d++) {
var newCounts = [];
var depthCnt = 0;
var depthCnt = ZERO;
for (var node = 1; node < this.trieNodes.length; node++) {
var curCount = counts[node] || 0;
var curCount = counts[node] || ZERO;
if (curCount == 0) {
continue;
}
for (var i = 0; i < this.glen; i++) {
var next = ~~this.trieNodes[node][i];
if (next != -1) {
next = next < 0 ? ~next : next;
newCounts[next] = (newCounts[next] || 0) + curCount;
newCounts[next] = (newCounts[next] || ZERO) + curCount;
depthCnt += curCount;
}
}
Expand Down

0 comments on commit 1898dca

Please sign in to comment.