Skip to content

Commit 1898dca

Browse files
committed
clean up
1 parent b16d749 commit 1898dca

File tree

3 files changed

+259
-15
lines changed

3 files changed

+259
-15
lines changed

experiment/bleHack.js

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
DEBUGBL = true;
2+
3+
var bleHacker = (function() {
4+
//moves = [[move, timestamp], [], ..., []]
5+
//return [finalState, msgs]
6+
function moves2rawmsg(moves, initState) {
7+
var cc1 = new mathlib.CubieCube();
8+
var cc2 = new mathlib.CubieCube();
9+
cc1.fromFacelet(initState);
10+
var prevMoves = [0, 0, 0, 0, 0, 0, 0];
11+
var prevStamp = [0, 0, 0, 0, 0, 0, 0];
12+
var ret = [];
13+
var cnt = 100;
14+
var prevts = 0;
15+
for (var i = 0; i < moves.length; i++) {
16+
var m = moves[i][0];
17+
var curTs = moves[i][1];
18+
mathlib.CubieCube.EdgeMult(cc1, mathlib.CubieCube.moveCube[m], cc2);
19+
mathlib.CubieCube.CornMult(cc1, mathlib.CubieCube.moveCube[m], cc2);
20+
var tmp = cc1;
21+
cc1 = cc2;
22+
cc2 = tmp;
23+
var axis = ~~(m / 3);
24+
var pow = m % 3;
25+
if (pow == 0 || pow == 2) {
26+
prevMoves.unshift(axis << 1 | pow >> 1);
27+
prevStamp.unshift(curTs - prevts);
28+
cnt++;
29+
} else {
30+
prevMoves.unshift(axis << 1 | 0);
31+
prevMoves.unshift(axis << 1 | 0);
32+
prevStamp.unshift(curTs - prevts);
33+
prevStamp.unshift(curTs - prevts);
34+
cnt += 2;
35+
}
36+
prevMoves.length = 7;
37+
prevStamp.length = 7;
38+
ret.push(buildMoveMsg(cnt, prevMoves, prevStamp));
39+
if (i % 2 == 1) {
40+
ret.push(buildCubeMsg(cnt, cc1));
41+
}
42+
}
43+
return [cc1.toFaceCube(), ret];
44+
}
45+
46+
var prevMoves = [0, 0, 0, 0, 0, 0, 0];
47+
var prevStamp = [0, 0, 0, 0, 0, 0, 0];
48+
var cc1 = new mathlib.CubieCube();
49+
var cc2 = new mathlib.CubieCube();
50+
var moveCnt = 0;
51+
var prevTs = 0;
52+
var state = mathlib.SOLVED_FACELET;
53+
54+
function procMove(move, state) {
55+
cc1.fromFacelet(state);
56+
var curTs = $.now();
57+
mathlib.CubieCube.EdgeMult(cc1, mathlib.CubieCube.moveCube[move], cc2);
58+
mathlib.CubieCube.CornMult(cc1, mathlib.CubieCube.moveCube[move], cc2);
59+
var tmp = cc1;
60+
cc1 = cc2;
61+
cc2 = tmp;
62+
var axis = ~~(move / 3);
63+
var pow = move % 3;
64+
var ret = [];
65+
if (pow == 0 || pow == 2) {
66+
prevMoves.unshift(axis << 1 | pow >> 1);
67+
prevStamp.unshift(curTs - prevTs);
68+
moveCnt++;
69+
} else {
70+
prevMoves.unshift(axis << 1 | 0);
71+
prevMoves.unshift(axis << 1 | 0);
72+
prevStamp.unshift(curTs - prevTs);
73+
prevStamp.unshift(curTs - prevTs);
74+
moveCnt += 2;
75+
}
76+
prevTs = curTs;
77+
prevMoves.length = 7;
78+
prevStamp.length = 7;
79+
ret.push(buildMoveMsg(moveCnt, prevMoves, prevStamp));
80+
if (moveCnt % 5 == 4) {
81+
ret.push(buildCubeMsg(moveCnt, cc1));
82+
}
83+
return [cc1.toFaceCube(), ret];
84+
}
85+
86+
function buildMoveMsg(cnt, prevMoves, prevStamp) {
87+
var ret = [];
88+
ret.push('0010');
89+
ret.push((cnt & 0xff | 0x100).toString(2).slice(1));
90+
for (var i = 0; i < 7; i++) {
91+
ret.push((prevMoves[i] & 0x1f | 0x20).toString(2).slice(1));
92+
}
93+
for (var i = 0; i < 7; i++) {
94+
ret.push((prevStamp[i] & 0xffff | 0x10000).toString(2).slice(1));
95+
}
96+
ret.push('0');
97+
return ret.join('');
98+
}
99+
100+
function buildCubeMsg(cnt, cc) {
101+
var ret = [];
102+
ret.push('0100');
103+
ret.push((cnt & 0xff | 0x100).toString(2).slice(1));
104+
for (var i = 0; i < 7; i++) {
105+
ret.push((cc.ca[i] & 0x7 | 0x8).toString(2).slice(1));
106+
}
107+
for (var i = 0; i < 7; i++) {
108+
ret.push((cc.ca[i] >> 3 & 0x3 | 0x4).toString(2).slice(1));
109+
}
110+
for (var i = 0; i < 11; i++) {
111+
ret.push((cc.ea[i] >> 1 & 0xf | 0x10).toString(2).slice(1));
112+
}
113+
for (var i = 0; i < 11; i++) {
114+
ret.push((cc.ea[i] & 0x1 | 0x2).toString(2).slice(1));
115+
}
116+
for (var i = 0; i < 58; i++) {
117+
ret.push('0');
118+
}
119+
return ret.join('');
120+
}
121+
122+
function bin2arr(val) {
123+
var ret = [];
124+
for (var i = 0; i < val.length; i+=8) {
125+
ret.push(parseInt(val.slice(i, i + 8), 2));
126+
}
127+
return new DataView(new Uint8Array(ret).buffer);
128+
}
129+
130+
var keymap = {
131+
74: 0, //U
132+
70: 2, //U'
133+
73: 3, //R
134+
75: 5, //R'
135+
72: 6, //F
136+
71: 8, //F'
137+
83: 9, //D
138+
76: 11, //D'
139+
68: 12, //L
140+
69: 14, //L'
141+
87: 15, //B
142+
79: 17 //B'
143+
}
144+
145+
function keydown(signal, value) {
146+
var code = value.which;
147+
var m = keymap[code];
148+
if (m !== undefined) {
149+
var val = procMove(m, state);
150+
state = val[0];
151+
for (var i = 0; i < val[1].length; i++) {
152+
// console.log(bin2arr(val[1][i]));
153+
$.parseV2Data(bin2arr(val[1][i]));
154+
}
155+
}
156+
}
157+
158+
$(function() {
159+
kernel.regListener('bleHacker', 'keydown', keydown);
160+
});
161+
})();

experiment/puzzleAnalyze.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
var puzzleAnalyzer = (function() {
2+
"use strict";
3+
4+
function getPuzzle(puzzle) {
5+
if (typeof(puzzle) == 'string') {
6+
var chk = poly3d.getFamousPuzzle(puzzle);
7+
var param = chk ? chk.polyParam : poly3d.parsePolyParam(puzzle);
8+
puzzle = poly3d.makePuzzle.apply(poly3d, param);
9+
}
10+
return puzzle;
11+
}
12+
13+
function fixMoveTable(puzzle, moveTable, rotTable) {
14+
for (var i = 0; i < puzzle.moveTable.length; i++) {
15+
var curPerm = puzzle.moveTable[i];
16+
var isRotate = true;
17+
for (var j = 0; j < curPerm.length; j++) {
18+
if (curPerm[j] == -1) {
19+
curPerm[j] = j;
20+
isRotate = false;
21+
}
22+
}
23+
if (isRotate) {
24+
rotTable.push(curPerm);
25+
} else {
26+
moveTable.push(curPerm);
27+
}
28+
}
29+
return [moveTable, rotTable];
30+
}
31+
32+
function countState(puzzle) {
33+
puzzle = getPuzzle(puzzle);
34+
var moveTable = [];
35+
var rotTable = [];
36+
fixMoveTable(puzzle, moveTable, rotTable);
37+
var moverot = new grouplib.SchreierSims(moveTable.concat(rotTable));
38+
console.log('Move+Rot=', moverot.size(true));
39+
var move = new grouplib.SchreierSims(moveTable);
40+
console.log('Move=', move.size(true));
41+
var rot = new grouplib.SchreierSims(rotTable);
42+
console.log('Rot=', rot.size(true));
43+
console.log('(Move+Rot)/Rot=', moverot.size(true) / rot.size(true));
44+
return moverot.size(true) / rot.size(true);
45+
}
46+
47+
function countCanonSeqs(puzzle, depth, canonDepth) {
48+
puzzle = getPuzzle(puzzle);
49+
var moveTable = [];
50+
var rotTable = [];
51+
fixMoveTable(puzzle, moveTable, rotTable);
52+
//expand move table
53+
var validMoves = [];
54+
var isVisited = {};
55+
for (var i = 0; i < moveTable.length; i++) {
56+
var curPerm = moveTable[i];
57+
var perm = curPerm.slice();
58+
var pow = 1;
59+
while (true) {
60+
var hash = perm.join(',');
61+
if (!(hash in isVisited)) {
62+
isVisited[hash] = 1;
63+
validMoves.push(perm.slice());
64+
}
65+
var isIdent = true;
66+
for (var j = 0; j < curPerm.length; j++) {
67+
perm[j] = curPerm[perm[j]];
68+
if (perm[j] != j) {
69+
isIdent = false;
70+
}
71+
}
72+
if (isIdent) {
73+
break;
74+
}
75+
pow++;
76+
}
77+
}
78+
console.log(validMoves);
79+
var canon = new grouplib.CanonSeqGen(validMoves);
80+
canon.initTrie(canonDepth || 2);
81+
console.log(canon.countSeq(depth, true));
82+
}
83+
84+
return {
85+
countState: countState,
86+
countCanonSeqs: countCanonSeqs
87+
}
88+
})();

