Recientemente leí sobre teoría de grafos, especialmente hipercubos y pensé en formas interesantes de construir caminos en ellos. Esto es lo que se me ocurrió.
Como puede saber, puede construir un hipercubo n-dimensional tomando todas las n-tuplas que consisten en 1
y 0
como vértices y conectarlos, si difieren en un dígito. Si interpreta estos dígitos binarios como un número entero, termina con un gráfico con vértices bien numerados. Por ejemplo para n=3
:
Digamos que desea dar un paseo por este hipercubo y comenzar en el vértice 0
. Ahora, ¿cómo determina qué vértice desea visitar a continuación? La regla que se me ocurrió es tomar el número a
del vértice en el que se encuentra, voltear su mod(a,n)
bit s (indexación basada en cero) e ir al vértice resultante. Formalmente, esta regla puede definirse recursivamente como
a[m+1] = xor(a[m], 2^mod(a[m],n)).
Al seguir esta regla, siempre permanecerá en el cubo y viajará a lo largo de los bordes. El camino resultante se ve así
Como puedes ver, ¡caminarás en círculo! De hecho, en todas las dimensiones y para todos los puntos de partida, su camino terminará en un bucle. Por ejemplo para n=14
y a[0]=0
se ve así
Para el ambicioso ambler, la longitud de su ruta planeada es una información bastante crucial. Entonces, su trabajo es escribir una función o un programa que tome la dimensión del hipercubo n
como el vértice inicial a[0]
como entradas y genere el número de vértices en el bucle resultante.
Casos de prueba
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Reglas
- Las lagunas estándar están prohibidas
- La salida / entrada puede estar en cualquier formato adecuado
- Puede asumir
a[0]
que es un vértice válido
Puntuación
El código más corto en bytes gana.
Si tiene información adicional sobre este tema, ¡me encantaría saberlo!
fuente
a[m+1] = xor(a[m], 2^mod(a[m],n))
, es irrelevante si los vértices pertenecen a un hipercubo, ¿verdad?a[m]
estaba en el hipercubo, tambiéna[m+1]
lo estará. Y como puede suponera[0]
que es un vértice válido, prácticamente no necesita preocuparse por nada de hipercubos y simplemente seguir la regla.Respuestas:
Jalea, 9 bytes
Toma dos argumentos de línea de comandos.
Probarlo aquí .
fuente
Haskell, 124
Esto encuentra el círculo mediante el algoritmo de dos punteros dando vueltas en diferentes velocidades, y usa / abusa en gran medida del enfoque de Haskell a las listas (por ejemplo, los dos punteros son en realidad listas).
g
es la función que calcula la respuesta. dáselon
y luegoa[0]
te devolverá el número (ten en cuenta quen
debe definirse como de tipoInt
para evitar la ambigüedad de tipo).fuente
JavaScript (ES6), 69 bytes
Devuelve 18812 para (23, 10).
fuente
MATL ,
383728 bytesEsto funciona en la versión actual (15.0.0) del lenguaje.
Pruébalo en línea !
Explicación
fuente
Pyth,
2217 bytesExplicación:
Probarlo aquí .
fuente