Beginner method vs CFOP on 2,000 shared random scrambles: average moves and turns per second needed for a 10 s solve
- Status
- RUNNING
- Started
- Sessions
- 1
Goal
How many moves does a beginner layer-by-layer method need compared with CFOP on the same random scrambles, and what turns per second (TPS) does each need for a 10 second solve? Speed claims without move counts annoy me. The reader gets a table of mean, median and spread of move counts per method, measured on identical scrambles, plus the TPS that each mean implies at 10 s. It also gives a measured gap against the 20-move optimum, which I can check against Rokicki et al.
Plan
1. Write a pure Python 3.13 cube model (54 stickers, face turns, half-turn metric and quarter-turn metric). Test it: each move has order 4, R U R' U' repeated 6 times returns to solved, and 1,000 random 20-move scrambles keep a valid piece permutation and orientation parity. 2. Generate 2,000 random-state scrambles with a seeded generator that draws uniform permutations and orientations with the legal parity constraints. Do not use random-move scrambles. Save the seed and scrambles to the workspace. 3. Implement two solvers in code with no network. (a) Beginner layer-by-layer: cross, corners, middle edges, last layer, with the standard textbook algorithms. (b) CFOP-style: cross by short breadth-first search, F2L pairs by a depth-limited search per pair, OLL and PLL by lookup of the 57 and 21 cases generated from the group by search over a small algorithm list. If full OLL and PLL tables do not fit in time, say so, and use a documented optimal search for the last layer as a lower bound, labelled as such. 4. Verify every solution by applying it to its scramble and checking for the solved state. Count any failure and report it. 5. Report mean, median, 5th and 95th percentile moves per method and per stage, in half-turn metric. Compute TPS needed for 10 s and for 15 s per mean. Draw a bar chart and a histogram. Add a table of stage moves. 6. Success: both solvers pass 100% verification on 2,000 scrambles, and I report the means with a bootstrap 95% interval. Failure: if a solver fails on more than 1% of scrambles or cannot be finished, report that as a result and give the stage where it breaks. Compare the CFOP mean with the 50 to 60 move range from my 2026-10-05 post and say whether the data back it.
Outputs
Outputs
No output files have been attached.
You can inspect the steps below, including any recorded errors.
Step log
You can reload this page to check for new steps.
1. Write a pure Python 3.13 cube model (54 stickers, face turns, half-turn metric and quarter-turn metric). Test it: each move has order 4, R U R' U' repeated 6 times returns to solved, and 1,000 random 20-move scrambles keep a valid piece permutation and orientation parity. 2. Generate 2,000 random-state scrambles with a seeded generator that draws uniform permutations and orientations with the legal parity constraints. Do not use random-move scrambles. Save the seed and scrambles to the workspace. 3. Implement two solvers in code with no network. (a) Beginner layer-by-layer: cross, corners, middle edges, last layer, with the standard textbook algorithms. (b) CFOP-style: cross by short breadth-first search, F2L pairs by a depth-limited search per pair, OLL and PLL by lookup of the 57 and 21 cases generated from the group by search over a small algorithm list. If full OLL and PLL tables do not fit in time, say so, and use a documented optimal search for the last layer as a lower bound, labelled as such. 4. Verify every solution by applying it to its scramble and checking for the solved state. Count any failure and report it. 5. Report mean, median, 5th and 95th percentile moves per method and per stage, in half-turn metric. Compute TPS needed for 10 s and for 15 s per mean. Draw a bar chart and a histogram. Add a table of stage moves. 6. Success: both solvers pass 100% verification on 2,000 scrambles, and I report the means with a bootstrap 95% interval. Failure: if a solver fails on more than 1% of scrambles or cannot be finished, report that as a result and give the stage where it breaks. Compare the CFOP mean with the 50 to 60 move range from my 2026-10-05 post and say whether the data back it.
Session 1 failed. The run is logged for the operator.
$ which gcc cc tcc clang g++ rustc go; nproc; python3 -c "import numba" 2>&1 | tail -1 exit 0 after 0.6 s 16 ModuleNotFoundError: No module named 'numba'
$ cd /work && python3 cube.py | tee tests.txt exit 0 after 0.4 s
$ cd /work && sed -i 's/\[UB, UR, UL, UF, DR, DF, DL, DB, FR, FL, BL, BR\], \[0\]\*12),/[UB, UR, UF, UL, DR, DF, DL, DB, FR, FL, BL, BR], [0]*12),/' cube.py && python3 cube.py | tee tests.txt exit 0 after 0.5 s each of 6 face turns has order 4: PASS (R U R' U')^6 = solved, powers 1 to 5 not solved: PASS order of R U is 105: PASS 1000 random 20-move scrambles keep valid permutations and parities: PASS 1000 random-state samples valid: PASS saved 2000 scrambles, seed 20261005
The command failed. The run is logged for the operator.
$ cd /work && cat > t1.js <<'EOF' const fs=require('fs'); let src=fs.readFileSync('/work/solver.js','utf8'); src=src.replace("for (let d = 1; d <= 7; d++) {","for (let d = 1; d <= +process.env.D; d++) {").replace("pairs++;","pairs++; if(pairs>3e7) throw new Error('too many pairs');"); src=src.replace("if (require.main === module)","if (false)"); src+="\nconsole.time('b');buildLL();console.timeEnd('b');console.log(LL.nstates,LL.pairs,LL.table.size);"; fs.writeFileSync('/work/t1_run.js',src); EOF node t1.js && for D in 5 6; do D=$D node --max-old-space-size=1500 t1_run.js 2>&1 | tail -3; done exit 0 after 1.0 s b: 80.922ms 13996 36144 602 b: 475.661ms 83965 230601 3069$ cd /work && D=7 node --max-old-space-size=1500 t1_run.js 2>&1 | tail -3 cat > t2.js <<'EOF' const fs=require('fs'); let src=fs.readFileSync('/work/solver.js','utf8').replace("if (require.main === module)","if (false)"); src+=` const data=JSON.parse(fs.readFileSync('/work/scrambles.json')); const s0=flat(data.scrambles[0]); console.time('cross');const crossTab=getTable([],CROSS,12);console.timeEnd('cross'); const cp=solveT(s0,crossTab,0);console.log('cross',cp.length);let s=applyPath(s0,cp); for(let j=0;j<4;j++){console.time('pt'+j);const t=pairTab(0,j);console.timeEnd('pt'+j);console.log(t.map.size);} console.time('beg');try{const r=solveBeginner(s0);console.log(Object.keys(r).map(k=>k+':'+r[k].length).join(' '));}catch(e){console.log(e)}console.timeEnd('beg'); `; fs.writeFileSync('/work/t2_run.js',src); EOF node t2.js && node --max-old-space-size=1800 t2_run.js 2>&1 | tail -20 exit 0 after 9.9 s b: 3.623s 503491 1485345 19380 cross: 1.597s cross 4 pt0: 341.841ms 244041 pt1: 572.803ms 380906 pt2: 698.579ms 460803 pt3: 754.66ms 499136 cross:7 corners:41 middle:35 ll_edges:6 ll_corner_or:21 ll_corner_perm:32 ll_edge_perm:22 beg: 1.812s$ cd /work && cat > t3.js <<'EOF' const fs=require('fs'); let src=fs.readFileSync('/work/solver.js','utf8').replace("if (require.main === module)","if (false)"); src+=` const data=JSON.parse(fs.readFileSync('/work/scrambles.json')); buildLL(); console.log('LL',process.memoryUsage().heapUsed/1e6); // coverage of OLL/PLL let okO=0,okP=0; for(let i=0;i<5;i++){const s0=flat(data.scrambles[i]); console.time('cfop'+i);try{const r=solveCFOP(s0);console.log(r.cross.length,r.f2l.map(x=>x.length).join('+'),r.oll.length,r.pll.length);}catch(e){console.log('ERR',e.message)}console.timeEnd('cfop'+i); console.log('mem',process.memoryUsage().heapUsed/1e6);} `; fs.writeFileSync('/work/t3_run.js',src); EOF node t3.js && node --max-old-space-size=1800 t3_run.js 2>&1 | tail -30 exit 0 after 32.5 s [...]heap out of memory ----- Native stack trace ----- 1: 0xe46bbe node::OOMErrorHandler(char const*, v8::OOMDetails const&) [node] 2: 0x1245390 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node] 3: 0x1245667 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node] 4: 0x1474575 [node] 5: 0x148de09 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node] 6: 0x1462508 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node] 7: 0x1463435 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [node] 8: 0x143c03e v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [node] 9: 0x189e94c v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [node] 10: 0x1dfeaf6 [node]$ cd /work && python3 - <<'EOF' src=open('solver.js').read() a=src.index('function solveT(') b=src.index('const nm = p') new='''function solveT(s, tab, maxF) { const { kf, map } = tab; let best = null, bt = 1e9; const stack = []; function dfs(st, rem, prev) { if (rem === 0) { const v = map.get(kf(st)); if (v !== undefined) { const tot = rec + Math.floor(v / 18); if (tot < bt) { bt = tot; best = { fw: stack.slice(), st }; } } return; } const pf = prev < 0 ? -1 : Math.floor(prev / 3); for (let m = 0; m < 18; m++) { const f = Math.floor(m / 3); if (f === pf) continue; if (pf >= 0 && f === (pf + 3) % 6 && f < pf) continue; stack.push(m); dfs(mul(st, MV[m]), rem - 1, m); stack.pop(); } } let rec = 0; for (let d = 0; d <= maxF; d++) { rec = d; dfs(s, d, -1); if (best && bt <= d + 1) break; } if (!best) return null; const path = best.fw.slice(); let cur = best.st, v = map.get(kf(cur));Show 25 more lines
while (Math.floor(v / 18) > 0) { const im = invIdx(v % 18); path.push(im); cur = mul(cur, MV[im]); v = map.get(kf(cur)); } return path; } ''' open('solver.js','w').write(src[:a]+new+src[b:]) EOF sed -i 's/pairTab(st, 0), 6)/pairTab(st, 0), 5)/; s/pairTab(bestStart, j), 6)/pairTab(bestStart, j), 5)/' solver.js node t3.js && node --max-old-space-size=1800 t3_run.js 2>&1 | tail -30 exit 0 after 25.1 s LL 246.01124 4 3+7+7+7 9 12 cfop0: 7.020s mem 519.607448 6 4+6+6+7 9 14 cfop1: 4.374s mem 464.260496 5 5+8+6+7 7 13 cfop2: 2.672s mem 465.616344 6 6+7+8+6 12 12 cfop3: 4.889s mem 670.656824 ERR LL cfop4: 2.291s mem 672.872408$ cd /work && python3 - <<'EOF' src=open('solver.js').read() src=src.replace("function buildLL() {\n const gens = [0,1,2,3,4,5,6,7,8]; // U,R,F with all 3 turns","function buildLL(gf, DEP) {\n const gens = []; for (let m = 0; m < 18; m++) if (gf.includes(FACES[Math.floor(m/3)])) gens.push(m);") src=src.replace("for (let d = 1; d <= 7; d++) {","for (let d = 1; d <= DEP; d++) {") src=src.replace("buildLL(); console.error","buildLL(process.env.GF||'URF', +(process.env.DEP||7)); console.error") open('solver.js','w').write(src) EOF cat > t4.js <<'EOF' const fs=require('fs'); let src=fs.readFileSync('/work/solver.js','utf8').replace("if (require.main === module)","if (false)"); src+=` const [gf,dep]=[process.argv[2],+process.argv[3]]; console.time('b');buildLL(gf,dep);console.timeEnd('b');console.log(gf,dep,LL.nstates,LL.table.size,process.memoryUsage().heapUsed/1e6); // random LL states: random scramble, apply solve of F2L? just construct random LL element by random <R,U,F>-like? use random state with F2L reset: const data=JSON.parse(fs.readFileSync('/work/scrambles.json')); let ok=0,n=0,sumO=0,sumP=0,okP=0; for(let i=0;i<300;i++){ const r=flat(data.scrambles[i]); const s=new Int8Array(ID); for(let k=0;k<4;k++){s[k]=r[k];s[8+k]=r[8+k];s[16+k]=r[16+k];s[28+k]=r[28+k];} // fix: need permutation of 0..3 for positions: map pieces const cp=[...r.slice(0,8)].filter(x=>x<4),ep=[...r.slice(16,28)].filter(x=>x<4); // build LL state with the relative order of top pieces (parity may be invalid; skip if parity mismatch handled below) let ci=0,ei=0,co=[],eo=[];for(let k=0;k<8;k++){if(r[k]<4){s[ci]=r[k];co.push(r[8+k]);ci++;}} for(let k=0;k<12;k++){if(r[16+k]<4){s[16+ei]=r[16+k];eo.push(r[28+k]);ei++;}} for(let k=0;k<4;k++){s[8+k]=co[k];s[28+k]=eo[k];} const sum=co.reduce((a,b)=>a+b,0)%3; s[8]=(s[8]+3-sum)%3; const so=eo.reduce((a,b)=>a+b,0)&1; s[28]^=so; // parity const par=p=>{let c=0;for(let a=0;a<4;a++)for(let b=a+1;b<4;b++)if(p[a]>p[b])c^=1;return c}; if(par([...s.slice(0,4)])!==par([...s.slice(16,20)])){const t=s[16];s[16]=s[17];s[17]=t;} n++; const w=solveLL(s); if(w){ok++;sumO+=w.oll.length;sumP+=w.pll.length;} }Show 18 more lines
console.log('success',ok,'/',n,'mean OLL',sumO/ok,'mean PLL',sumP/ok); `; fs.writeFileSync('/work/t4_run.js',src); EOF node t4.js; for cfg in "URF 7" "URFL 6" "URFLD 5" "URFLDB 5"; do timeout 250 node --max-old-space-size=1800 t4_run.js $cfg 2>&1 | tail -4; done exit 0 after 12.8 s b: 3.378s URF 7 503491 19380 286.387576 success 193 / 300 mean OLL 10.088082901554404 mean PLL 12.699481865284975 b: 3.193s URFL 6 505482 6581 294.120704 success 105 / 300 mean OLL 9.733333333333333 mean PLL 10.123809523809523 b: 1.237s URFLD 5 217011 1184 137.004192 success 45 / 300 mean OLL 9.066666666666666 mean PLL 9.844444444444445 b: 4.148s URFLDB 5 621649 1804 318.71692 success 84 / 300 mean OLL 9.071428571428571 mean PLL 9.404761904761905$ cd /work && python3 - <<'EOF' src=open('solver.js').read() a=src.index('function buildLL(') b=src.index('function llWord') new='''function buildLL(gf, DA, DB) { const gens = []; for (let m = 0; m < 18; m++) if (gf.includes(FACES[Math.floor(m / 3)])) gens.push(m); const st = [ID], par = [-1], mv = [-1], idx = new Map([[skey(ID), 0]]); let ls = 0, le = 1; for (let d = 1; d <= DB; d++) { for (let i = ls; i < le; i++) for (const m of gens) { if (mv[i] >= 0 && Math.floor(mv[i] / 3) === Math.floor(m / 3)) continue; const t = mul(st[i], MV[m]); const k = skey(t); if (!idx.has(k)) { idx.set(k, st.length); st.push(t); par.push(i); mv.push(m); } } ls = le; le = st.length; } const word = i => { const w = []; for (; par[i] >= 0; i = par[i]) w.push(mv[i]); return w.reverse(); }; const depth = i => { let n = 0; for (; par[i] >= 0; i = par[i]) n++; return n; }; const dp = st.map((_, i) => 0); for (let i = 1; i < st.length; i++) dp[i] = dp[par[i]] + 1; const f2c = [4,5,6,7], f2e = [4,5,6,7,8,9,10,11]; const kB = b => { const d = []; for (const i of f2c) d.push(b[i], b[8 + i]); for (const i of f2e) d.push(b[16 + i], b[28 + i]); return String.fromCharCode.apply(null, d); }; const pc = new Array(8), pe = new Array(12); const kA = a => { for (let i = 0; i < 8; i++) pc[a[i]] = i; for (let i = 0; i < 12; i++) pe[a[16 + i]] = i; const d = []; for (const i of f2c) { const p = pc[i]; d.push(p, (3 - a[8 + p]) % 3); } for (const i of f2e) { const p = pe[i]; d.push(p, a[28 + p]); } return String.fromCharCode.apply(null, d); }; const mapB = new Map(); for (let i = 0; i < st.length; i++) { const k = kB(st[i]); let l = mapB.get(k); if (!l) mapB.set(k, l = []); l.push(i); } const llKey = c => String.fromCharCode(c[0],c[1],c[2],c[3],c[8],c[9],c[10],c[11],c[16],c[17],c[18],c[19],c[28],c[29],c[30],c[31]);Show 39 more lines
const table = new Map(); let pairs = 0; const stack = []; function visit(a, d, prev) { const l = mapB.get(kA(a)); if (l) for (const ib of l) { pairs++; const len = d + dp[ib]; const c = mul(a, st[ib]); const k = llKey(c); const o = table.get(k); if (!o || len < o.len) table.set(k, { len, aw: stack.slice(), ib }); } if (d === DA) return; const pf = prev < 0 ? -1 : Math.floor(prev / 3); for (const m of gens) { const f = Math.floor(m / 3); if (f === pf) continue; stack.push(m); visit(mul(a, MV[m]), d + 1, m); stack.pop(); } } visit(ID, 0, -1); const perms4 = []; (function gen(a, r) { if (!r.length) { perms4.push(a); return; } for (let i = 0; i < r.length; i++) gen(a.concat([r[i]]), r.filter((_, j) => j !== i)); })([], [0,1,2,3]); const par4 = p => { let c = 0; for (let i = 0; i < 4; i++) for (let j = i + 1; j < 4; j++) if (p[i] > p[j]) c ^= 1; return c; }; const T = []; for (const pc2 of perms4) for (const pe2 of perms4) if (par4(pc2) === par4(pe2)) { const t = new Int8Array(ID); for (let i = 0; i < 4; i++) { t[i] = pc2[i]; t[16 + i] = pe2[i]; } T.push(t); } LL = { word, table, llKey, T, nstates: st.length, pairs }; } ''' src=src[:a]+new+src[b:] src=src.replace("return LL.word(e.ia).concat(LL.word(e.ib));","return e.aw.concat(LL.word(e.ib));") src=src.replace("buildLL(process.env.GF||'URF', +(process.env.DEP||7))","buildLL(process.env.GF||'URF', +(process.env.DA||8), +(process.env.DB||7))") open('solver.js','w').write(src) EOF sed -i 's/const \[gf,dep\]=\[process.argv\[2\],+process.argv\[3\]\];/const gf=process.argv[2],dep=+process.argv[3],dbb=+process.argv[4];/; s/buildLL(gf,dep)/buildLL(gf,dep,dbb)/' t4.js && node t4.js && for cfg in "URF 8 7" "URF 9 6"; do timeout 280 node --max-old-space-size=1800 t4_run.js $cfg 2>&1 | tail -4; done exit 0 after 24.1 s b: 7.588s URF 8 503491 39530 305.239928 success 289 / 300 mean OLL 10.03114186851211 mean PLL 13.463667820069205 b: 15.715s URF 9 83965 39530 63.231104 success 289 / 300 mean OLL 10.03114186851211 mean PLL 13.463667820069205The command failed. The run is logged for the operator.
$ cd /work && for cfg in "URF 9 7" "URF 10 6"; do s=$(date +%s); timeout 140 node --max-old-space-size=1800 t4_run.js $cfg 2>&1 | egrep "URF|success"; echo $(( $(date +%s)-s )) s; done exit 0 after 106.2 s URF 9 503491 57316 251.026568 success 300 / 300 mean OLL 10.053333333333333 mean PLL 13.556666666666667 24 s URF 10 83965 57316 67.223712 success 300 / 300 mean OLL 10.053333333333333 mean PLL 13.556666666666667 82 s
$ cd /work && sed -i 's/if (best \&\& bt <= d + 1) break;/if (best) break;/' solver.js && grep -n "if (best) break" solver.js && sed -i "s/process.env.DA||8/process.env.DA||9/" solver.js && cat > t5.js <<'EOF' const fs=require('fs'); let src=fs.readFileSync('/work/solver.js','utf8').replace("if (require.main === module)","if (false)"); src+=` const data=JSON.parse(fs.readFileSync('/work/scrambles.json')); buildLL('URF',9,7); let tc=0,tb=0,N=40;const tot=[]; for(let i=0;i<N;i++){const s0=flat(data.scrambles[i]); let t=Date.now();let r=solveCFOP(s0);tc+=Date.now()-t; t=Date.now();let b=solveBeginner(s0);tb+=Date.now()-t; tot.push([r.cross.length+r.f2l.reduce((a,x)=>a+x.length,0)+r.oll.length+r.pll.length, Object.values(b).reduce((a,x)=>a+x.length,0)]);} console.log('cfop s/solve',tc/N/1000,'beg s/solve',tb/N/1000); console.log('mean cfop',tot.reduce((a,x)=>a+x[0],0)/N,'mean beg',tot.reduce((a,x)=>a+x[1],0)/N, 'mem',process.memoryUsage().heapUsed/1e6); `; fs.writeFileSync('/work/t5_run.js',src); EOF node t5.js && timeout 280 node --max-old-space-size=1800 t5_run.js 2>&1 | tail exit 0 after 64.7 s 68: if (best) break; cfop s/solve 0.293 beg s/solve 0.7123250000000001 mean cfop 53.075 mean beg 150.85 mem 1086.428744$ cd /work && python3 - <<'EOF' src=open('solver.js').read() src=src.replace(" LL = { word, table, llKey, T, nstates: st.length, pairs };"," const nst = st.length; st.length = 0; mapB.clear(); idx.clear(); dp.length = 0;\n LL = { word, table, llKey, T, nstates: nst, pairs };") open('solver.js','w').write(src) EOF mkdir -p out && (for r in "0 20 out/t0.json" "20 40 out/t1.json"; do (s=$(date +%s); <path> node --max-old-space-size=950 solver.js $r 2>&1 | tail -2; echo took $(( $(date +%s)-s ))) & done; wait); python3 -c " import json r=json.load(open('/work/out/t0.json'));print(len(r),[ (x.get('cfop_err'),x.get('beg_err')) for x in r][:3])" exit 0 after 70.3 s done 20 7.243 0.368 done 30 0.007 0.058 took 62 done 0 6.886 2.679 done 10 0.001 2.247 took 70 20 [(None, None), (None, None), (None, None)]$ cd /work && for r in "40 230 out/c1.json" "230 420 out/c2.json"; do (node --max-old-space-size=950 solver.js $r 2>&1 | tail -1) & done; wait; ls -la out exit 0 after 104.3 s done 410 0.001 0.025 done 220 0.008 0.031 total 468 drwxr-xr-x 2 - - 4096 Oct 5 18:42 . drwxr-x--- 3 - - 4096 Oct 5 18:39 .. -rw-r--r-- 1 - - 210871 Oct 5 18:42 c1.json -rw-r--r-- 1 - - 208888 Oct 5 18:42 c2.json -rw-r--r-- 1 - - 22339 Oct 5 18:40 t0.json -rw-r--r-- 1 - - 22468 Oct 5 18:40 t1.json
$ cd /work && for r in "420 880 out/c3.json" "880 1340 out/c4.json"; do (node --max-old-space-size=950 solver.js $r 2>&1 | tail -1) & done; wait; ls out exit 0 after 117.9 s done 870 0.007 0.024 done 1330 0.007 0.048 c1.json c2.json c3.json c4.json t0.json t1.json
$ cd /work && for r in "1340 1670 out/c5.json" "1670 2000 out/c6.json"; do (node --max-old-space-size=950 solver.js $r 2>&1 | tail -1) & done; wait; ls out exit 0 after 102.1 s done 1990 0.006 0.035 done 1660 0.001 0.085 c1.json c2.json c3.json c4.json c5.json c6.json t0.json t1.json
$ cd /work && rm -f out/t0.json out/t1.json && python3 - <<'EOF' import json # restore the first 40 scrambles from a fresh small run later if needed EOF ls out; node --max-old-space-size=950 solver.js 0 40 out/c0.json 2>&1 | tail -1 && python3 analyze.py 2>&1 | tee analysis.txt exit 0 after 73.2 s [...]2.29,53.0,3.92,45.0,58.0,33,61,5.21,3.47 cfop,qtm,67.63,67.33,67.93,68.0,6.82,57.0,79.0,43,90,6.76,4.51 beg,total,145.89,145.06,146.69,148.0,18.59,111.0,172.0,69,201,14.59,9.73 beg,merged,131.39,130.58,132.19,134.0,18.45,98.0,158.0,56,184,13.14,8.76 beg,qtm,153.39,152.53,154.25,156.0,19.27,118.0,181.0,76,212,15.34,10.23 method,stage,mean,median,p5,p95 cfop,cross,5.83,6.0,4.0,7.0 cfop,f2l1,5.02,5.0,3.0,6.0 cfop,f2l2,6.23,6.0,5.0,8.0 cfop,f2l3,6.19,6.0,4.0,8.0 cfop,f2l4,6.66,7.0,4.0,8.0 cfop,oll,10.22,11.0,7.0,12.0 cfop,pll,13.30,14.0,11.0,15.0 beg,cross,8.54,9.0,6.0,11.0 beg,corners,32.03,32.0,21.0,43.0 beg,middle,35.44,35.0,25.0,44.0 beg,ll_edges,9.89,12.0,0.0,18.0 beg,ll_corner_or,15.75,14.0,7.0,21.0 beg,ll_corner_perm,27.59,33.0,1.0,33.0 beg,ll_edge_perm,16.65,22.0,0.0,22.0 paired diff beg-cfop mean 92.4425 [91.629475 93.2765125] ratio 2.729545922281053 cfop in 50..60: 0.8695 below 50 0.1225 above 60 0.008 cfop gap vs 20: 33.449 x 2.67245 beg gap 125.89150000000001 7.294575 corr cfop vs beg totals 0.01214168299910517
Show 3 more lines
solver sec 0.05865199999999999 cfop merged mean 52.12 TPS10 5.212 TPS15 3.4746666666666663 beg merged mean 131.3935 TPS10 13.139349999999999 TPS15 8.759566666666666