Skip to content

Instantly share code, notes, and snippets.

@kylepls
Last active February 11, 2024 08:11
Show Gist options
  • Save kylepls/cfa8002465f8db62ee75653f8509b95e to your computer and use it in GitHub Desktop.
Save kylepls/cfa8002465f8db62ee75653f8509b95e to your computer and use it in GitHub Desktop.
Rubik's Algorithm Visualizer
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"source": [
"from matplotlib import pyplot as plt\n",
"from enum import Enum\n",
"from labellines import labelLines\n",
"\n",
"\n",
"class CircleType(Enum):\n",
" EMPTY = 0,\n",
" FILLED = 1\n",
" \n",
"class Glyph:\n",
" def __init__(self, name, color, textOffset):\n",
" self.color = color\n",
" self.textOffset = textOffset\n",
" self.name = name\n",
" \n",
"class Arrow(Glyph):\n",
" def __init__(self, name, direction, color, textOffset):\n",
" super().__init__(name, color, textOffset)\n",
" self.direction = direction\n",
"\n",
"class Circle(Glyph):\n",
" def __init__(self, name, circleType, color, textOffset):\n",
" super().__init__(name, color, textOffset)\n",
" self.circleType = circleType\n",
" \n",
"mappings = {\n",
" \"U\": Arrow(\"U\", (0, 1), \"black\", (0.15, -0.1)),\n",
" \"U'\": Arrow(\"U'\", (0, -1), \"black\", (0.15, -0.1)),\n",
" \"U2'\": Arrow(\"U2'\", (0, -2), \"black\", (0.15, -0.1)),\n",
" \"U2\": Arrow(\"U2\", (0, 2), \"black\", (0.15, -0.1)),\n",
" \"D\": Circle(\"D\", CircleType.EMPTY, \"purple\", (0,0)),\n",
" \"D2\": Circle(\"D2\", CircleType.EMPTY, \"purple\", (0,0)),\n",
" \"D'\": Circle(\"D'\", CircleType.FILLED, \"purple\", (0,0)),\n",
" \"D2'\": Circle(\"D2'\", CircleType.FILLED, \"purple\", (0,0)),\n",
" \"L\": Arrow(\"L\", (-1, 1), \"blue\", (0.05, 0.15)),\n",
" \"L'\": Arrow(\"L'\", (-0.8, -1), \"blue\", (0.1, -0.2)),\n",
" \"R\": Arrow(\"R\", (1, 1), \"red\", (0.15,0.05)),\n",
" \"R2\": Arrow(\"R2\", (2, 2), \"red\", (0.15,0.05)),\n",
" \"R'\": Arrow(\"R'\", (0.8, -1), \"red\", (0.05,-0.3)),\n",
" \"F\": Arrow(\"F\", (1, 0), \"green\", (0, -0.3)),\n",
" \"F'\": Arrow(\"F'\", (-1, 0), \"green\", (0, -0.3))\n",
"}\n",
"\n",
"def get_mapping(step):\n",
" if step not in mappings and (step[-1] == \"2\"):\n",
" str_step = step[0:-1]\n",
" print(step, \"=>\", mappings[str_step])\n",
" return [mappings[str_step]]*2\n",
" else:\n",
" return [mappings[step]]\n",
"\n",
"def get_steps(alg):\n",
" steps = alg.split(\" \")\n",
" steps = [m for s in steps for m in get_mapping(s)]\n",
" return steps\n",
"\n",
"\n",
"def draw(alg):\n",
" alg = alg.replace(\"[\", \"\").replace(\"]\", \"\")\n",
" plt.figure(figsize=(10, 10))\n",
" x = 0\n",
" y = 0\n",
" dx = 1\n",
" dy = 0\n",
" start=plt.scatter(0,0, color='cyan', s=200)\n",
" start.set_zorder(100)\n",
" stepIndex=0\n",
" for step in get_steps(alg):\n",
" color = step.color\n",
" (offsetX, offsetY) = step.textOffset\n",
" width = 0.03\n",
" label = step.name\n",
" if isinstance(step, Arrow):\n",
" (dx, dy) = step.direction\n",
" line = plt.plot([x, x+dx], [y, y+dy], alpha=1, color=color)\n",
" arrow = plt.arrow(x, y, dx, dy, color=color, width=width, length_includes_head=True, overhang=0.05, head_width=5*width)\n",
" arrow.set_zorder(stepIndex)\n",
" elif isinstance(step, Circle):\n",
" if dx != 0:\n",
" dy = 0\n",
" else:\n",
" dx = 0\n",
"\n",
" fill = True if step.circleType == CircleType.FILLED else False\n",
"\n",
" circle = plt.Circle((x+dx/2, y+dy/2), (dx+dy)/2, fill=fill, color=color, lw=width*100)\n",
" circle.set_zorder(stepIndex)\n",
" line = plt.plot([x-1, x+1], [y-1, y+1], alpha=0, color=color) # For graph boundaries\n",
" plt.gca().add_artist(circle)\n",
"\n",
" if fill:\n",
" color = 'black'\n",
"\n",
" plt.annotate(label, xy=(dx/2+x+offsetX, y+dy/2+offsetY), color=color, fontsize=20, ha='center', va='center')\n",
" x += dx\n",
" y += dy\n",
" stepIndex += 1\n",
"\n",
" plt.gca().set_aspect('equal', adjustable='box')\n",
"\n",
" plt.show()\n",
" "
],
"outputs": [],
"execution_count": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": false,
"outputs_hidden": false
},
"nteract": {
"transient": {
"deleting": false
}
},
"execution": {
"iopub.status.busy": "2024-02-11T08:05:15.077Z",
"iopub.execute_input": "2024-02-11T08:05:15.080Z",
"iopub.status.idle": "2024-02-11T08:05:15.572Z",
"shell.execute_reply": "2024-02-11T08:05:15.568Z"
}
}
},
{
"cell_type": "code",
"source": [
"alg = \"[R U' R] U R U R U' R' U' R2\"\n",
"# alg = \"R U2 R' U' R U R' U' R U' R'\"\n",
"draw(alg)"
],
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 720x720 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
],
"execution_count": 4,
"metadata": {
"collapsed": false,
"jupyter": {
"source_hidden": false,
"outputs_hidden": false
},
"nteract": {
"transient": {
"deleting": false
}
},
"execution": {
"iopub.status.busy": "2024-02-11T08:05:17.425Z",
"iopub.execute_input": "2024-02-11T08:05:17.429Z",
"shell.execute_reply": "2024-02-11T08:05:17.615Z",
"iopub.status.idle": "2024-02-11T08:05:17.612Z"
}
}
}
],
"metadata": {
"kernel_info": {
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.2",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"kernelspec": {
"argv": [
"python",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"nteract": {
"version": "0.28.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@kylepls
Copy link
Author

kylepls commented Feb 11, 2024

This is an attempt to try and make those algorithms a bit easier to memorize. After a bit of usage, I wasn't able to make any meaningful progress with this approach.

Also See: https://www.rubiksplace.com/speedcubing/OLL-algorithms/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment