This quick guide will get you started with enough to write some code, but not enough to delve into the pain and terror of the language.
What is “Cubically”?
Cubically is an esoteric programming language, meaning that it is intentionally difficult to program in.
Cubically specializes in Rubik’s Cubes, so almost all of its commands and functionalities are based around the memory cube. Some, such as XOR and LSHIFT, are really completely useless, but we decided they should be in the language.
Digits are arguments and non-digits are commands. A command can only be one letter long. (That rule, which you still need to know, is broken so many times it’s not even funny.)
code: RL2UD23 does: R call command R without arguments L2 call command L with argument 2 U call command U without arguments D23 call command D with argument 2, then argument 3 (NOT argument 23)
Any algorithm, or sequence of moves, in Singmaster’s notation, is valid Cubically code.
||rotate the right layer of the cube 90° clockwise|
||rotate the left layer of the cube 90° clockwise|
||rotate the top layer of the cube 90° clockwise|
||rotate the bottom layer of the cube 90° clockwise|
||rotate the front layer of the cube 90° clockwise|
||rotate the back layer of the cube 90° clockwise|
Call any of the above commands with the argument
2 for a 180° turn, and the argument
3 for a counterclockwise turn.
Since v2.0, Cubically has supported more than just a 3x3x3 for the memory cube. In the interpreter’s command-line invocation, append an argument to specify the size:
4 for a 4x4x4 memory cube, or a
5 for a 5x5x5, etc.
But Singmaster’s notation only defines moves for a 3x3x3 D: how can I turn the inner layers of a larger cube?
Unicode subscripts (
₀₁₂₃₄₅₆₇₈₉), while breaking the “a command can only be one character long” rule, give you the ability to turn the inner layers. For example,
R (performed on a solved 4x4x4) changes the cube’s state to this:
0002 0002 0002 0002 1111222533330444 1111222533330444 1111222533330444 1111222533330444 5554 5554 5554 5554
R₁ on a solved 4x4x4 changes the cube’s state to this:
0020 0020 0020 0020 1111225233334044 1111225233334044 1111225233334044 1111225233334044 5545 5545 5545 5545
R means “turn the right face 90° clockwise.” So
R₁ means “turn the layer 1 inwards from the right face 90° clockwise.”
These can be pretty fun. Try running
RR₁'R₂R₃'R₄ UU₁'U₂U₃'U₄ L'L₁L₂'L₃L₄' on a 5x5x5.
But how do I interact with the cube?
When I first made Cubically, with the memory cube alone and no other way to store data, it was nothing but a console emulator for a Rubik’s Cube. However, I decided I wanted to turn it into an esoteric programming language, so I added one more piece of memory, the notepad. The value “written” on the notepad could be modified based on the different states of the cube. So I introduced the concept of memory locations. Memory location
0 would always store the sum of the top face of the cube (the face that’s filled with
0s when the cube is unsolved). Memory location
1 would always store the sum of the left face,
2 stored the right face sum, etc.
Try scrambling up the cube and running
:1 %6 -
:1 to set the notepad to the sum of the left face, and
%6 to print the notepad (memory location
6). What did it print? Try a different scramble with the same
:1 %6 at the end. See what different values you can get!
For ease of use, Cubically automatically dumps the memory cube and the notepad at the end of the program. For example, after running the code
R2L2U2D2F2B2, Cubically prints this:
Notepad: 0 050 505 050 131242313424 313424131242 131242313424 505 050 505
Cubically sounds fun, but how can I actually use it?
Who’s responsible for this mess?
Most of Cubically, such as the interpreter and the documentation, was written by me, a.k.a. MD XF on the internet (PPCG, GitHub). Thanks to the members of the Cubically team - Kamil Drakari (PPCG, GitHub) and TehPers (PPCG, GitHub) for valuable contributions.