Esto se inspiró en un problema matemático que vi en algún lugar de Internet pero no recuerdo dónde (ACTUALIZACIÓN: El problema original se encontró en el subreddit de acertijos matemáticos con una prueba siempre que sea posible, consulte también esta publicación de Math SE ), solicitando una prueba si el siguiente proceso es posible para cualquier par arbitrario de enteros (por lo que recuerdo, fue posible para cualquier par dado):
Dado un par de enteros, j y k, duplique uno de ellos y agregue uno al otro, dando como resultado un par de enteros nuevos, es decir, (j, k) -> (j + 1, k * 2) o (j * 2, k + 1). Luego repita este proceso con esos enteros, con el objetivo de que el par de enteros sea igual.
Estos ejemplos dados no son necesariamente óptimos, pero muestran cómo se puede realizar este proceso en cualquier número entero, positivo, negativo o cero:
(2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(5, 6) -> (6, 12) -> (7, 24) -> (14, 25) -> (28, 26) -> (56, 27) -> (112, 28) -> (113, 56) -> (226, 57) -> (227, 114) -> (228, 228)
(0, 2) -> (1, 4) -> (2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(-4, 0) -> (-3, 0) -> (-2, 0) -> (-1, 0) -> (0, 0)
(3, -1) -> (6, 0) -> (12, 1) -> (13, 2) -> (14, 4) -> (15, 8) -> (16, 16)
(-4, -3) -> (-8, -2) -> (-16, -1) -> (-32, 0) -> (-31, 0) -> ... -> (0, 0)
Desafío
Cree un programa que tenga dos enteros, muestre la lista de pasos necesarios para igualar esos enteros incrementando repetidamente uno y duplicando el otro
Especificaciones
- La solución no tiene que ser óptima, pero debe resolverse en un número finito de pasos para cualquier par arbitrario
La entrada debe ser dos enteros
La salida puede ser cualquier salida razonable que denote claramente los enteros resultantes de cada paso, por ejemplo:
- una cadena con dos delimitadores distintos (cualquier símbolo, espacio en blanco, etc.), uno para cada número entero en un par y otro para cada par
- por ejemplo, entrada j, k: 2, 5 -> salida: 3,10; 6,11; 12,12
- una lista de listas de enteros
- por ejemplo, entrada j, k: 2, 5 -> salida: [[3, 10], [6, 11], [12, 12]]
- una cadena con dos delimitadores distintos (cualquier símbolo, espacio en blanco, etc.), uno para cada número entero en un par y otro para cada par
Si la entrada es un par de números iguales, puede generar cualquier cosa siempre que sea coherente con otras respuestas no triviales
- por ejemplo
- si la entrada [2, 5] tiene salida [[3, 10], [6, 11], [12, 12]], que no incluye el par de entrada, entonces la entrada [4, 4] no debería generar nada.
- si la entrada [2, 5] tiene salida [[2, 5], [3, 10], [6, 11], [12, 12]], que incluye el par de entrada, entonces la entrada [4, 4] debería salida [[4, 4]].
- por ejemplo
Se aplican métodos IO estándar y se prohíben las lagunas estándar
Este es el código de golf, por lo que la respuesta más corta en bytes gana
fuente
[(12,12),(6,11),(3,10),(2,5)]
para la entrada(2,5)
?Respuestas:
JavaScript (ES6),
1119083 bytesPruébalo en línea!
Comentado
fuente
Haskell,
7069 bytesPruébalo en línea!
Un simple BFS. Realiza un seguimiento de los pasos en una lista de la lista de pares.
fuente
Python 3 ,
907472 bytes-2 bytes gracias a Dennis .
Pruébalo en línea!
Toma la entrada como una lista singleton .
Sin golf
fuente
Pyth, 41 bytes
Pruébalo aquí
Explicación
Esta es una búsqueda bastante amplia y sencilla. Mantenga una cola de posibles secuencias (
J
), y hasta que obtengamos un par coincidente, tome la siguiente secuencia, pegue cada uno de los movimientos posibles y colóquelos al final de la cola.En aras de la brevedad, definimos una función
y
(utilizando la expresión lambdaL
) para realizar uno de los movimientos y aplicarla tanto hacia adelante como hacia atrás.fuente
Jalea , 20 bytes
Pruébalo en línea!
fuente
[[2,5]]
)05AB1E ,
252220 bytesToma una lista doblemente anidada como entrada y genera una lista irregular con cada paso en una profundidad de nido.
Pruébalo en línea!
Explicación
fuente
Retina , 72 bytes
Pruébalo en línea! Solo dos casos de prueba debido a las limitaciones de la aritmética unaria. Explicación:
Convierte a unario.
Si bien la entrada no contiene un par de números idénticos ...
... coincide con el último par en cada línea ...
... y convierta la línea en dos líneas, una sufijada con el primer número incrementado y la segunda duplicada, la otra sufijada con el primer número duplicado y la segunda incrementada.
Mantenga la línea con el par correspondiente.
Convertir de nuevo a decimal.
89Versión aritmética decimal sin signo de 88 bytes (también funciona con 0):Pruébalo en línea!
fuente
MATL , 24 bytes
El tiempo de ejecución es aleatorio, pero es finito con probabilidad 1.
El código es muy ineficiente. Las entradas que requieren más de 4 o 5 pasos tienen una gran probabilidad de tiempo de espera en el intérprete en línea.
Pruébalo en línea!
Explicación
fuente
Stax ,
2926 bytesEjecutar y depurarlo
Es una primera búsqueda amplia. Parece razonablemente rápido.
Se necesita un par de enteros doblemente envueltos. La salida es una lista de valores separados por espacios. Cada dos valores representa un par en el camino hacia la solución.
fuente
Haskell , 95 bytes
Pruébalo en línea! Salidas en orden inverso, por ejemplo,
h(2,5)
rendimientos[(12,12),(6,11),(3,10),(2,5)]
.fuente
Rojo , 142 bytes
Toma la entrada como un bloque doblemente anidado del par de enteros en el formato de Red
(2, 5)
->2x5
Devuelve el resultado como una lista de pares rojos , por ejemplo
2x5 3x10 6x11 12x12
. Incluye el par inicial.Pruébalo en línea!
Entrada estricta:
La entrada es dos números, por ejemplo
2 5
Rojo , 214 bytes
Pruébalo en línea!
Explicación:
fuente