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 1o 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 1nú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 20desde 1:
1 *2
2 *2
4 *2
8 *2
16 *2
5 (-1)/3
10 *2
20 *2
También puede llegar 3desde 10restando 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 20a 3es (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, py q.
- La entrada es cualquiera de los dos enteros positivos menos que
2^20para 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
pyq.
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]sahorra tres bytes más.iterate(nub.concat.map f)[a]Además, ¿realmente necesitas elnub?breakyspan, ¡realmente útil![div n 2,n*3+1]!!mod n 2concycle[div n 2,n*3+1]!!nguardar 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 depyq, 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 de4que1en 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 -> 1fdenote un paso adelante,bun paso atrás en la secuencia de collatz. El patrónb->fno puede estar en una ruta más corta, ya que es la identidad (fse deshaceben cualquier caso). Por lo tanto, la ruta más corta solo puede consistir en patronesf->f,f->byb->b. Eso significa de nuevo que el camino más corto es siempre de la formaf->f->...->fob->b->...->bof->...->f->b->...->bJavaScript (ES6), 135 bytes
Realiza una búsqueda de amplitud.
xes el número de partida,yel destino,aun conjunto de valores de prueba,suna serie del número de pasos incluido en la cadena dex,zel valor actual. Sizyyno son iguales, calcularz*2,z/2y ya seaz*3+1o(z-1)/3, dependiendo de sizes 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