Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tk744/rubot
A blazing fast 3x3 Rubik's cube solver written in C.
https://github.com/tk744/rubot
algorithm microcontroller robotics rubiks-cube
Last synced: 12 days ago
JSON representation
A blazing fast 3x3 Rubik's cube solver written in C.
- Host: GitHub
- URL: https://github.com/tk744/rubot
- Owner: tk744
- License: mit
- Created: 2021-11-05T19:47:01.000Z (about 3 years ago)
- Default Branch: master
- Last Pushed: 2024-08-05T06:19:52.000Z (3 months ago)
- Last Synced: 2024-08-05T07:29:21.377Z (3 months ago)
- Topics: algorithm, microcontroller, robotics, rubiks-cube
- Language: C
- Homepage:
- Size: 3.57 MB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- awesome-blazingly-fast - rubot - A blazing fast 3x3 Rubik's cube solver written in C. (C)
README
# Overview
`rubot` is a blazing fast and user friendly Rubik's cube solver written in C. It uses a highly compact 1MB lookup table to deliver instantations solutions with an average of 32 moves and a max of 46 moves.
Since `rubot` was originally designed for use in embedded systems, it implements [Thistletwaite's algorithm](https://www.jaapsch.net/puzzles/thistle.htm) which uses much smaller lookup tables compared to algorithms that produce even fewer moves.
# Installation
### Linux
- Install (default location is `/usr/local/bin`):
```
git clone https://github.com/tk744/rubot
cd rubot
sudo make install
```- Uninstall:
```
sudo make uninstall
```### Build from Source
Build the executable `rubot` from source by running `make`.
# Usage
For a full list of commands, run `rubot -h`.
## Encoding
A scramble or solution is encoded as a **move sequence**:
- A move sequence is a whitespace-separated list of moves described using [standard notation](https://ruwix.com/the-rubiks-cube/notation/). The six base moves are `U`, `L`, `F`, `R`, `B`, `D`, which can be suffixed by `i` and `2` for inverse and half-turns.A cube is serialized as a **color string**:
- A color string has 54 chars, one for each tile. It is arranged linearly by face, with the tiles in each face arranged in row-major order, and the faces arranged U, L, F, R, B, D. Colors are represented by any set of 6 unique chars.
The index of each tile in the color string representation of a cube.## Cube Solving
`rubot` can take a scrambled cube and return a solution sequence in one of two ways:
- From a color string.
```
$ ./rubot LBBUUBRFFURULLRBBRFLLFFUDDLDUUFRLBRDRLFUBDBRRFFUDDBDDL
Di Fi R Li U R L F R2 U2 F L R2 D2 R2 F U2 F R2 B2 D2 B U2 R2 U2 F2 R2 U2 F2 U2 L2 B2 L2 U2
```- From a scramble sequence.
```
$ ./rubot F L2 D F B L2 U2 R U2 F D2 Fi B U B
U R F2 B D U2 R2 Bi Ri U2 Li Fi R F D2 F2 D2 R2 F R2 B R2 U2 F2 L2 F2 L2 B2 U2 L2
````rubot` can also print the state of the scrambled cube using either the `-c` or `-d` flag:
- `-c`: print the color string.
```
$ ./rubot -c D2 L B D B U2 Fi L B D U D Fi Di R
FBURURBFDUFRULBFUDDLFLFLBDDLDRURLFUUBRRDBFLBULFRRDBLDB
```- `-d`: draw a colored ASCII representation (requires a terminal with ANSII escape codes).
```
$ ./rubot -d UDUDUDUDULRLRLRLRLFBFBFBFBFRLRLRLRLRBFBFBFBFBDUDUDUDUD
```## Cube Scrambling
`rubot` also provides functionality for generating random scramble sequences:
- Pass the number of moves to generate, optionally followed by an RNG seed.
```
$ ./rubot 25 5
D2 U Fi B D F Ui Fi Ui F2 D B Fi D2 U Ri Bi F R L2 B2 Di B Ui Bi
```- As with cube solving, we can use the `-c` or `-d` flag to print the state of the scrambled cube.
```
$ ./rubot -c 1000
URBFULFDULLRULRLDBUBLFFBRBDFUDLRDRUDLDBFBFFUDURBLDBFRR
```## Benchmarking
`rubot` can even run a simple benchmark by solving a large number of cubes using the `-b` flag:
- `-b N`: benchmark on `N` scrambled cubes (output from my i7-13700K).
```
$ ./rubot -b 100000
Throughput: 4585.70 solves per second
Length: 32.19 moves per solve
```## Input Validation
`rubot` will print to stderr and return a non-zero value if the input is invalid or if the cube is unsolvable:
- Return -1 on invalid inputs with a descriptive error message.
```
$ ./rubot UUUUUUUUULLLxLLLLLFFFFFFFFFRRRRRRRRRBBBBBBBBBDDDDDDDDD
Error: Invalid color 'x' at index 12.
```- Return 1 on unsolvable cubes, regardless of the operation.
```
$ ./rubot -d DUUUUUUUULLLLLLLLLFFFFFFFFFRRRRRRRRRBBBBBBBBBDDDDDDDDU
No solution found.
```