Este es un rompecabezas común que muchos de ustedes han resuelto manualmente. Ahora es el momento de escribir un algoritmo para resolver el mismo.
Hay palos de igual número alineados en dos lados diferentes uno frente al otro en dirección. Hay un solo espacio vacío entre ellos. Diga algo como la siguiente figura (si el número total de palos de coincidencia es 4).
Cada palo puede deslizarse un paso hacia adelante (si el espacio frontal inmediato es libre), o puede saltarse sobre un palo en su frente y aterrizar en el espacio libre (si ese espacio es libre). El movimiento en dirección inversa no es posible (incluso el espacio es libre). No se permite el salto inverso también. Solo se permite un movimiento en un solo paso.
Ahora, tiene que escribir un algoritmo para encontrar los pasos mínimos requeridos con los cuales todos los palos de coincidencia del lado izquierdo caerán en el lado derecho y todos los palos de partido del lado derecho caerán en el lado izquierdo.
Por ejemplo: si hay un total de 2 palos (1 en cada lado), los pasos serán:
Nota: En la figura anterior, la palanca lateral izquierda se movió primero. Existe otra solución cuando el palo del lado derecho se mueve primero. Pero para este problema, debe dar solo una solución y eso también supone que el joystick izquierdo se mueva primero.
La siguiente figura describe los movimientos con 4 palos (2 en cada lado):
Nota: En la figura anterior, la palanca lateral izquierda se movió primero. Existe otra solución cuando el palo del lado derecho se mueve primero. Pero para este problema, debe dar solo una solución y eso también supone que el joystick izquierdo se mueva primero.
[Suposición: La entrada puede ser cualquier número par entre 02 y 14 (es decir, 1 a 7 palos coincidentes en cada lado). Para las entradas fuera de este rango, no necesita hacer ninguna validación, ni tampoco debe proporcionar ningún mensaje de error. Nota: en la salida, cada paso está separado por un '|' (pipa) personaje. Los programadores de COBOL siempre deben asumir PIC 9 (2) como tamaño de entrada y también pueden suponer que la salida tiene una longitud máxima fija de 450 caracteres, rellena con espacios a la derecha.]
Entrada de muestra:
02
Salida de muestra:
01To02|03To01|02To03|
Entrada de muestra:
04
Salida de muestra:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
Entrada de muestra:
06
Salida de muestra:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|
fuente
Respuestas:
APL 129
El siguiente código toma entradas y salidas de pantalla a la pantalla en el formato especificado:
Un buen tercio del código se toma formateando la salida. La lógica se completa por la aparición del símbolo ⋄ en el código.
A continuación se muestra el resultado de una entrada de 08 como verificación:
fuente
Javascript
178 174161prompt
s paran
luegoalert
s respuesta. (Sin0
relleno)Último:
2:
1:
Esto utiliza el concepto de que el patrón se refleja:
Entonces, dónde
n=2
, el patrón de movimiento es:Lo que equivale a
Este patrón se repite así (
n=8
)Podemos notar algunos patrones aquí:
n/2
, que se repite 3 veces, luego disminuye de nuevo a 1.1
y el número de saltos secuenciales aumenta de 1 an/2
luego disminuye de nuevo a 1.n=14
:Salida de muestra:
f(2)
:f(8)
:f(40)
:Aquí hay un pseudocódigo para demostrar el método:
fuente
l/L/r/R
ym/j
. Me gusta la idea de separar la distancia movida de la direcciónC -
216213Mi solución se basa en dos hechos:
El campo "a" es el campo "desde" del movimiento anterior (ya que siempre crea un espacio vacío en el espacio desde el que se mueve y siempre se mueve a un espacio vacío)
Hay un patrón muy regular en las distancias y direcciones que se mueven. Para los primeros 3 casos de prueba, son:
1 -2 1
1 -2 -1 2 2 -1 -2 1
1 -2 -1 2 2 1 -2 -2 -2 1 2 2 -1 -2 1
Con eso en mente, básicamente escribí un programa para producir y continuar ese patrón. Estoy bastante seguro de que debe haber una forma recursiva realmente hermosa y mucho más elegante de escribir esto, pero aún no lo he descubierto:
Y golf (aunque este fue un desafío de código, no golf):
fuente
scanf
. Estoy actualizando mi respuesta con una versión mejor.N(2)=rLr
,N(4)=rLlRRlLr
,N(6)=rLlRRrLLLrRRlLr
, etc.Mathematica
Este enfoque crea una
Nest
secuencia ed del tamaño y la dirección de los movimientos, formateada como{fromPosition,toPosition}
, comenzando con la posiciónn
, donde sen
refiere al número de pares de coincidencias. LuegoFold
convierte la secuencia en una función que comienza con el movimiento{n, n+1}
.Visualizando los Swaps
r
,b
yo
son imágenes o una coincidencia roja, una coincidencia azul y ninguna coincidencia, respectivamente.A continuación, se formatea la salida
z
para mostrar los intercambios con coincidencias.swaps
produce una lista de estados utilizando los pares ordenados dez
comandos como para permutar la lista inicial y las listas posteriores.swapMatches
muestra los estados en una cuadrícula.fuente
Javascript 191
Caracteres contados usando
grep =|tr -d \ |wc -c
fuente
02
, los valores son correctos, pero le falta el final|
. Para los otros dos casos, los valores están muy alejados, y el formato10
también es incorrecto. Tampoco estoy seguro sobre tu método de conteo de personajes. ¿Por qué solo cuenta el cuerpo de la función menos el retorno?tr -d \ |wc -c
tiene en cuenta las