Giter Site home page Giter Site logo

kociemba's Introduction

Build Status

kociemba

This Python package contains two equivalent implementations (in C and Python) of Herbert Kociemba's two-phase algorithm for solving Rubik's Cube. Original Java implementation can be found here: http://kociemba.org/download.htm.

These ports are pretty straightforward (not to say dumb) and most probably can be optimized. But they have been extensively tested in our Rubik's cube solving machines (FAC System Solver and Meccano Rubik's Shrine), so be confident the algorithm is working.

NB please note that two-phase algorithm does not guarantee that the produced solution is the shortest possible. Instead, it gives you a "good enough" solution in a very short time. You can implement additional checks on top of this library, for example, to not produce any moves if the cube is already solved.

Installation

This package is published on PyPI and can be installed with:

$ pip install kociemba

It was tested under Python 2.7 and 3.3+.

Unix-based systems

You might need to install libffi system library beforehand. For example, on Debian-based distributions (e.g. Raspbian) you would run sudo apt-get install libffi-dev.

Windows

Library should work on Windows, however it is not automatically tested at this moment: Travis CI doesn't have windows support.

Normal pip install kociemba (or pip3 install kociemba for Python 3.3+) should work, but you will need to install free build tools from Microsoft first. Check the following links:

Usage

The package exposes just one function solve(), which accepts a cube definition string and returns a solution string in standard notation (see below). Optional second argument allows solving to a specific pattern.

>>> import kociemba

>>> kociemba.solve('DRLUUBFBRBLURRLRUBLRDDFDLFUFUFFDBRDUBRUFLLFDDBFLUBLRBD')
u"D2 R' D' F2 B D R2 D2 R' F2 D' F2 U' B2 L2 U2 D R2 U"

>>> kociemba.solve('FLBUULFFLFDURRDBUBUUDDFFBRDDBLRDRFLLRLRULFUDRRBDBBBUFL', 'BBURUDBFUFFFRRFUUFLULUFUDLRRDBBDBDBLUDDFLLRRBRLLLBRDDF')
u"R' D2 R' U2 R F2 D B2 U' R F' U R2 D L2 D' B2 R2 B2 U' B2"

Standalone tool

When installing with pip, kociemba will also register a command line tool with the same name. So you can also use it like this:

$ kociemba <cubestring>

Cube string notation

The names of the facelet positions of the cube (letters stand for Up, Left, Front, Right, Back, and Down):

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

A cube definition string "UBL..." means that in position U1 we have the U-color, in position U2 we have the B-color, in position U3 we have the L color etc. according to the order U1, U2, U3, U4, U5, U6, U7, U8, U9, R1, R2, R3, R4, R5, R6, R7, R8, R9, F1, F2, F3, F4, F5, F6, F7, F8, F9, D1, D2, D3, D4, D5, D6, D7, D8, D9, L1, L2, L3, L4, L5, L6, L7, L8, L9, B1, B2, B3, B4, B5, B6, B7, B8, B9.

So, for example, a definition of a solved cube would be UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB

Solution string consists of space-separated parts, each of them represents a single move:

  • A single letter by itself means to turn that face clockwise 90 degrees.
  • A letter followed by an apostrophe means to turn that face counterclockwise 90 degrees.
  • A letter with the number 2 after it means to turn that face 180 degrees.

e.g. R U R’ U R U2 R’ U

C version

C sources reside in the ckociemba folder. Running make inside this directory will compile a standalone binary. It accepts a cube representation as a command line argument, and writes the solution to the standard output. You can, of course, use ckociemba sources directly in your projects.

Performance

When possible, kociemba will use C implementation under the hood. If something goes wrong (C version cannot be imported) it will automatically fall back to pure-Python implementation. However, it will be much slower.

Testing

To run the tests, clone the repository and run:

$ python setup.py test

Thanks to

  • @jarheadjoe for his contribution to Windows support

kociemba's People

Contributors

ansiwen avatar competitivelin avatar evnor avatar muodov avatar rabross avatar robertlucian avatar venim avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kociemba's Issues

Can not install in NVIDIA Jetson Nano(Ubuntu)

Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting kociemba
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/b3/b6/3fe5719527e4691aaa7da5e74426f62e71e833767d8a8b9d48b5f3cbb9fb/kociemba-1.2.1.tar.gz (6.6 MB)
  Preparing metadata (setup.py) ... done
Collecting cffi>=1.0.0 (from kociemba)
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/8b/5c/7f9cd1fb80512c9e16c90b29b26fea52977e9ab268321f64b42f4c8488a3/cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (446 kB)
Collecting future (from kociemba)
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl (491 kB)
Collecting pycparser (from cffi>=1.0.0->kociemba)
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl (117 kB)
Building wheels for collected packages: kociemba
  Building wheel for kociemba (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [88 lines of output]
      /home/lanwang/.local/lib/python3.8/site-packages/setuptools/__init__.py:80: _DeprecatedInstaller: setuptools.installer and fetch_build_eggs are deprecated.
      !!
      
              ********************************************************************************
              Requirements should be satisfied by a PEP 517 installer.
              If you are using pip, you can try `pip install --use-pep517`.
              ********************************************************************************
      
      !!
        dist.fetch_build_eggs(dist.setup_requires)
      Warning: 'classifiers' should be a list, got type 'tuple'
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-aarch64-cpython-38
      creating build/lib.linux-aarch64-cpython-38/kociemba
      copying kociemba/build_ckociemba.py -> build/lib.linux-aarch64-cpython-38/kociemba
      copying kociemba/__init__.py -> build/lib.linux-aarch64-cpython-38/kociemba
      copying kociemba/command_line.py -> build/lib.linux-aarch64-cpython-38/kociemba
      creating build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_Twist_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/URtoUL_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_URtoDF_Parity_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/flipMove -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_URFtoDLF_Parity_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/UBtoDF_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_Flip_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/twistMove -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/URtoDF_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/FRtoBR_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/MergeURtoULandUBtoDF -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/URFtoDLF_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      creating build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/edge.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/coordcube.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/__init__.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/facecube.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/search.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/color.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/tools.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/corner.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/facelet.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/cubiecube.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      creating build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/URtoDF_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/FRtoBR_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_Flip_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/URtoUL_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/flipMove.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_URFtoDLF_Parity_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_Twist_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_URtoDF_Parity_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/URFtoDLF_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/twistMove.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/MergeURtoULandUBtoDF.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/UBtoDF_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      creating build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      creating build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/color.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/corner.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/search.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/edge.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/facelet.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/coordcube.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/facecube.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/cubiecube.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/prunetable_helpers.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/solve.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/cubiecube.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/search.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/facecube.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/coordcube.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/prunetable_helpers.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      running build_ext
      generating cffi module 'build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.c'
      creating build/temp.linux-aarch64-cpython-38
      building 'kociemba.ckociembawrapper' extension
      creating build/temp.linux-aarch64-cpython-38/build
      creating build/temp.linux-aarch64-cpython-38/build/temp.linux-aarch64-cpython-38
      creating build/temp.linux-aarch64-cpython-38/kociemba
      creating build/temp.linux-aarch64-cpython-38/kociemba/ckociemba
      aarch64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -Ikociemba/ckociemba/include -I/usr/include/python3.8 -c build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.c -o build/temp.linux-aarch64-cpython-38/build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.o -std=c99 -O3 -D_XOPEN_SOURCE=700
      build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.c:50:14: fatal error: pyconfig.h: No such file or directory
       #    include <pyconfig.h>
                    ^~~~~~~~~~~~
      compilation terminated.
      error: command '/usr/bin/aarch64-linux-gnu-gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for kociemba
  Running setup.py clean for kociemba
Failed to build kociemba
ERROR: Could not build wheels for kociemba, which is required to install pyproject.toml-based projects

i try to install it with

sudo apt-get install libffi-dev
pip3 install kociemba

then i try to use it to install

pip install --use-pep517 kociemba

it still fail to install

Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting kociemba
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/b3/b6/3fe5719527e4691aaa7da5e74426f62e71e833767d8a8b9d48b5f3cbb9fb/kociemba-1.2.1.tar.gz (6.6 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Collecting cffi>=1.0.0 (from kociemba)
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/8b/5c/7f9cd1fb80512c9e16c90b29b26fea52977e9ab268321f64b42f4c8488a3/cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (446 kB)
Collecting future (from kociemba)
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl (491 kB)
Collecting pycparser (from cffi>=1.0.0->kociemba)
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl (117 kB)
Building wheels for collected packages: kociemba
  Building wheel for kociemba (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building wheel for kociemba (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [78 lines of output]
      Warning: 'classifiers' should be a list, got type 'tuple'
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-aarch64-cpython-38
      creating build/lib.linux-aarch64-cpython-38/kociemba
      copying kociemba/build_ckociemba.py -> build/lib.linux-aarch64-cpython-38/kociemba
      copying kociemba/__init__.py -> build/lib.linux-aarch64-cpython-38/kociemba
      copying kociemba/command_line.py -> build/lib.linux-aarch64-cpython-38/kociemba
      creating build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_Twist_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/URtoUL_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_URtoDF_Parity_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/flipMove -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_URFtoDLF_Parity_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/UBtoDF_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/Slice_Flip_Prun -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/twistMove -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/URtoDF_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/FRtoBR_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/MergeURtoULandUBtoDF -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      copying kociemba/cprunetables/URFtoDLF_Move -> build/lib.linux-aarch64-cpython-38/kociemba/cprunetables
      creating build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/edge.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/coordcube.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/__init__.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/facecube.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/search.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/color.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/tools.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/corner.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/facelet.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      copying kociemba/pykociemba/cubiecube.py -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba
      creating build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/URtoDF_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/FRtoBR_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_Flip_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/URtoUL_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/flipMove.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_URFtoDLF_Parity_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_Twist_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/Slice_URtoDF_Parity_Prun.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/URFtoDLF_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/twistMove.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/MergeURtoULandUBtoDF.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      copying kociemba/pykociemba/prunetables/UBtoDF_Move.pkl -> build/lib.linux-aarch64-cpython-38/kociemba/pykociemba/prunetables
      creating build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      creating build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/color.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/corner.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/search.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/edge.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/facelet.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/coordcube.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/facecube.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/cubiecube.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/include/prunetable_helpers.h -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba/include
      copying kociemba/ckociemba/solve.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/cubiecube.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/search.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/facecube.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/coordcube.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      copying kociemba/ckociemba/prunetable_helpers.c -> build/lib.linux-aarch64-cpython-38/kociemba/ckociemba
      running build_ext
      generating cffi module 'build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.c'
      creating build/temp.linux-aarch64-cpython-38
      building 'kociemba.ckociembawrapper' extension
      creating build/temp.linux-aarch64-cpython-38/build
      creating build/temp.linux-aarch64-cpython-38/build/temp.linux-aarch64-cpython-38
      creating build/temp.linux-aarch64-cpython-38/kociemba
      creating build/temp.linux-aarch64-cpython-38/kociemba/ckociemba
      aarch64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -Ikociemba/ckociemba/include -I/usr/include/python3.8 -c build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.c -o build/temp.linux-aarch64-cpython-38/build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.o -std=c99 -O3 -D_XOPEN_SOURCE=700
      build/temp.linux-aarch64-cpython-38/kociemba.ckociembawrapper.c:50:14: fatal error: pyconfig.h: No such file or directory
       #    include <pyconfig.h>
                    ^~~~~~~~~~~~
      compilation terminated.
      error: command '/usr/bin/aarch64-linux-gnu-gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for kociemba
Failed to build kociemba
ERROR: Could not build wheels for kociemba, which is required to install pyproject.toml-based projects

Running with a solved cube

When running the solver with a string for the solved cube, it returns this:

R L U2 R L' B2 U2 R2 F2 L2 D2 L2 F2

Why is that so? I would expect to print the solver "solved cube"

cant install

when i type pip install kociemba. it says: Command errored out with exit status 1:

Collecting kociemba
Using cached https://files.pythonhosted.org/packages/b3/b6/3fe5719527e4691aaa7da5e74426f62e71e833767d8a8b9d48b5f3cbb9fb/kociemba-1.2.1.tar.gz
Requirement already satisfied: cffi>=1.0.0 in c:\users\blahberi\appdata\roaming\python\python37\site-packages (from kociemba) (1.13.2)
Requirement already satisfied: future in c:\users\blahberi\appdata\roaming\python\python37\site-packages (from kociemba) (0.16.0)
Requirement already satisfied: pycparser in c:\users\blahberi\appdata\roaming\python\python37\site-packages (from cffi>=1.0.0->kociemba) (2.19)
Installing collected packages: kociemba
Running setup.py install for kociemba: started
Running setup.py install for kociemba: finished with status 'error'

ERROR: Command errored out with exit status 1:
 command: 'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\blahberi\\AppData\\Local\\Temp\\pycharm-packaging\\kociemba\\setup.py'"'"'; __file__='"'"'C:\\Users\\blahberi\\AppData\\Local\\Temp\\pycharm-packaging\\kociemba\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\blahberi\AppData\Local\Temp\pip-record-z17i86p6\install-record.txt' --single-version-externally-managed --compile --user --prefix=
     cwd: C:\Users\blahberi\AppData\Local\Temp\pycharm-packaging\kociemba\
Complete output (82 lines):
Warning: 'classifiers' should be a list, got type 'tuple'
running install
running build
running build_py
creating build
creating build\lib.win-amd64-3.7
creating build\lib.win-amd64-3.7\kociemba
copying kociemba\build_ckociemba.py -> build\lib.win-amd64-3.7\kociemba
copying kociemba\command_line.py -> build\lib.win-amd64-3.7\kociemba
copying kociemba\__init__.py -> build\lib.win-amd64-3.7\kociemba
creating build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\flipMove -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\FRtoBR_Move -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\MergeURtoULandUBtoDF -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\Slice_Flip_Prun -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\Slice_Twist_Prun -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\Slice_URFtoDLF_Parity_Prun -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\Slice_URtoDF_Parity_Prun -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\twistMove -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\UBtoDF_Move -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\URFtoDLF_Move -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\URtoDF_Move -> build\lib.win-amd64-3.7\kociemba\cprunetables
copying kociemba\cprunetables\URtoUL_Move -> build\lib.win-amd64-3.7\kociemba\cprunetables
creating build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\color.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\coordcube.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\corner.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\cubiecube.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\edge.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\facecube.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\facelet.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\search.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\tools.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
copying kociemba\pykociemba\__init__.py -> build\lib.win-amd64-3.7\kociemba\pykociemba
creating build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\flipMove.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\FRtoBR_Move.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\MergeURtoULandUBtoDF.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\Slice_Flip_Prun.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\Slice_Twist_Prun.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\Slice_URFtoDLF_Parity_Prun.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\Slice_URtoDF_Parity_Prun.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\twistMove.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\UBtoDF_Move.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\URFtoDLF_Move.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\URtoDF_Move.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
copying kociemba\pykociemba\prunetables\URtoUL_Move.pkl -> build\lib.win-amd64-3.7\kociemba\pykociemba\prunetables
creating build\lib.win-amd64-3.7\kociemba\ckociemba
creating build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\color.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\coordcube.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\corner.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\cubiecube.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\edge.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\facecube.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\facelet.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\prunetable_helpers.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\include\search.h -> build\lib.win-amd64-3.7\kociemba\ckociemba\include
copying kociemba\ckociemba\coordcube.c -> build\lib.win-amd64-3.7\kociemba\ckociemba
copying kociemba\ckociemba\cubiecube.c -> build\lib.win-amd64-3.7\kociemba\ckociemba
copying kociemba\ckociemba\facecube.c -> build\lib.win-amd64-3.7\kociemba\ckociemba
copying kociemba\ckociemba\prunetable_helpers.c -> build\lib.win-amd64-3.7\kociemba\ckociemba
copying kociemba\ckociemba\search.c -> build\lib.win-amd64-3.7\kociemba\ckociemba
copying kociemba\ckociemba\solve.c -> build\lib.win-amd64-3.7\kociemba\ckociemba
warning: build_py: byte-compiling is disabled, skipping.

running build_ext
generating cffi module 'build\\temp.win-amd64-3.7\\Release\\kociemba.ckociembawrapper.c'
creating build\temp.win-amd64-3.7
creating build\temp.win-amd64-3.7\Release
building 'kociemba.ckociembawrapper' extension
creating build\temp.win-amd64-3.7\Release\build
creating build\temp.win-amd64-3.7\Release\build\temp.win-amd64-3.7
creating build\temp.win-amd64-3.7\Release\build\temp.win-amd64-3.7\Release
creating build\temp.win-amd64-3.7\Release\kociemba
creating build\temp.win-amd64-3.7\Release\kociemba\ckociemba
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Ikociemba/ckociemba/include "-IC:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\include" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\winrt" "-IC:\Program Files\Intel\IPP\6.1.6.056\em64t\include" /Tcbuild\temp.win-amd64-3.7\Release\kociemba.ckociembawrapper.c /Fobuild\temp.win-amd64-3.7\Release\build\temp.win-amd64-3.7\Release\kociemba.ckociembawrapper.obj -std=c99 -O3 -D_XOPEN_SOURCE=700
cl : Command line warning D9002 : ignoring unknown option '-std=c99'
cl : Command line warning D9002 : ignoring unknown option '-O3'
kociemba.ckociembawrapper.c
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\include\pyconfig.h(203): fatal error C1083: Cannot open include file: 'basetsd.h': No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2
----------------------------------------

ERROR: Command errored out with exit status 1: 'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\Users\blahberil\AppData\Local\Temp\pycharm-packaging\kociemba\setup.py'"'"'; file='"'"'C:\Users\blahberil\AppData\Local\Temp\pycharm-packaging\kociemba\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record 'C:\Users\blahberi\AppData\Local\Temp\pip-record-z17i86p6\install-record.txt' --single-version-externally-managed --compile --user --prefix= Check the logs for full command output.

Error compiling on Linux

Compiler error in prunetable_helpers.c line 10, 23:

warning: implicit declaration of function 'strnlen'; did you mean 'strlen'?

Enhance schema description in readme

Hello,

the schema for the cube is not perfectly clear:

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

What are the corners? From which perspective is one viewing on it?
Is F7 left bottom? Is L3 left bottom?
Better than "L1" numbering would be:

             |************|
             |*BLU*BU*BRU*|
             |************|
             |*BLM*BM*BRM*|
             |************|
             |*BLD*BD*BRD*|
             |************|
 ************|************|************|************
 *LLU*LU*LRU*|*F1**F2**F3*|*R1**R2**R3*|*B1**B2**B3*
 ************|************|************|************
 *LLM*LM*LRM*|*F4**F5**F6*|*R4**R5**R6*|*B4**B5**B6*
 ************|************|************|************
 *LLD*LD*LRD*|*F7**F8**F9*|*R7**R8**R9*|*B7**B8**B9*
 ************|************|************|************
             |************|
             |*D1**D2**D3*|
             |************|
             |*D4**D5**D6*|
             |************|
             |*D7**D8**D9*|
             |************|

Why does a solved cube still generate output?

$ kociemba UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB
R L U2 R L' B2 U2 R2 F2 L2 D2 L2 F2

Run problem

After running setup.py test, the following errors occur:
Warning: 'classifiers' should be a list, got type 'tuple'
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help

error: no commands supplied

Thank you very much.

Solve cube leads to wrong answer

Hello

I'm amazed by this algorithm and I'm trying to wrap my head around it.

I gave it, this as an input:
UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB

It is supposed to be the solved state and it leads to this answer:
D2 R' D' F2 B D R2 D2 R' F2 D' F2 U' B2 L2 U2 D R2 U

So how come a solved state leads to moves?

I installed the package via pip and just doing a simple script :

import kociemba
cube = 'UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB'
solve = kociemba.solve(cube)
print(cube)
print(solve)

i run with Python3.9.2

Compiling on Windows

Hi,I'm a student.
My computer environment is win8. I can download kociemba with pip . But I cant install it.How to solve it?
Thank You.

Feature request: Solve to pattern.

Would be nice to also give a target pattern to solve it to. Should be easy, if I'm mistaken. Just solve from pattern to solved state, and apply the resulting maneuvers to the starting pattern and solve it from there. The resulting maneuvers should solve the cube to the pattern. Right?
Would be useful also to bring the cube into a given scrambled states, like only the last-layer scrambled for training purposes.

I might be able to implement it by myself during the holidays.

Cannot install in Windows

Have tried for hours to install in Windows (after installing Microsoft Visual Studios 2010 C++ compiler) however it keeps giving me the error below. Desperately require this module in Windows. Help would be appreciated.

creating build\temp.win32-2.7\Release\kociemba\ckociemba
    C:\Users\marcu\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -Ikociemba/ckociemba/include -Ic:\python27\include -Ic:\python27\PC /Tcbuild\temp.win32-2.7\Release\kociemba.ckociembawrapper.c /Fobuild\temp.win32-2.7\Release\build\temp.win32-2.7\Release\kociemba.ckociembawrapper.obj -std=c99 -O3 -D_XOPEN_SOURCE=700
    cl : Command line warning D9002 : ignoring unknown option '-std=c99'
    cl : Command line warning D9002 : ignoring unknown option '-O3'
    kociemba.ckociembawrapper.c
    build\temp.win32-2.7\Release\kociemba.ckociembawrapper.c(505) : error C2143: syntax error : missing ';' before 'type'
    build\temp.win32-2.7\Release\kociemba.ckociembawrapper.c(512) : error C2065: 'sol' : undeclared identifier
    build\temp.win32-2.7\Release\kociemba.ckociembawrapper.c(512) : warning C4047: 'return' : 'char *' differs in levels of indirection from 'int'
    error: command 'C:\\Users\\marcu\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\cl.exe' failed with exit status 2

Command "c:\python27\python.exe -u -c "import setuptools, tokenize;__file__='c:\\users\\marcu\\appdata\\local\\temp\\pip-build-_nfd0j\\kociemba\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record c:\users\marcu\appdata\local\temp\pip-wypqoj-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in c:\users\marcu\appdata\local\temp\pip-build-_nfd0j\kociemba\

Solve is not a String

The solve which is in an Array is a type called "rubik_solver.Move.Move". I'm pretty new to Python so there is probably a way to convert it that I don't know but would it be possible to change the type to a String because that would make things a lot easier!

Program crashes on Windows when cache exists

I changed some stuff, similar to the pull request, to get the C-code working on Windows. The first execution runs fine, the prune tables are calculated and the folder is created, a correct solution is displayed. However, if I run the program a second time, it crashes. I also tried it with the code from the pull request, same thing. I believe it has to do with folder permissions (the mkdir() call on windows doesn't set them), but I'm not sure. I tried changing the folder permissions via the CreateDirectory method instead, but without success. I can just let them program recalculate the tables on every execution, but that's rather annoying.

Implement symmetry reductions

The current implementation is a direct translation of Kociemba's twophase.jar, which is the two-phase algorithm in its simplest form. On his page, Herbert describes further possible optimizations that can improve the algorithm performance, e.g. symmetry reductions.

He have implemented those in his Cube Explorer program, but unfortunately that source code is not publicly available. So we'll have to implement it ourselves.

Kociemba failed for some cases

Thanks for developing this module, it is truly a great resource. I have used it into my own module and while debugging, I came across a few issues that I would like to inquire about. If you are interested, I would be happy to try using some group theory tools to solve this problem ;)

Here is a simple example to reproduce the issue. Note that the two strings refer to the same Rubik's Cube, but with a different view.

import kociemba as kb
good_state = "UUUUUUUUURRRRLRRRRFFFFBFFFFDDDDDDDDDLLLLRLLLLBBBBFBBBB"
bad_state = "UUUUUUUUUFFFFBFFFFLLLLRLLLLDDDDDDDDDBBBBFBBBBRRRRLRRRR"
print(kb.solve(good_state)) # "R L U2 R L' B2 U2 R2 F2 L2 D2 L2 F2"
kb.solve(bad_state)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/var/folders/kw/8x7phwld2hdcznypdmdjyc6c0000gn/T/ipykernel_75413/4117867588.py in <module>
----> 1 kb.solve(bad_state)

~/opt/anaconda3/lib/python3.9/site-packages/kociemba/__init__.py in solve(cubestring, patternstring, max_depth)
     59     """
     60 
---> 61     return _solve(cubestring, patternstring, max_depth)
     62 
     63 __all__ = ['solve']

~/opt/anaconda3/lib/python3.9/site-packages/kociemba/__init__.py in _solve(cube, pattern, max_depth)
     16             return ffi.string(res).strip().decode('utf-8')
     17         else:
---> 18             raise ValueError('Error. Probably cubestring is invalid')
     19 except ImportError as e:
     20     print(e)

ValueError: Error. Probably cubestring is invalid

Expand code of the two cube strings using tools in rubik_cube.py:

import rubik
state = "UUUUUUUUUFFFFBFFFFLLLLRLLLLDDDDDDDDDBBBBFBBBBRRRRLRRRR"
newstate = "UUUUUUUUURRRRLRRRRFFFFBFFFFDDDDDDDDDLLLLRLLLLBBBBFBBBB"
print(rubik.tools.expand_cube(state))
print(rubik.tools.expand_cube(newstate))
---------------------------------------------------------------------------
          -----
        | U U U |
        | U U U |
        | U U U |
---------------------------------
| B B B | L L L | F F F | R R R |
| B F B | L R L | F B F | R L R |
| B B B | L L L | F F F | R R R |
---------------------------------
        | D D D |
        | D D D |
        | D D D |
          -----

          -----
        | U U U |
        | U U U |
        | U U U |
---------------------------------
| L L L | F F F | R R R | B B B |
| L R L | F B F | R L R | B F B |
| L L L | F F F | R R R | B B B |
---------------------------------
        | D D D |
        | D D D |
        | D D D |
          -----

Code cleanup

Since kociemba initially was a direct translation from java, the code inherited some awkward places in design. For example, in some places python list elements are iterated by index. Also, decomposition might be improved.

These need to be fixed to keep the project healthy.

Install fail on chromebook (debian)

Collecting kociemba
  Using cached kociemba-1.2.1.tar.gz (6.6 MB)
Requirement already satisfied: cffi>=1.0.0 in ./qbr/lib/python3.9/site-packages (from kociemba) (1.15.1)
Requirement already satisfied: future in ./qbr/lib/python3.9/site-packages (from kociemba) (0.18.3)
Requirement already satisfied: pycparser in ./qbr/lib/python3.9/site-packages (from cffi>=1.0.0->kociemba) (2.21)
Using legacy 'setup.py install' for kociemba, since package 'wheel' is not installed.
Installing collected packages: kociemba
    Running setup.py install for kociemba ... error
    ERROR: Command errored out with exit status 1:
     command: /home/sze/qbr/qbr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-sz_242re/kociemba_7db8340cf6404cd9bfa1dc0067052a66/setup.py'"'"'; __file__='"'"'/tmp/pip-install-sz_242re/kociemba_7db8340cf6404cd9bfa1dc0067052a66/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-hq14omtp/install-record.txt --single-version-externally-managed --compile --install-headers /home/sze/qbr/qbr/include/site/python3.9/kociemba
         cwd: /tmp/pip-install-sz_242re/kociemba_7db8340cf6404cd9bfa1dc0067052a66/
    Complete output (75 lines):
    WARNING: The wheel package is not available.
    Warning: 'classifiers' should be a list, got type 'tuple'
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-aarch64-3.9
    creating build/lib.linux-aarch64-3.9/kociemba
    copying kociemba/__init__.py -> build/lib.linux-aarch64-3.9/kociemba
    copying kociemba/build_ckociemba.py -> build/lib.linux-aarch64-3.9/kociemba
    copying kociemba/command_line.py -> build/lib.linux-aarch64-3.9/kociemba
    creating build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/FRtoBR_Move -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/MergeURtoULandUBtoDF -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/Slice_Flip_Prun -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/Slice_Twist_Prun -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/Slice_URFtoDLF_Parity_Prun -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/Slice_URtoDF_Parity_Prun -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/UBtoDF_Move -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/URFtoDLF_Move -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/URtoDF_Move -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/URtoUL_Move -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/flipMove -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    copying kociemba/cprunetables/twistMove -> build/lib.linux-aarch64-3.9/kociemba/cprunetables
    creating build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/__init__.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/color.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/coordcube.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/corner.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/cubiecube.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/edge.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/facecube.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/facelet.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/search.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    copying kociemba/pykociemba/tools.py -> build/lib.linux-aarch64-3.9/kociemba/pykociemba
    creating build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/FRtoBR_Move.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/MergeURtoULandUBtoDF.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/Slice_Flip_Prun.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/Slice_Twist_Prun.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/Slice_URFtoDLF_Parity_Prun.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/Slice_URtoDF_Parity_Prun.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/UBtoDF_Move.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/URFtoDLF_Move.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/URtoDF_Move.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/URtoUL_Move.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/flipMove.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    copying kociemba/pykociemba/prunetables/twistMove.pkl -> build/lib.linux-aarch64-3.9/kociemba/pykociemba/prunetables
    creating build/lib.linux-aarch64-3.9/kociemba/ckociemba
    creating build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/color.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/coordcube.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/corner.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/cubiecube.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/edge.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/facecube.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/facelet.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/prunetable_helpers.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/include/search.h -> build/lib.linux-aarch64-3.9/kociemba/ckociemba/include
    copying kociemba/ckociemba/coordcube.c -> build/lib.linux-aarch64-3.9/kociemba/ckociemba
    copying kociemba/ckociemba/cubiecube.c -> build/lib.linux-aarch64-3.9/kociemba/ckociemba
    copying kociemba/ckociemba/facecube.c -> build/lib.linux-aarch64-3.9/kociemba/ckociemba
    copying kociemba/ckociemba/prunetable_helpers.c -> build/lib.linux-aarch64-3.9/kociemba/ckociemba
    copying kociemba/ckociemba/search.c -> build/lib.linux-aarch64-3.9/kociemba/ckociemba
    copying kociemba/ckociemba/solve.c -> build/lib.linux-aarch64-3.9/kociemba/ckociemba
    running build_ext
    generating cffi module 'build/temp.linux-aarch64-3.9/kociemba.ckociembawrapper.c'
    creating build/temp.linux-aarch64-3.9
    building 'kociemba.ckociembawrapper' extension
    creating build/temp.linux-aarch64-3.9/build
    creating build/temp.linux-aarch64-3.9/build/temp.linux-aarch64-3.9
    creating build/temp.linux-aarch64-3.9/kociemba
    creating build/temp.linux-aarch64-3.9/kociemba/ckociemba
    aarch64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -ffile-prefix-map=/build/python3.9-PN012d/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -ffile-prefix-map=/build/python3.9-PN012d/python3.9-3.9.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Ikociemba/ckociemba/include -I/home/sze/qbr/qbr/include -I/usr/include/python3.9 -c build/temp.linux-aarch64-3.9/kociemba.ckociembawrapper.c -o build/temp.linux-aarch64-3.9/build/temp.linux-aarch64-3.9/kociemba.ckociembawrapper.o -std=c99 -O3 -D_XOPEN_SOURCE=700
    error: command 'aarch64-linux-gnu-gcc' failed: No such file or directory
    ----------------------------------------
ERROR: Command errored out with exit status 1: /home/sze/qbr/qbr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-sz_242re/kociemba_7db8340cf6404cd9bfa1dc0067052a66/setup.py'"'"'; __file__='"'"'/tmp/pip-install-sz_242re/kociemba_7db8340cf6404cd9bfa1dc0067052a66/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-hq14omtp/install-record.txt --single-version-externally-managed --compile --install-headers /home/sze/qbr/qbr/include/site/python3.9/kociemba Check the logs for full command output.

I'm having problems install kociemba on a stock Lenovo Chromebook

Tried:

sudo apt-get install libffi-dev
pip3 install kociemba

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.