Hoy veremos una secuencia a , relacionada con la función Collatz f :
Llamamos a una secuencia de la forma z, f (z), f (f (z)), ... una secuencia de Collatz .
El primer número en nuestra secuencia, a (1) , es 0 . Bajo la aplicación repetida de f , cae en un ciclo 0 → 0 →…
El número más pequeño que aún no hemos visto es 1, haciendo un (2) = 1 . Bajo la aplicación repetida de f , cae en un ciclo 1 → 4 → 2 → 1 →…
Ahora hemos visto el número 2 en el ciclo anterior, por lo que el siguiente número más pequeño es un (3) = 3 , que cae en el ciclo 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…
En todos los ciclos anteriores ya hemos visto 4 y 5 , por lo que el siguiente número es a (4) = 6 .
A estas alturas ya deberías tener la idea. a (n) es el número más pequeño que no fue parte de ninguna secuencia de Collatz para todos a (1), ..., a (n - 1) .
Escriba un programa o función que, dado un entero positivo n , devuelva a (n) . El código más corto en bytes gana.
Casos de prueba:
1 -> 0
2 -> 1
3 -> 3
4 -> 6
5 -> 7
6 -> 9
7 -> 12
8 -> 15
9 -> 18
10 -> 19
50 -> 114
(Esta es la secuencia OEIS A061641 .)
fuente
n
estar basada en 0?a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
a
no está basado en 0, no entiendo por qué parece que estás "hablando en base a 0" aquí:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
Respuestas:
Jalea ,
2019 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
Después de n iteraciones, el valor de a (n + 1) estará al comienzo de la matriz. Como concatenamos la nueva matriz con una copia invertida de la anterior, esto significa que un (n) estará al final.
fuente
Haskell,
9392 bytesEjemplo de uso:
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10
->19
.c x
es el ciclo de Collatz parax
con un poco de trampax == 1
. Las principales funciones de bucle a través de todos los números enteros y mantiene los que no están enc x
parax
en[0..y-1]
. Prácticamente una implementación directa de la definición. Como el operador de índice de Haskell!!
está basado en 0, comienzo-1
a anteponer un número (de lo contrario inútil) para arreglar el índice.fuente
MATL ,
4640 bytesPruébalo en línea!
Explicación
El código tiene un
for
bucle externo que generan
secuencias de Collatz, una en cada iteración. Cada secuencia es generada por undo...while
bucle interno que calcula nuevos valores y los almacena en un vector de secuencia hasta que se obtiene a1
o0
. Cuando terminamos con la secuencia, el vector se invierte y concatena a un vector global que contiene los valores de todas las secuencias anteriores. Este vector puede contener valores repetidos. La inversión del vector de secuencia asegura que al final del bucle externo el resultado deseado (el valor inicial de la última secuencia) estará al final del vector global.Pseudocódigo :
Código comentado :
fuente
Brachylog ,
7067656362 bytesPruébalo en línea!
fuente
Python 2,
9796 bytesAprovecha el hecho de que todos los múltiplos de 3 son puros. Pruébalo en Ideone .
Cómo funciona
En la primera línea,
r,=s={-1}
establece s = {-1} (conjunto) yr = -1 .A continuación, leemos un número entero de STDIN, repetimos cierta cadena muchas veces y luego lo ejecutamos. Esto es equivalente al siguiente código de Python.
En cada iteración, comenzamos por encontrar el miembro más pequeño de {r + 1, r + 2, r + 3} que no pertenece a s . En la primera iteración, esto inicializa r como 0 .
En todas las ejecuciones posteriores, s puede (y tendrá) algunos de r + 1 , r + 2 y r + 3 , pero nunca todos, ya que todos los múltiplos de 3 son puros. Para verificar esta afirmación, observe que ningún múltiplo m de 3 tiene la forma 3k + 1 . Eso deja a 2m como la única imagen previa posible, que también es un múltiplo de 3 . Por lo tanto, m no puede aparecer en la secuencia de Collatz de cualquier número que sea menor que m , y por lo tanto es puro.
Después de identificar r e inicializar n , aplicamos la función Collatz con
n=(n/2,3*n+1)[n%2]
, agregando cada valor intermedio de n al conjunto s cons|={n}
. Una vez que encontramos un número n que ya está en s ,{n}-s
dará un conjunto vacío, y la iteración se detiene.El último valor de r es el elemento deseado de la secuencia.
fuente
Pyth , 32 bytes
Banco de pruebas.
fuente
Java, 148 bytes
Ideone it! (Advertencia: complejidad exponencial debido a la optimización cero).
Convertirlo de un
do...while
bucle a otrofor
sería más divertido, pero tengo problemas para hacerlo.Los consejos de golf son bienvenidos como siempre.
fuente
for(b=1,i=1;i<n;i++)
afor(b=1,i=0;++i<n;)
. Por cierto, entiendo por qué su ideona se pierde el caso de prueba para 50, pero ¿por qué también pierde los 10? Puede manejarlo sin problemas.int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
Perl6, 96
Basado en la respuesta de Perl 5 . Un poco más, ya que la sintaxis Perl6 es menos tolerante que la sintaxis Perl5, pero me conformaré con esto por ahora.
fuente
PHP,
233124bytes+4 para la función:
fuente
Perl 5 - 74 bytes
Esta es una solución bastante sencilla. Aplica repetidamente la función Collatz a la variable
$a
y almacena en la matriz@c
que se ha visto el valor, luego, después de alcanzar 0 o 1, se incrementa$a
hasta que es un número que aún no se ha visto. Esto se repite varias veces igual a la entrada menos 2, y finalmente$a
se emite el valor de .fuente
Mathematica, 134 bytes
Formato más fácil de leer:
fuente