Cubiq
Pelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama

- puzzle diselesaikan solver buatan saya
- 8
- algoritma di pelatih spaced-repetition
- 57 OLL, 21 PLL
- langkah optimal di 2×2, Pyraminx, dan Skewb
- ≤ 11
- rata-rata dihitung sesuai aturan WCA
- ao5–ao100
Di halaman ini
Masalahnya
Kebanyakan speedcuber serius masih mencatat waktu solve mereka di csTimer. Aplikasinya jalan, tapi tampilan dan rasanya seperti tahun 2008, dan fungsinya berhenti di pencatat waktu. Belum ada alat modern yang menggabungkan layar latihan yang enak dipakai dengan statistik yang layak dan bantuan untuk menyelesaikan puzzle.
Saya ingin satu tempat untuk berlatih, memantau perkembangan, dan bertanya "scramble ini seharusnya diselesaikan bagaimana?" untuk puzzle apa pun, dari 2×2 sampai Square-1. Cubiq dibuat untuk cuber tingkat menengah dan mahir yang berlatih di beberapa jenis puzzle dan peduli pada rata-rata waktunya.
Yang saya bangun
Timer yang tetap akurat
Jam membaca waktu resolusi tinggi dari browser di setiap frame, jadi solve yang panjang pun tidak melenceng. Menahan tombol selama 300 milidetik menyiapkan timer, sama seperti inspeksi di kompetisi. Rata-rata dihitung mengikuti aturan World Cube Association, dari ao5 sampai ao100.
Satu solver untuk setiap puzzle
Saya menulis solver untuk kedelapan puzzle utama dan memilih strateginya berdasarkan seberapa banyak posisi yang dimiliki puzzle itu.
- 2×2, Pyraminx, dan Skewb cukup kecil untuk dihitung semua posisinya di awal; solver tinggal mencari solusi terpendek, tidak pernah lebih dari 11 langkah.
- 3×3 diselesaikan dengan cara manusia menyelesaikannya (CFOP): cross yang optimal, dua lapisan pertama dipasangkan, setiap kasus lapisan terakhir dikenali dari set algoritma lengkap, dengan langkah terbuang di antara tahap dibatalkan.
- 4×4 dan 5×5 direduksi menjadi 3×3 dengan menyelesaikan bagian tengah dan memasangkan edge, lengkap perbaikan parity, lalu dituntaskan oleh solver 3×3.
- Megaminx diselesaikan lapis demi lapis, dengan pustaka kecil urutan langkah lapisan terakhir.
- Square-1 butuh dua fase, bentuk lalu keping, dengan tampilan 3D yang menganimasikan putaran setengahnya sebagai geometri padat.
Seluruh aplikasi pindah ke browser
Setiap solver semula berjalan lewat layanan Python yang harus dijalankan pengguna secara lokal, jadi Solve Lab tidak berfungsi kalau layanan itu tidak menyala. Saya memindahkan semua solver ke TypeScript yang berjalan di Web Worker, sehingga kedelapannya kini menyelesaikan puzzle di sisi klien tanpa backend. Layanan Python-nya masih ada di balik tab riset opsional, kini sebagai implementasi rujukan yang dipakai memeriksa hasil port ke browser. Karena tidak ada lagi yang butuh server, saya merilis Cubiq sebagai static export ke GitHub Pages, bukan server Next.js yang di-hosting.
Empat bagian yang disusun sesuai kegiatan cuber
Aplikasi ini semula berupa empat halaman terpisah yang dinamai sesuai implementasinya: timer, stats, history, solvers. Itu memisahkan stats dari history, dua hal yang sebenarnya ingin dilihat cuber berdampingan, dan menyembunyikan rangkaian solver di balik nama yang menjelaskan kode, bukan pertanyaan penggunanya. Saya menggabungkan stats dan history menjadi satu halaman Progress, dan mengganti nama rangkaian solver menjadi Solve Lab, tetap satu tab per puzzle yang membawa scramble saat Anda berpindah. Bagian Learn yang baru menambahkan pelatih spaced-repetition untuk kasus OLL dan PLL, dan URL lama tetap mengarahkan ulang supaya tautan yang sudah disimpan tetap berfungsi.
Model yang belajar menyelesaikan kubus sendiri
Sebuah layanan Python terpisah melatih neural network dengan cara yang dipakai DeepCubeA. Model mengacak kubus yang sudah selesai, lalu belajar menebak berapa langkah lagi menuju selesai. Dasbor riset menampilkan proses pelatihan secara langsung. Anda bisa menjalankan model pada sebuah scramble dan membandingkan jawabannya dengan solusi optimal dari solver Kociemba, yang hanya saya pakai sebagai pembanding.
Hasilnya
Cubiq sudah live dan gratis dipakai sejak September 2026. Kedelapan puzzle diselesaikan oleh solver yang saya tulis sendiri, sepenuhnya di browser. Saya memakai cubing.js hanya untuk menggambar dan mengacak kubus, dan solver Kociemba hanya sebagai pembanding. Setiap solve tersimpan di browser dan bisa diekspor. Rencana awalnya hanya berisi solver cross, yang ditandai mungkin terlalu sulit untuk fase awal. Saya membangun versi pertamanya dalam sekitar 11 minggu, dari Mei sampai Juli 2026. Saya lalu kembali mengerjakannya sampai September untuk memindahkan semua solver ke sisi klien, mendesain ulang aplikasi ke empat bagian berbasis tugas, dan merilisnya sebagai situs statis tanpa server yang perlu dijaga tetap menyala.
Di balik layarDetail teknis untuk engineer
TwistyPlayerdari cubing.js mengaksesselfsaat modul dimuat, jadi komponen ini dimuat dengandynamic(() => import(...), { ssr: false })dan dipasang lewatdocument.createElement('twisty-player')di dalamuseEffect.- Turbopack merusak URL yang dipakai cubing.js untuk menjalankan Web Worker. Build dipindah ke Webpack supaya bisa jalan.
- Timer menampilkan
performance.now() - startTime.setIntervalhanya memicu render ulang dan tidak pernah mengukur waktu. - 2×2, Pyraminx, dan Skewb memakai tabel jarak God's algorithm lengkap: 3.674.160, 1.866.240, dan 3.149.280 posisi berurutan, semuanya dibatasi 11 langkah. 3×3 memakai IDA* untuk cross, x-cross, dan double x-cross, pencarian pasangan F2L, serta basis data OLL/PLL, dengan pembatalan langkah di antara tahap.
- 4×4 dan 5×5 memakai tabel langkah yang dibangkitkan dari geometri. 5×5 butuh macro cross-swap baru yang diturunkan lewat konjugasi untuk satu kasus parity.
- Square-1 memakai BFS bentuk, lalu penurunan kepingan secara eksak. Tampilan 3D-nya merender puzzle sebagai cangkang dua sisi dan menganimasikan putaran ekuator 180° sebagai geometri kaku.
- Layanan FastAPI
cubiq-mlmemakai Autodidactic Iteration dan ResNet dua kepala: value head untuk sisa langkah dan policy head untuk 18 langkah. Tersedia rollout greedy dan MCTS. Dasbor mengecek status pelatihan setiap dua detik. Perulangan self-play-nya pernah macet, selalu merekomendasikan langkah yang sama, karena memilih aksi secara deterministik saat beberapa pilihan terlihat sama baiknya di awal pelatihan; menambahkan keacakan pada pilihan itu memperbaikinya. - State disimpan di Zustand dan dipersist ke localStorage dengan
skipHydrationuntuk menghindari mismatch SSR. Solve bisa diekspor dan diimpor sebagai JSON. Deep link kini memakai/lab?puzzle=<id>&scramble=<alg>di Solve Lab yang sudah berganti nama. - Peringatan inspeksi memakai API
SpeechSynthesisbawaan browser untuk hitung mundur bersuara; tidak ada berkas audio yang dikirim bersama aplikasi. - Font-nya Bricolage Grotesque untuk display, Geist untuk UI, dan Martian Mono untuk angka.
- 19 endpoint API solver, 100 berkas sumber frontend dan 38 berkas backend, sekitar 21.000 baris TypeScript dan Python, 95 commit antara 3 Mei dan 28 September 2026.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.