La conjetura de Collatz postula que si toma un número entero positivo, repita el siguiente algoritmo suficientes veces:
if number is odd, then multiply by three and add one
if number is even, then divide by two
eventualmente terminarás en 1. Parece que siempre funciona, pero nunca se ha demostrado que siempre funcione.
Ya has jugado al golf calculando cuánto tiempo lleva llegar a 1 , así que pensé en cambiar un poco las cosas.
Comenzando con un entero positivo dado, calcule cuánto tiempo lleva llegar a 1 (su "tiempo de detención"). Luego encuentra el tiempo de detención de ese número.
Repita hasta llegar a 1, o hasta llegar al límite completamente arbitrario de 100 iteraciones. En el primer caso, imprima cuántas iteraciones tomó. En el último caso, imprima "Fail" o algún otro resultado consistente de su elección, siempre que no sea un número entero 1≤n≤100
. No puede generar una cadena vacía para esta opción. Sin embargo, se permite generar un número entero fuera del rango [1, 100].
Ejemplos:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Como calculé 10^100
y 12345678901234567890
usando un idioma que solo admite reales para ese tamaño, si su idioma es más preciso, puede obtener resultados diferentes para ellos.
Tanteo
Como se trata de código de golf , gana la respuesta con la menor cantidad de bytes.
fuente
Respuestas:
Jalea , 24 bytes
Pruébalo en línea!
fuente
³
lugar de ).ȷ2
Python 2 , 70 bytes
Devuelve 199 para cien o más iteraciones.
Pruébalo en línea!
fuente
Agregado , 40 bytes
Pruébalo en línea!
Este es un nuevo lenguaje que hice. Quería hacer un lenguaje infijo adecuado, y este es el resultado: una imitación matemática. Hurra?
Explicación
Esta es una composición de algunas funciones. Estas funciones son:
PeriodicSteps[CollatzSize@Max&1]
Esto produce una función que aplica su argumento hasta que los resultados contienen un elemento duplicado. Esta función,CollatzSize@Max&1
se aplicaCollatzSize
a la entrada mayor y1
, para evitar la entrada no válida0
a CollatSize.`#
es un operador cotizado; cuando se aplica monádicamente en este sentido, obtiene el tamaño de su argumento`-&3
es una función vinculada, que une el argumento3
a la función`-
, que se lee como "menos 3". Esto se debe a que la aplicación PeriodicSteps produce0
s, que deben tenerse en cuenta. (También maneja de forma ordenada números fuera de los límites, como5
, qué mapa-1
).fuente
J ,
4945 bytes-4 bytes gracias al código de secuencia de Collatz más corto tomado del comentario de @ randomra aquí .
Salidas
101
para resultados no válidos.Pruébalo en línea!
Explicación
Como era de esperar, esta explicación se ha vuelto obsoleta rápidamente. Lo dejaré en términos de la respuesta anterior de 49 bytes que tenía, que incluyo a continuación. Si quieres una actualización, avísame. La forma en que encuentra la longitud de la secuencia recursiva sigue siendo la misma, acabo de usar un método de secuencia de Collatz más corto.
Encontrar la longitud de la secuencia de Collatz
Esta sección del código es la siguiente
Aquí está la explicación:
Desafortunadamente, el verbo apply (
^:
) cuando se le dice que almacene los resultados también almacena el valor inicial, por lo que significa que estamos (como siempre) desactivados por uno. Por eso restamos 1.Encontrar la longitud de la secuencia recursiva
fuente
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
deberían ser equivalentesC (gcc) , 75 bytes
Devoluciones
-1
paran>=100
iteraciones.Pruébalo en línea!
C (gcc) , 73 bytes
Devoluciones
0
paran>=100
iteraciones.Pruébalo en línea!
fuente
JavaScript (ES6), 57 bytes
Regresa
true
cuando falla. Devoluciones0
para1
.Casos de prueba
Mostrar fragmento de código
fuente
APL (Dyalog Unicode) ,
3960535249 bytes-3 bytes gracias a @ngn
Pruébalo en línea!
Utiliza el código @ngn para Collatz, pero anteriormente utilizó el código @ Uriel.
Aquí está la versión anterior que no cumplía con las especificaciones:
fuente
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 bytes
Pruébalo en línea!
Devuelve
101
para una secuencia que no termina.fuente
Casco , 21 bytes
Pruébalo en línea! Retornos
-1
en caso de falla,0
en la entrada1
.Explicación
fuente
C (gcc) ,
7073 bytesPruébalo en línea!
Devuelve
101
cuando el número de iteraciones excede 100.fuente
m=0
en suf
(probablemente incluso haciendo uso delfor
intiailizador actualmente vacío para guardar uno a;
).limpia ,
146... 86 bytes-11 bytes gracias a Ørjan Johansen
Como una función parcial literal.
Pruébalo en línea!
Cancela con
hd of []
si el número de iteraciones excede de 100.Sale con las
Heap Full
entradas de más de ~ a2^23
menos que especifique un tamaño de almacenamiento dinámico mayor.fuente
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
parte, curry. (O eta reduce.)Python 2 ,
999897 bytesc and t or f
lugar det if c else f
.-1
lugar def
o'f'
para entradas sin detener.Pruébalo en línea!
fuente
BiwaScheme , 151 caracteres
Puedes probarlo aquí .
fuente
R ,
119107bytesUtiliza parcialmente el código collatz de Jarko Dubbeldam desde aquí . Devuelve
0
para> 100 iteraciones (falla).Pruébalo en línea!
fuente
NARS APL, 115 bytes, 63 caracteres
Probablemente usando bucles sería más claro ... Hay 4 funciones, 2 anidadas y enriquecedoras, y la primera solo para definir e inicializar a = 0, la variable d, vista desde la 2ª función como un contador variable global.
Esta 3ª función, sería la función que devuelve cuántas llamadas hay para resolver la conjetura de Collatz para su arg
Esta es la 2ª función, si tiene su arg = 1, detiene su recursión y devuelve d la cantidad de veces que se llama a sí misma-1; de lo contrario, si se llama a sí mismo más de 99 veces, detenga su recursión y devuelva -1 (falla); de lo contrario, calcule la conjetura de Collatz para su arg y se llame a sí mismo para el valor de longitud de la secuencia de Collatz. Para mí, incluso si todo esto parece ejecutado, podría ser un gran problema si se define una variable global y una variable en una función del mismo nombre, cuando el programador lo ve como una variable local.
fuente
(Emacs, Common, ...) Lisp, 105 bytes
Devuelve t para iteraciones> 100
Expandido:
fuente