src/js/lib/grouplib.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,11 @@ var grouplib = (function(rn) {
170170
}
171171
}
172172

173-
SchreierSims.prototype.size = function() {
173+
SchreierSims.prototype.size = function(accuracy) {
174174
var n = this.sgs.length;
175-
var size = 1;
175+
var size = accuracy ? BigInt(1) : 1;
176176
for (var j = 0; j < n; j++) {
177-
var cnt = 0;
178-
for (var k = 0; k < n; k++) {
179-
if (this.sgs[j][k]) {
180-
cnt++;
181-
}
182-
}
183-
size *= cnt;
177+
size *= accuracy ? BigInt(this.i2t[j].length) : this.i2t[j].length;
184178
}
185179
return size;
186180
}
@@ -586,22 +580,23 @@ var grouplib = (function(rn) {
586580
}.bind(this));
587581
}
588582

589-
CanonSeqGen.prototype.countSeq = function(depth) {
590-
var counts = [0, 1];
591-
var ret = [1];
583+
CanonSeqGen.prototype.countSeq = function(depth, accuracy) {
584+
var ZERO = accuracy ? BigInt(0) : 0;
585+
var counts = accuracy ? [BigInt(0), BigInt(1)] : [0, 1];
586+
var ret = accuracy ? [BigInt(0), BigInt(1)] : [1];
592587
for (var d = 0; d < depth; d++) {
593588
var newCounts = [];
594-
var depthCnt = 0;
589+
var depthCnt = ZERO;
595590
for (var node = 1; node < this.trieNodes.length; node++) {
596-
var curCount = counts[node] || 0;
591+
var curCount = counts[node] || ZERO;
597592
if (curCount == 0) {
598593
continue;
599594
}
600595
for (var i = 0; i < this.glen; i++) {
601596
var next = ~~this.trieNodes[node][i];
602597
if (next != -1) {
603598
next = next < 0 ? ~next : next;
604-
newCounts[next] = (newCounts[next] || 0) + curCount;
599+
newCounts[next] = (newCounts[next] || ZERO) + curCount;
605600
depthCnt += curCount;
606601
}
607602
}

0 commit comments

Comments
 (0)