⏱️ Lectura: 12 min
El cubo Rubik 3x3x3 tiene exactamente 43.252.003.274.489.856.000 posiciones legales, unas 43 trillones, y el sitio Every Cube deja saltar a cualquiera de ellas escribiendo su número de índice, sin generar ni una sola de las anteriores.
📑 En este artículo
- TL;DR
- Introducción
- Qué pasó
- Contexto e historia
- Detalles técnicos: cómo se indexan las posiciones del cubo Rubik
- Cómo probarlo
- Impacto y análisis
- Qué sigue
- Preguntas frecuentes
- ¿Cuántas posiciones tiene realmente el cubo Rubik 3x3x3?
- ¿Qué es la posición Superflip?
- ¿Por qué el número máximo de movimientos es 20?
- ¿Cómo se puede saltar a una posición sin generar todas las anteriores?
- ¿El total de posiciones matemáticas es el mismo que el de posiciones alcanzables jugando?
- ¿Qué diferencia hay entre las vistas 2D y 3D en Every Cube?
- Referencias
El truco no es fuerza bruta: es un problema clásico de combinatoria llamado ranking y unranking de permutaciones, resuelto con un sistema de numeración factorial conocido como código de Lehmer. Acá repasamos esa matemática y cómo programarla.
TL;DR
- El cubo Rubik 3x3x3 tiene 43.252.003.274.489.856.000 posiciones legales, calculables con exactitud desde la teoría de grupos.
- Every Cube (everycube.alen.is) asigna un índice único a cada posición y deja saltar directo a cualquiera, con vistas 2D y 3D.
- El sitio destaca posiciones famosas: Superflip (los 12 bordes girados, esquinas intactas) y Checkerboard (patrón de tablero).
- Superflip necesita 20 movimientos para resolverse en métrica de giro de cara, el máximo posible según ‘God’s Number’, probado en 2010.
- Saltar a la posición N sin enumerarlas todas exige un sistema de numeración factorial (código de Lehmer) combinado con dígitos base 3 y base 2.
- El total se descompone en 8! permutaciones de esquinas (40.320), 3^7 orientaciones (2.187), 12! permutaciones de bordes (479.001.600) y 2^11 orientaciones (2.048), entre 2 por paridad.
- Sin la restricción física de armado, el total sube a 519.024.039.293.878.272.000: doce veces más que las posiciones alcanzables por movimientos legales.
Introducción
Every Cube parte de una idea simple de exponer: cada una de las posiciones del cubo Rubik tiene un número. Escribís ese número, el sitio calcula en el momento a qué posición corresponde y la dibuja. No hay una base de datos con 43 trillones de filas detrás: hay un algoritmo que traduce un índice en una configuración de piezas sin pasar por las anteriores.
Eso convierte a un juguete de 1974 en una demostración práctica de un problema de ciencias de la computación bastante más general: cómo enumerar, indexar y saltar dentro de un espacio combinatorio gigantesco sin recorrerlo entero.
Qué pasó
El sitio everycube.alen.is ofrece un cuadro de índice donde el visitante escribe cualquier número entre 1 y 43.252.003.274.489.856.000, y la posición correspondiente del cubo se renderiza al instante. Incluye toggles para ver el cubo en 2D o en 3D, un botón de efectos visuales (FX) y la notación estándar de movimientos (como R’, un giro de la cara derecha en sentido antihorario) para describir cómo llegar a esa posición desde el estado resuelto.
También trae una lista de posiciones marcadas como favoritas con nombre propio, entre ellas Superflip y Checkerboard. Superflip es la posición donde las ocho esquinas quedan en su sitio y orientación correctos, pero los doce bordes están todos girados 180 grados: cada cara del cubo se ve resuelta en color, pero cada pieza de borde está al revés. Checkerboard es el patrón de tablero de ajedrez, donde cada cara alterna sus colores en diagonal.
Contexto e historia
El cubo Rubik lo inventó el húngaro Ernő Rubik en 1974 como un ejercicio de escultura y geometría, no como un rompecabezas. Su estructura interna (un núcleo con ejes y 26 piezas móviles alrededor) resultó ser, sin que ese fuera el plan, una representación física de un grupo matemático: cada giro de cara es un elemento del grupo, y componer giros es multiplicar elementos del grupo.
Esa lectura algebraica del cubo llevó a una pregunta que tardó décadas en responderse: ¿cuál es el número mínimo de movimientos que hacen falta para resolver cualquier posición, en el peor caso? A ese número se lo conoce como ‘God’s Number’. Las primeras cotas inferiores rondaban 18 movimientos en los años 90; reducir la cota superior exigió partir las 43.252.003.274.489.856.000 posiciones en cerca de 56 millones de clases por simetría y resolver cada clase con búsqueda asistida por computadora.
En 2010, el equipo de Tomas Rokicki, Herbert Kociemba, Morley Davidson y John Dethridge terminó ese cómputo (con tiempo de procesamiento donado por Google) y publicó la prueba de que toda posición del cubo se resuelve en 20 movimientos o menos, y que existen posiciones, como Superflip, que efectivamente necesitan los 20. Desde entonces, 20 es un número cerrado: no baja ni sube.
Detalles técnicos: cómo se indexan las posiciones del cubo Rubik
El total de 43.252.003.274.489.856.000 no es una estimación: sale de contar por separado la permutación y la orientación de las esquinas, y la permutación y la orientación de los bordes, y después dividir por 2 debido a una restricción de paridad. La página de Wikipedia sobre el grupo del cubo Rubik documenta la fórmula completa:
| Componente del estado | Cantidad de valores posibles | Codificación usada |
|---|---|---|
| Permutación de las 8 esquinas | 8! = 40.320 | Código de Lehmer en base factorial decreciente (7!, 6!, …, 1!) |
| Orientación de las 8 esquinas | 3^7 = 2.187 | 7 dígitos en base 3 (la octava esquina se infiere por suma módulo 3) |
| Permutación de los 12 bordes | 12! = 479.001.600 | Código de Lehmer en base factorial decreciente (11!, 10!, …, 1!) |
| Orientación de los 12 bordes | 2^11 = 2.048 | 11 dígitos en base 2 (el doceavo borde se infiere por suma módulo 2) |
Multiplicar las cuatro columnas y dividir entre 2 (porque la paridad de la permutación de esquinas siempre tiene que coincidir con la paridad de la permutación de bordes) da exactamente 43.252.003.274.489.856.000.
⚠️ Ojo: si ignorás esa restricción de paridad y multiplicás las cuatro columnas sin dividir entre 2, el resultado es 519.024.039.293.878.272.000: doce veces más. Esas combinaciones extra solo son alcanzables desarmando el cubo y volviéndolo a armar mal, nunca girando caras.
Para saltar a la posición número N sin generar las anteriores hace falta el mismo truco que usan los generadores de casos de prueba para barajar mazos de cartas: el código de Lehmer, un sistema de numeración donde cada dígito tiene como base un factorial decreciente en vez de una potencia fija. Convertir un número a esa base (unranking) da directamente la permutación en la posición N, sin pasar por la N-1.
flowchart TD
A["Indice N entre 0 y 43.252.003.274.489.856.000"] --> B["Separar por division y modulo entre los 4 bloques"]
B --> C["Permutacion de esquinas: unranking factorial en base 8!"]
B --> D["Orientacion de esquinas: digitos base 3"]
B --> E["Permutacion de bordes: unranking factorial en base 12!"]
B --> F["Orientacion de bordes: digitos base 2"]
C --> G["Estado completo del cubo"]
D --> G
E --> G
F --> G
En código, el unranking de una permutación se ve así:
import math
def unrank_permutation(rank, elementos):
elementos = list(elementos)
permutacion = []
n = len(elementos)
for i in range(n, 0, -1):
base = math.factorial(i - 1)
indice = rank // base
rank %= base
permutacion.append(elementos.pop(indice))
return permutacion
# La permutacion numero 5 (base 0) de 4 elementos, sin generar las 4 anteriores
print(unrank_permutation(5, ["A", "B", "C", "D"]))
# ['A', 'D', 'C', 'B']
Ese fragmento resuelve el caso de 4 elementos genéricos. Para las 4 componentes del cubo (permutación y orientación de esquinas y bordes) hace falta combinarlas en un solo índice mixto, dividiendo sucesivamente entre el tamaño de cada bloque:
import math
CORNER_PERMS = math.factorial(8) # 40320
CORNER_ORIENTS = 3 ** 7 # 2187
EDGE_PERMS = math.factorial(12) # 479001600
EDGE_ORIENTS = 2 ** 11 # 2048
def unrank_estado_cubo(indice):
indice, orient_bordes = divmod(indice, EDGE_ORIENTS)
indice, perm_bordes = divmod(indice, EDGE_PERMS)
indice, orient_esquinas = divmod(indice, CORNER_ORIENTS)
perm_esquinas = indice # lo que queda cabe en 0..CORNER_PERMS-1
return {
"permutacion_esquinas": perm_esquinas,
"orientacion_esquinas": orient_esquinas,
"permutacion_bordes": perm_bordes,
"orientacion_bordes": orient_bordes,
}
print(unrank_estado_cubo(0))
# posicion resuelta: los cuatro campos en cero
Ese esquema es una simplificación didáctica: no aplica todavía la división entre 2 por paridad, así que a un N cualquiera le puede tocar una combinación de permutaciones que en la práctica nunca aparece girando un cubo físico. Un unranking fiel al grupo real necesita un paso extra que fije la permutación de bordes a partir de la paridad de la permutación de esquinas ya decodificada, no que la trate como independiente.
Cómo probarlo
Para experimentar con la idea sin escribir el unranking completo del cubo, alcanza con el fragmento de permutaciones genéricas de más arriba. La forma de confirmar que una implementación de unranking es correcta es hacer el viaje de ida y vuelta: convertir una permutación a su índice (ranking) y ese índice de nuevo a la permutación (unranking) tiene que devolver exactamente lo mismo.
def rank_permutation(permutacion):
elementos = sorted(permutacion)
rank = 0
n = len(permutacion)
for i, valor in enumerate(permutacion):
indice = elementos.index(valor)
rank += indice * math.factorial(n - 1 - i)
elementos.pop(indice)
return rank
assert rank_permutation(unrank_permutation(5, ["A", "B", "C", "D"])) == 5
Si ese assert no revienta, el par rank/unrank es consistente. En everycube.alen.is el equivalente es escribir un índice, mirar la posición en 3D y anotar la secuencia de movimientos que el sitio muestra para llegar hasta ahí desde el estado resuelto.
Impacto y análisis
El interés de Every Cube no está en el cubo en sí, sino en que expone en vivo una técnica que normalmente queda escondida dentro de otras herramientas: generadores de barajas de cartas reproducibles a partir de una semilla, motores de rompecabezas tipo Sudoku que necesitan enumerar tableros válidos, o esquemas de IDs reversibles que codifican una permutación sin guardarla entera en disco.
💡 Tip: el código de Lehmer no es exclusivo del cubo Rubik. Es la misma técnica detrás de barajar cartas de forma reproducible a partir de una semilla o de generar identificadores únicos y reversibles sin guardar una tabla con todos los valores posibles.
La cifra de 43.252.003.274.489.856.000 también sirve como vara para entender cuán rápido crecen los espacios combinatorios: agregar una sola dimensión (pasar de un cubo 3x3x3 a uno 4x4x4, por ejemplo) dispara el conteo en varios órdenes de magnitud, porque cada pieza nueva multiplica, no suma, las posibilidades.
Qué sigue
Herramientas de este tipo suelen crecer agregando resolutores automáticos (mostrar la secuencia óptima de movimientos para cualquier índice, no solo la posición) o extendiéndose a otros rompecabezas de la misma familia matemática, como el cubo 2x2x2 o el Megaminx, cuyos grupos de permutación se calculan con la misma lógica de descomposición en permutación más orientación.
📖 Resumen en Telegram: Ver resumen
Probalo vos: abrí everycube.alen.is, escribí un índice al azar entre 1 y 43.252.003.274.489.856.000 y mirá qué posición te devuelve en la vista 3D.
Preguntas frecuentes
¿Cuántas posiciones tiene realmente el cubo Rubik 3x3x3?
43.252.003.274.489.856.000, un número que sale de multiplicar las permutaciones y orientaciones de las 8 esquinas y los 12 bordes, y dividir entre 2 por la restricción de paridad entre ambos grupos de piezas.
¿Qué es la posición Superflip?
Es la posición donde las 8 esquinas están resueltas (en su lugar y orientación correctos) pero los 12 bordes están todos girados 180 grados. Es una de las posiciones que necesita el máximo de 20 movimientos para resolverse.
¿Por qué el número máximo de movimientos es 20?
Porque en 2010 un equipo liderado por Tomas Rokicki demostró, con búsqueda exhaustiva asistida por computadora sobre clases de simetría, que ninguna de las 43.252.003.274.489.856.000 posiciones necesita más de 20 giros de cara, y que existen posiciones, como Superflip, que efectivamente requieren los 20.
¿Cómo se puede saltar a una posición sin generar todas las anteriores?
Codificando la permutación en un sistema de numeración factorial (código de Lehmer): cada dígito tiene como base un factorial decreciente en vez de una potencia fija, lo que permite convertir un índice directamente en la permutación correspondiente sin recorrer las anteriores.
¿El total de posiciones matemáticas es el mismo que el de posiciones alcanzables jugando?
No. Si se ignora la restricción física de armado, la cuenta sube a 519.024.039.293.878.272.000, doce veces más que las 43.252.003.274.489.856.000 alcanzables girando caras sin desarmar el cubo.
¿Qué diferencia hay entre las vistas 2D y 3D en Every Cube?
La vista 2D muestra el desarrollo plano de las seis caras del cubo, útil para leer colores rápido; la vista 3D renderiza el cubo como objeto, útil para entender la orientación real de cada pieza en el espacio.
Referencias
- Every Cube: el sitio que indexa y muestra cualquier posición del cubo Rubik por número.
- Rubik’s Cube group (Wikipedia): la fórmula completa del conteo de 43.252.003.274.489.856.000 posiciones.
- Lehmer code (Wikipedia): el sistema de numeración factorial usado para ranking y unranking de permutaciones.
- God’s Number is 20: el proyecto que en 2010 demostró la cota máxima de 20 movimientos.
📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
Imagen destacada: Foto de Nick Fewings en Unsplash
0 Comentarios