Py222 is a 2x2x2 Rubik's Cube representation written in Python. It has support for applying individual moves to the puzzle, as well as space-separated algorithm strings specified in WCA notation.
A cube's state is represented as a 24-element numpy array with indices corresponding to the following stickers, and values corresponding to the following face colors:
sticker indices:
ββββ¬βββ
β 0β 1β
ββββΌβββ€
β 2β 3β
ββββ¬βββΌβββΌβββΌβββ¬βββ¬βββ¬βββ
β16β17β 8β 9β 4β 5β20β21β
ββββΌβββΌβββΌβββΌβββΌβββΌβββΌβββ€
β18β19β10β11β 6β 7β22β23β
ββββ΄βββΌβββΌβββΌβββ΄βββ΄βββ΄βββ
β12β13β
ββββΌβββ€
β14β15β
ββββ΄βββ
face colors:
ββββ
β 0β
ββββΌβββΌβββ¬βββ
β 4β 2β 1β 5β
ββββΌβββΌβββ΄βββ
β 3β
ββββ
The move definitions are written for a sticker representation, but there are functions to normalize the state's stickers relative to a fixed DLB corner, and convert it into a fixed-corner piece orientation and permutation (OP) representation. There are also various functions that can hash the fixed-corner OP representation state into unique integer indices.
Also included is a sample IDA* solver (solver.py).
- numpy
import py222
# get solved state
s = py222.initState()
py222.printCube(s) ββββ¬βββ
β 0β 0β
ββββΌβββ€
β 0β 0β
ββββ¬βββΌβββΌβββΌβββ¬βββ¬βββ¬βββ
β 4β 4β 2β 2β 1β 1β 5β 5β
ββββΌβββΌβββΌβββΌβββΌβββΌβββΌβββ€
β 4β 4β 2β 2β 1β 1β 5β 5β
ββββ΄βββΌβββΌβββΌβββ΄βββ΄βββ΄βββ
β 3β 3β
ββββΌβββ€
β 3β 3β
ββββ΄βββ
# do some moves
s = py222.doAlgStr(s, "x y R U' R' U' F2 U' R U R' U F2")
py222.printCube(s) ββββ¬βββ
β 2β 2β
ββββΌβββ€
β 2β 2β
ββββ¬βββΌβββΌβββΌβββ¬βββ¬βββ¬βββ
β 0β 3β 1β 4β 3β 0β 4β 1β
ββββΌβββΌβββΌβββΌβββΌβββΌβββΌβββ€
β 3β 3β 1β 1β 0β 0β 4β 4β
ββββ΄βββΌβββΌβββΌβββ΄βββ΄βββ΄βββ
β 5β 5β
ββββΌβββ€
β 5β 5β
ββββ΄βββ
# normalize stickers relative to DLB
s = py222.normFC(s)
py222.printCube(s)
ββββ¬βββ
β 0β 0β
ββββΌβββ€
β 0β 0β
ββββ¬βββΌβββΌβββΌβββ¬βββ¬βββ¬βββ
β 1β 4β 2β 5β 4β 1β 5β 2β
ββββΌβββΌβββΌβββΌβββΌβββΌβββΌβββ€
β 4β 4β 2β 2β 1β 1β 5β 5β
ββββ΄βββΌβββΌβββΌβββ΄βββ΄βββ΄βββ
β 3β 3β
ββββΌβββ€
β 3β 3β
ββββ΄βββ
import py222
import solver
# get solved state
s = py222.initState()
# apply some scramble
s = py222.doAlgStr(s, "R U2 R2 F2 R' F2 R F R")
# solve cube
solver.solveCube(s) ββββ¬βββ
β 2β 3β
ββββΌβββ€
β 1β 0β
ββββ¬βββΌβββΌβββΌβββ¬βββ¬βββ¬βββ
β 1β 3β 5β 4β 2β 2β 4β 3β
ββββΌβββΌβββΌβββΌβββΌβββΌβββΌβββ€
β 4β 2β 0β 0β 4β 1β 0β 5β
ββββ΄βββΌβββΌβββΌβββ΄βββ΄βββ΄βββ
β 1β 5β
ββββΌβββ€
β 3β 5β
ββββ΄βββ
normalizing stickers...
generating pruning tables...
searching...
depth 1
depth 2
depth 3
depth 4
depth 5
depth 6
depth 7
depth 8
F R2 F' R U2 R2 F' R
F R2 F' R' F R2 U2 R'