La secuencia de Collatz (también llamada problema 3x + 1) es donde comienzas con cualquier número entero positivo, para este ejemplo usaremos 10 y le aplicaremos este conjunto de pasos:
if n is even:
Divide it by 2
if n is odd:
Multiply it by 3 and add 1
repeat until n = 1
10 es par, entonces dividimos entre 2 para obtener 5. 5 es impar, por lo que multiplicamos por 3 y sumamos 1 para obtener 16. 16 es par, así que córtalo por la mitad para obtener 8. La mitad de 8 es 4, la mitad de 4 es 2, y la mitad de 2 es 1. Como esto nos llevó a 6 pasos, decimos que 10 tiene una distancia de parada de 6.
Un número de Super Collatz es un número cuya distancia de frenado es mayor que la distancia de frenado de cada número más pequeño que él. Por ejemplo, 6 es un número de Super Collatz ya que 6 tiene una distancia de detención de 8, 5 tiene una distancia de detención de 5, 4 tiene 2, 3 tiene 7, 2 tiene 1 y 1 tiene 0. ( A006877 en el OEIS) Debe tome un número n como entrada y haga salir todos los números de Super Collatz hasta n .
Reglas
El programa completo o la función es aceptable.
No puede calcular previamente ni codificar la secuencia de Super Collatz.
Puede tomar la entrada en cualquier formato razonable.
La salida puede devolverse como una lista desde la función, o imprimirse en STDOUT o en un archivo. Lo que sea más conveniente.
Las entradas inválidas (no números, decimales, números negativos, etc.) resultan en un comportamiento indefinido.
Muestra de pitón sin golf
def collatzDist(n):
if n == 1:
return 0
if n % 2 == 0:
return 1 + collatzDist(n / 2)
return 1 + collatzDist((n * 3) + 1)
n = input()
max = -1
superCollatz = []
for i in range(1, n + 1):
dist = collatzDist(i)
if dist > max:
superCollatz.append(i)
max = dist
print superCollatz
Muestra IO:
#in #out
4 --> 1, 2, 3
50 --> 1, 2, 3, 6, 7, 9, 18, 25, 27
0 --> invalid
10000 --> 1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171
También aquí están los primeros 44 números de Super Collatz:
1, 2, 3, 6, 7, 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161, 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239, 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935, 626331, 837799
Respuestas:
Pyth, 23 bytes
Demostración
Esto funciona tomando el máximo del rango hasta cada número por su distancia de parada de Collatz, y verificando si ese máximo es el número en cuestión.
fuente
Python 2, 104 bytes
c
es una función auxiliar que calcula la distancia de Collatz para un entero dado. La lambda sin nombre es la función principal, que calcula los números de Super Collatz hasta (pero sin incluir) la entrada.fuente
Dyalog APL , 41 bytes
Una función sin nombre. Nombre o paréntesis para aplicar.
Casos de prueba:
0 da como resultado un comportamiento indefinido.
fuente
ES6,
8683 bytesEditar: guardado 3 bytes al cambiar de
filter
una comprensión de matriz.fuente
Haskell, 84 bytes
Esto es masivamente lento, por supuesto, ¡pero funciona!
fuente
Oracle SQL 11.2, 329 bytes
Versión sin golf
La vista q es una vista recursiva verdadera (no una consulta jerárquica con CONNECT BY) que calcula todos los pasos hacia 1 para cada número entero entre 1 y: 1.
La vista v calcula las distancias de frenado.
La vista m utiliza la versión analítica de MAX para aplicarla a todas las filas anteriores, excluyendo la fila actual. De esa manera, para cada número entero, sabemos que es la distancia de frenado y la mayor distancia de frenado actual.
La consulta final verifica si la distancia de detención es mayor que la mayor distancia de detención. Y agrega algunos trucos para manejar 1 y el caso especial de: 1 que tiene un valor de 0.
fuente
MATL , 37 bytes
Pruébalo en línea!
fuente
𝔼𝕊𝕄𝕚𝕟, 30 caracteres / 38 bytes
Try it here (Firefox only).
La única razón por la que no publiqué esto antes fue porque no tenía claras las especificaciones. Utiliza una codificación personalizada que codifica caracteres de 10 bits.
Explicación
⩥ïⓜ
crea un rango[0,input)
para mapear.МȬ⧺$,a=[])
genera números de Collatz en una matriz vacía y⋎⟮aꝈ-1⟯>ɐ
usa la matriz de números de Collatz para obtener la distancia de frenado y verificar si es mayor que la distancia de frenado máxima anterior. Si es así,⅋(ɐ=Ⅰ,ᵖ$
hace que la distancia de frenado actual sea la distancia de frenado máxima y empuja el elemento actual en el rango a la pila. Después, los elementos de la pila se imprimen implícitamente.fuente
Jalea , 17 bytes
Pruébalo en línea!
Quizás sorprendentemente, ¡son solo 3 enlaces! Son
×3‘µHḂ?µÐĿL$€
,<Ṫ$
yẠ
.fuente