Para referencia de lo que es la torre de Hanoi, busca en Google o mira en la página de Wikipedia .
Su código debería poder hacer 2 cosas, y son las siguientes:
- Acepte la entrada del usuario que especifica el número de discos en el punto de partida de la torre de Hanoi.
- Cree la salida de la manera que elija (siempre que sea lógico) para mostrar la solución al rompecabezas de la torre.
Un ejemplo de salida lógica sería el siguiente (usando un inicio de 4 discos):
L1L2C1L1R-2R-1L1L2C1C-1R-2C1L1L2C1
L
representa la clavija izquierda, C
representa la clavija central y R
representa la clavija derecha y los números son qué tan lejos mover el disco en esa clavija y en qué dirección. Los números positivos representan el número de clavijas que se mueven hacia la clavija más a la derecha (porque los discos comienzan en la clavija más a la izquierda).
Las reglas para la torre de Hanoi son simples:
- Solo se puede mover un disco a la vez.
- Cada movimiento consiste en tomar el disco superior de una de las clavijas y deslizarlo sobre otra clavija, encima de los otros discos que ya pueden estar presentes en esa clavija.
- No se puede colocar ningún disco encima de un disco más pequeño.
Los discos comienzan en la clavija más a la izquierda, la más grande en la parte inferior, la más pequeña en la parte superior, naturalmente.
Respuestas:
Casco , 5 bytes
Pruébalo en línea!
Cada uno
n
en la salida representa mover el discon
a la siguiente clavija disponible (envoltura cíclica).Explicación
fuente
Python, 76 caracteres
Por ejemplo, para N = 3 devuelve:
fuente
Perl - 54 caracteres
Ejecute
perl -M5.010
e ingrese el número de discos en stdin.Formato de salida:
Una línea por movimiento, el primer dígito es de clavija, el segundo dígito es de clavija (a partir de 0)
Ejemplo:
fuente
$x=--$_&-$_,say(($_-$x)%3,($_+$x)%3)for 2..1<<<>
GolfScript (
31 2524 caracteres)Gracias a Ilmari Karonen por señalar que mis
tr
s / permutaciones originales podrían acortarse en 6 caracteres. Al descomponerlos como producto de dos permutaciones, logré salvar una más.Tenga en cuenta que factorizar la
3%
longitud aumenta en un carácter:Algunas personas tienen formatos de salida realmente complicados. Esto genera la clavija movida desde (numerada 0, 1, 2) y la clavija movida a. La especificación no dice a qué clavija mover, por lo que se mueve a la clavija 1.
P.ej
fuente
])~{.{3^3%}%2,@{2\-}%++}*
Perl, 75
79caracteresRobando totalmente el formato de salida de Keith Randall:
Invocar con
-M5.010
para elsay
.(Creo que esto puede mejorarse si puede encontrar una manera de utilizar el valor de retorno de la función en lugar de simplemente suprimirlo).
fuente
say
" recomendación]SML, 63
función de llamada
f(n,s,t)
con:fuente
Bash (64 caracteres)
Publicar este a pesar de ser más del doble de largo que el de GolfScript porque me gusta la reutilización de
t
para servirecho $s
.fuente
Scala,
928887 caracteresFormato de salida
Di número de disco = 3 entonces,
fuente
C,
989287 caracteresImplementa el algoritmo más trivial.
La salida está en la forma
ab ab ab
en que cada par significa "mover el disco superior de la clavija a la clavija b".EDITAR : Los movimientos ahora están codificados en hexadecimal - 0x12 significa moverse de la clavija 1 a la clavija 2. Guardado algunos caracteres.
EDITAR : lee el número de la entrada estándar, en lugar del parámetro. Más corto.
Ejemplo:
% echo 3 | ./hanoi
13 12 32 13 21 23 13
fuente
h(x,printf(...))
es simplemente una forma de llamarprintf
antes de queh
se llame. La últiman++
se realiza después de losh
retornos internos . Se usa para deshacer la inicialn--
.;
sería lo mismo aquí.,
A menudo es útil (por ejemplo,if(x)a,b;
reemplazaif(x){a;b;}
), pero no tiene ninguna ventaja aquí.Jalea , 5 bytes
Pruébalo en línea!
0
mueva el disco más pequeño un espacio a la derecha (volviendo al inicio si es necesario)1
mueva el segundo disco más pequeño a la única otra columna legal2
mueva el tercer disco más pequeño a la única otra columna legal,etc.
Algoritmo
Podemos ver la solución del problema de Towers of Hanoi de forma recursiva; para mover una pila de tamaño n de A a B , mover una pila de tamaño n -1 de A a C , entonces el disco de tamaño n de A a B , a continuación, mover una pila de tamaño n -1 desde B a C . Esto produce un patrón de la siguiente forma (en el formato de salida utilizado por este programa):
Podemos observar que esta secuencia es A007814 en el OEIS. Otra posible definición de la secuencia es "el elemento k th (basado en 1) de la secuencia es el número de ceros al final del número k cuando está escrito en binario". Y eso es lo que calcula el programa aquí.
Explicación
Primero, calculamos el número de movimientos en la solución, 2 n -1. Resulta que es el más corto para calcular realmente un movimiento adicional y descartarlo más tarde, por lo que es
2*
, es decir, 2 al poder de algo. (La única entrada que hemos tomado hasta ahora es el argumento de la línea de comando, por lo que se usa de forma predeterminada).A continuación, usamos el código incorporado de Jelly para calcular el número de ceros al final de un número en la base b ; que de . Como estamos calculando en binario, es . Todo lo que necesitamos hacer es aplicar este valor incorporado a los números del 1 al 2 n -1 inclusive.
ọb
ọ2
Hay dos formas sencillas para repetir una serie de números en la jalea,
€
yR
, y mis anteriores intentos de este problema utilizan uno de estos. Sin embargo, en este caso, es posible ir un poco más corto:Ṗ
cuando se le da un número como entrada, le permitirá hacer una iteración que detiene un elemento brevemente (en general,Ṗ
es una función incorporada para procesar todos menos un elemento de algo). Eso es exactamente lo que queremos en este caso (porque2*
genera una demasiadas elments), por lo que el uso de enlace2*
yọ2
en la2*Ṗọ2
que nos da una solución de 5 bytes al problema.fuente
Awk, 72 caracteres
El formato de salida es el mismo que el de Keith Randall .
fuente
Bash script,
10096 caracteresEl formato de salida es el mismo que el de Keith Randall .
Editar : Guardado 4 caracteres por el comentario de Peter .
fuente
$@
J, 23 bytes
solución de números binarios
Esta solución utiliza el método de conteo binario descrito en este video .
Es decir, genero los dígitos binarios de
1
hasta2^n
, luego tomo infijos de longitud 2 y comparo cada bit con el bit correspondiente del número anterior, y compruebo si son desiguales. El número de bits desiguales es la salida para ese movimiento.Salida, por ejemplo, para 3 discos, donde el disco más pequeño está etiquetado como 1:
1
significa "mover la clavija más pequeña del disco a la derecha, volviendo a la primera clavija si es necesario"n
, para todos los demásn
, significa "mover el discon
a una clavija legal" (siempre habrá exactamente uno)Pruébalo en línea!
solución recursiva
El mismo resultado que la solución anterior, pero la lógica aquí aclara la naturaleza recursiva del problema.
Visualizarlo como un árbol también enfatiza este punto:
Pruébalo en línea!
fuente
APL (Dyalog Classic) , 19 bytes
Pruébalo en línea!
la salida es una matriz de ints de 2 columnas en {0,1,2} - de clavija a clavija
fuente
K (ngn / k) , 23 bytes
Pruébalo en línea!
fuente
R , 73 bytes
Poniendo R en el mapa. Inspirado por [la respuesta de Keith Randall] [1] con entrada simplificada, imprima solo el final y comience a vincular para guardar 2 bytes. También clavijas indexadas 0.
Pruébalo en línea!
fuente
JavaScript (ES6), 45b
por ejemplo, llamar
h(4, 'A', 'B', 'C')
(mover 4 discos de la clavija A a la clavija C usando la clavija auxiliar B)retornos
'ABACBCABCACBABACBCBACABCABACBC'
(mover un disco de la clavija A a la clavija B, mover un disco de la clavija A a la clavija C, mover un disco de la clavija B a la clavija C, etc.)fuente