https://github.com/tcbegley/cube-solver
A pure Python implementation of Herbert Kociemba's two-phase algorithm for solving the Rubik's Cube
https://github.com/tcbegley/cube-solver
cube cube-solver python rubiks-cube rubiks-cube-solver
Last synced: about 1 year ago
JSON representation
A pure Python implementation of Herbert Kociemba's two-phase algorithm for solving the Rubik's Cube
- Host: GitHub
- URL: https://github.com/tcbegley/cube-solver
- Owner: tcbegley
- License: mit
- Created: 2018-03-15T22:46:06.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2023-06-20T16:07:47.000Z (about 3 years ago)
- Last Synced: 2025-03-26T12:51:17.659Z (about 1 year ago)
- Topics: cube, cube-solver, python, rubiks-cube, rubiks-cube-solver
- Language: Python
- Homepage:
- Size: 79.1 KB
- Stars: 17
- Watchers: 5
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# cube-solver
A pure Python implementation of Herbert Kociemba's two-phase algorithm for solving the Rubik's Cube
## Installation
Requires Python 3. Install with
```sh
pip install git+https://github.com/tcbegley/cube-solver.git
```
Note that depending on how your system is configured, you may need to replace `pip` with `pip3` in the above command to install for Python 3.
## Usage
To solve a cube, just import the `solve` method and pass a cube string.
```python
from twophase import solve
solve("")
```
Where the cube string is a 54 character string, consisting of the characters U, R, F, D, L, B (corresponding to the Upper, Right, Front, Down, Left and Back faces). Each character corresponds to one of the 54 stickers on the cube:
```plaintext
|------------|
|-U1--U2--U3-|
|------------|
|-U4--U5--U6-|
|------------|
|-U7--U8--U9-|
|------------|------------|------------|------------|
|-L1--L2--L3-|-F1--F2--F3-|-R1--R2--R3-|-B1--B2--B3-|
|------------|------------|------------|------------|
|-L4--L5--L6-|-F4--F5--F6-|-R4--R5--R6-|-B4--B5--B6-|
|------------|------------|------------|------------|
|-L7--L8--L9-|-F7--F8--F9-|-R7--R8--R9-|-B7--B8--B9-|
|------------|------------|------------|------------|
|-D1--D2--D3-|
|------------|
|-D4--D5--D6-|
|------------|
|-D7--D8--D9-|
|------------|
```
and should be specified in the order U1-U9, R1-R9, F1-F9, D1-D9, L1-L9, B1-B9.
For example, a completely solved cube is represented by the string `"UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB"`.
`solve` will return a solution unless timeout has been reached (default is 10 seconds). Typically it will find a solution very quickly unless you set a low upper bound on the number of moves allowed. Note that the first time you run `solve`, it will precompute move tables needed for the solution which might take ~1 minute. Subsequent runs will be much faster.
If you want to keep searching for better solutions, use the `solve_best` or
`solve_best_generator` functions. `solve_best` reduces `max_length` each time a
solution is found and continues searching for a better solution. All solutions
found are returned in a list at the end. `solve_best_generator` creates a
generator that yields solutions as they are found.
```python
from twophase import solve_best, solve_best_generator
# returns a list of solutions
solve_best("")
# creates a generator that yields solutions as they are found
solve_best_generator("")
```