Creo que la Conjetura de Collatz ya es conocida. Pero, ¿y si invertimos las reglas?
Comience con un número entero n> = 1.
Repita los siguientes pasos:
Si n es par , multiplíquelo por 3 y agregue 1.
Si n es impar , reste 1 y divídalo por 2.
Pare cuando llegue a 0
Imprime los números iterados.
Casos de prueba:
1 => 1, 0
2 => 2, 7, 3, 1, 0
3 => 3, 1, 0
10 => 10, 31, 15, 7, 3...
14 => 14, 43, 21, 10, ...
Reglas:
Esta secuencia no funciona para muchos números porque entra en un bucle infinito. No necesita manejar esos casos. Solo imprimir los casos de prueba anteriores es suficiente.
Sugerí restar 1 y dividir por dos para dar un número entero válido para continuar, pero no es necesario que se calcule de esa manera. Puede dividir por 2 y convertir a entero o cualquier otro método que dé el resultado esperado.
También debe imprimir la entrada inicial.
La salida no necesita formatearse como los casos de prueba. Era solo una sugerencia. Sin embargo, se debe respetar el orden iterado.
El código más pequeño gana.
0
al final?Respuestas:
Perl 6 , 30 bytes
Pruébalo en línea!
Bloque de código anónimo que devuelve una secuencia.
Explicación:
fuente
Haskell ,
4039 bytesPruébalo en línea!
Ahora sin el 0 final.
fuente
Limpio , 53 bytes
Pruébalo en línea!
fuente
Jalea , 9 bytes
Pruébalo en línea!
fuente
Python 2,
545244 bytes-2 bytes gracias al Sr. Xcoder
Ciertamente debe haber una forma más rápida. Curiosamente, cuando probé una lambda fue el mismo bytecount. Probablemente estoy alucinando.
Pruébalo en línea!
fuente
0
ahora es opcional, es más corto deshacerse del segundoprint
Haskell ,
76 69 6156 bytesSiento que esto es demasiado tiempo. Aquí
l
produce una lista infinita de la secuencia inversa-collatz, y la función anónima en la primera línea simplemente la corta en el lugar correcto.Gracias por -5 bytes @ ØrjanJohansen!
Pruébalo en línea!
fuente
(>0)
debería ser suficiente. También hay unaodd
función.Óxido ,
6564 bytesPruébalo en línea!
fuente
05AB1E ,
1514 bytes-1 byte gracias a @MagicOctopusUrn .
Pruébalo en línea.
Explicación:
fuente
[Ð=_#Èi3*>ë<2÷
con en=
lugar deD,
.JAEL , 18 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 31 bytes
Pruébalo en línea!
O 30 bytes en orden inverso.
fuente
Pyth , 12 bytes
Pruébalo aquí como un conjunto de pruebas!
fuente
Wolfram Language (Mathematica) , 35 bytes
Pruébalo en línea!
0<Echo@# && ...&
es una evaluación de cortocircuito: imprime la entrada#
, comprueba si es positiva y, de ser así, la evalúa...
. En este caso,...
es#0[3#+1-(5#+3)/2#~Mod~2]
; dado que#0
(la ranura cero) es la función en sí, esta es una llamada recursiva3#+1-(5#+3)/2#~Mod~2
, que se simplifica a3#+1
cuándo#
es par y(#-1)/2
cuándo#
es impar.fuente
Lisp común , 79 bytes
Pruébalo en línea!
fuente
PowerShell,
5352 bytesPruébalo en línea!
Editar:
-1 byte gracias a @mazzy
fuente
for(;$i)
lugarwhile($i)
Emojicode 0.5 , 141 bytes
Pruébalo en línea!
fuente
Stax , 11 bytes
Ejecutar y depurarlo
fuente
MathGolf , 12 bytes
Pruébalo en línea!
Explicación
fuente
código de máquina x86, 39 bytes
Ensamblado (sintaxis NASM):
Pruébalo en línea!
fuente
R ,
6661 bytes-5 bytes gracias a Robert S. en la consolidación de ifelse
if
y en la eliminación de corchetes, y x! = 0 a x> 0en lugar de
Pruébalo en línea!
fuente
perl -Minteger -nlE, 39 bytes
fuente
Agregar ++ ,
383533 bytesPruébalo en línea!
Cómo funciona
Primero, comenzamos definiendo una funciónF( x ) , que toma un solo argumento, realiza la operación invertida de Collatz en X luego da salida al resultado. Es decir,
Cuando está en modo de función, Add ++ usa un modelo de memoria de pila, de lo contrario se usan variables. Al calcularF( x ) , la pila se ve inicialmente como S= [ x ] .
Luego duplicamos este valor (S= [ x , x ] . Luego damos la primera opción posible,3 x + 1 ( ⌊ x2⌋ , dejando S= [ 3 x + 1 , ⌊ x2⌋ ] .
d
), para obtener3*1+
), intercambie los dos valores superiores, luego calculeA continuación, empujamosX a S y calcular el bit de X es decir X%2 , dónde un%si denota el resto al dividirun por si . Esto nos deja conS= [ 3 x + 1 , ⌊ x2⌋ , ( x%2 ) ] . Finalmente, usamos ( x%2 ) . Si eso es0 0 , devolvemos el primer elemento, es decir 3 x + 1 de lo contrario, devolvemos el segundo elemento, ⌊ x2⌋ .
D
para seleccionar el elemento en el índice especificado porEso completa la definición deF( x ) Sin embargo, todavía no lo hemos puesto en práctica. Las siguientes tres líneas han cambiado del modo función al modo vainilla, donde operamos con variables. Para ser más precisos, en este programa, solo operamos en una variable, la variable activa , representada por la letra
x
. Sin embargo,x
puede omitirse de los comandos donde obviamente es el otro argumento.Por ejemplo,x ≠ 0 . El bucle es muy simple, que consiste en una sola instrucción: F( x ) , luego asigne eso a
+?
es idéntico ax+?
, y asigna la entrada ax
, pero comox
es la variable activa , se puede omitir. Luego, sacamosx
, luego todo el ciclo while, que se repite durante tanto tiempo como$f>x
. Todo lo que hace es correrx
, actualizandox
en cada iteración del bucle.fuente
Retina 0.8.2 , 46 bytes
Pruébalo en línea! Explicación:
Convierte a unario.
Repita hasta que el valor deje de cambiar.
Imprime el valor en decimal.
Si es par, multiplique por 6 y agregue 3.
Resta 1 y divide entre 2.
La nueva línea final se puede suprimir agregando un
;
antes de{
.fuente
Rojo , 70 bytes
Pruébalo en línea!
fuente
Raqueta , 75 bytes
Pruébalo en línea!
Equivalente a la solución Common Lisp de JRowan.
fuente
C # (.NET Core) , 62 bytes
Pruébalo en línea!
Sin golf:
fuente
Dart , 49 bytes
Pruébalo en línea!
fuente
Esquema de Gambito (gsi) , 74 bytes
Pruébalo en línea!
fuente