La conjetura de Collatz es una conjetura muy conocida. Toma un entero positivo; si es par, divida por 2, de lo contrario, multiplique por 3 y agregue 1. Repita hasta que llegue 1
o algo más suceda. La conjetura es que este proceso siempre llega 1
.
También puedes revertir el proceso. Comience en 1
, multiplique por 2 y bifurque a multiply by 3 and add 1
números, cuando llegue a un número par 1 (mod 3)
, es decir , reste 1 y divida por 3.
Un camino de Collatz combina los dos, tratando de pasar de un número a otro con esas cuatro operaciones.
Por ejemplo, para llegar 20
desde 1
:
1 *2
2 *2
4 *2
8 *2
16 *2
5 (-1)/3
10 *2
20 *2
También puede llegar 3
desde 10
restando 1 y dividiendo entre 3.
Con estas herramientas, puede recorrer una ruta de Collatz de un número a otro. Por ejemplo, la ruta de 20
a 3
es (dividir por 2), (restar 1, dividir por 3).
En resumen, las operaciones disponibles son:
n * 2 always
n // 2 if n % 2 == 0
n * 3 + 1 if n % 2 == 1
(n-1) // 3 if n % 6 == 4
Nota: no todos los caminos de Collatz son cortos. a(7,3)
podría funcionar
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 2, 4, 8, 16, 5, 10, 3
pero un camino más corto es
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 3
El reto
Encuentre la longitud del camino Collatz más corto entre dos enteros positivos, p
y q
.
- La entrada es cualquiera de los dos enteros positivos menos que
2^20
para evitar el desbordamiento de enteros. El método de entrada queda a discreción del golfista. Los enteros pueden ser los mismos, en cuyo caso, la longitud de la ruta de Collatz es0
. - La salida debe ser un número entero, indicando la longitud del camino Collatz más corto entre
p
yq
.
Casos de prueba
a(2,1)
1
a(4,1)
1 # 4 -> 1
a(3,1)
6 # 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
a(11,12)
11 # 11 -> 34 -> 17 -> 52 -> 26 -> 13
# -> 40 -> 20 -> 10 -> 3 -> 6 -> 12
a(15,9)
20 # 46 -> 23 -> 70 -> 35 -> 106 -> 53 -> 160 -> 80 -> 40 -> 13
# -> 26 -> 52 -> 17 -> 34 -> 11 -> 22 -> 7 -> 14 -> 28 -> 9
Muchas gracias a orlp por su ayuda para aclarar este desafío.
Como siempre, si el problema no está claro, hágamelo saber. ¡Buena suerte y buen golf!
Respuestas:
Haskell,
1701581571461431371351151091081061010099 bytes¡No esperaba que mi versión original fuera mucho más fácil de jugar, este también es el trabajo de @nimi @Lynn y @Laikoni!
¡Gracias @Laikoni por un byte, @Lynn por
11 14 2021 bytes, @nimi por 8 bytes!Esto expande el árbol de números visitados (comenzando por
a
) paso a paso, y verifica en cada paso si llegamos al número dadob
.fuente
iterate s [a] -> iterate s[a]
s
ahorra tres bytes más.iterate(nub.concat.map f)[a]
Además, ¿realmente necesitas elnub
?break
yspan
, ¡realmente útil![div n 2,n*3+1]!!mod n 2
concycle[div n 2,n*3+1]!!n
guardar un byte más :)Python 2, 110 bytes
fuente
Pyth, 30 bytes
Pruébalo en línea
Cómo funciona
Tome la longitud de la diferencia simétrica de las dos secuencias de Collatz hacia adelante que comienzan en los dos números de entrada y terminan en 2. La única excepción es si la entrada es
[1, 2]
o[2, 1]
, lo cual es un caso especial.fuente
Python 2,
156179191209181172177171 bytesDesde un camino Collatz puede ser imaginado como
a(1,p)
ya(1,q)
unidos en el primer número que es común a ambas secuencias ya(1,n)
es la conjetura original de Collatz, esta función calcula la secuencia de Collatz dep
yq
, y calcula la longitud de allí. Este no es un golf bonito, por lo que las sugerencias de golf son muy bienvenidas. La única excepción es cuándop or q == 1
. Entonces, ya que podemos saltar directamente de4
que1
en lugar de una secuencia regular de Collatz, tenemos que restar un paso del resultado.Editar: Mucha corrección de errores.
Editar: Montones y montones de corrección de errores
Pruébalo en línea!
fuente
a(3,1)
devuelve 7 mientras que debería devolver 6, ya que el camino más corto es3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
f
denote un paso adelante,b
un paso atrás en la secuencia de collatz. El patrónb->f
no puede estar en una ruta más corta, ya que es la identidad (f
se deshaceb
en cualquier caso). Por lo tanto, la ruta más corta solo puede consistir en patronesf->f
,f->b
yb->b
. Eso significa de nuevo que el camino más corto es siempre de la formaf->f->...->f
ob->b->...->b
of->...->f->b->...->b
JavaScript (ES6), 135 bytes
Realiza una búsqueda de amplitud.
x
es el número de partida,y
el destino,a
un conjunto de valores de prueba,s
una serie del número de pasos incluido en la cadena dex
,z
el valor actual. Siz
yy
no son iguales, calcularz*2
,z/2
y ya seaz*3+1
o(z-1)/3
, dependiendo de siz
es par o impar, entonces filtrar las fracciones y los valores vistos anteriormente y añadirlos a la lista de búsqueda.fuente
Python 2, 80 bytes
Tome la longitud de la diferencia simétrica de las dos secuencias de Collatz hacia adelante que comienzan en los dos números de entrada y terminan en 2. La única excepción es si la entrada es 1, 2 o 2, 1, lo cual es un caso especial.
fuente