tk744 / rubot

A blazing fast 3x3 Rubik's cube solver written in C.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 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. 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.

color string representation of a cube
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
    <try it in a terminal>
    

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.
    

About

A blazing fast 3x3 Rubik's cube solver written in C.

License:MIT License


Languages

Language:C 100.0%Language:Makefile 0.0%