kpuzzle
. Permutations are encoded using lexicographic order.
Orientations are encoded as numbers in base 2 (edges), 3 (corners), or 4
(centers).
Components are encoded in the following order:
Component ID | Meaning | Valid Range | # of bits |
EP | edge permutation | 0 to 12! - 1 | 29 bits |
EO | edge orientation | 0 to 2^{12}-1 | 12 bits |
CP | corner permutation | 0 to 8! - 1 | 16 bits |
CO | corner orientation | 0 to 3^{8}-1 | 13 bits |
PO_U | puzzle orientation (see below) | 3 bits | |
PO_L | 2 bits | ||
MO_Q | whether center ("middle") orientation is supported |
0 to 1 | 1 bit |
MO | center ("middle") orientation | 0 to 4^{6}-1 | 12 bit |
Each component is stored with binary bits contiguously from high to low. Example: the high bit of EP is at bit index 0 (first bit of the first byte), and the low bit is at index 28 (5th bit of the third byte).
If puzzle orientation is not encoded:
0b111
.
If center orientation is not encoded:
0b0
.
ULFRBD
).
ULFRBD
, skipping the
centers currently on U and D).
The other components are encoded relative to centers. That is, reorienting the puzzle changes PO_U and PO_L, but does not affect any other components.
Apply z y'
to a solved cube. Now:
L
center has moved to U
.
L
is at (zero-indexed) position 1 in
ULFRBD
, so PO_U =
1
B
center has moved to L
.
L
and R
centers are on
U
and D
(respectively), so remove
L
and R
from ULFRBD
to get
UFBD
.
B
is at (zero-indexed) position 2 in
UFBD
, so PO_L =
2