Se puede decir que una función (o programa) que toma entradas y proporciona salidas tiene un ciclo si la llamada a la función en su propia salida alcanza eventualmente el número original. Por ejemplo, tome la siguiente función:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Si empezamos con n=1
, f(n)=5
, f(f(n))=f(5)=4
, f(f(f(n)))=f(4)=3
, f(f(f(f(n))))=f(3)=1
.
Esto esta escrito (1 5 4 3)
. Dado que hay 4 números únicos en este bucle, este es un ciclo de longitud 4.
Su desafío es escribir un programa o función que tenga ciclos de todas las longitudes posibles. Es decir, debe haber un ciclo de longitud 1, de longitud 2, y así sucesivamente.
Además, su función / programa debe ser de enteros positivos a enteros positivos, y debe ser biyectivo , lo que significa que debe haber exactamente un valor de entrada para cada valor de salida posible, sobre todos los enteros positivos. Para decirlo de otra manera, la función / programa debe calcular una permutación de los enteros positivos.
Detalles: Se permite cualquier sistema de entrada / salida estándar, incluidos STDIN, STDOUT, argumento de función, retorno, etc. Lagunas estándar prohibidas.
No necesita preocuparse por las limitaciones de sus tipos de datos: las propiedades anteriores solo deben mantenerse bajo el supuesto de que uno int
o float
puede contener cualquier valor, por ejemplo.
No hay restricciones en el comportamiento de la función en las entradas que no son enteros positivos, y esas entradas / salidas serán ignoradas.
La puntuación es el código de golf en bytes, el código más corto gana.
fuente
Respuestas:
Pyth,
118 bytesMucho más aburrido que mi respuesta anterior.
Cada número que contiene un 0 dígitos se asigna a sí mismo. Cualquier otro número se asigna al número que tiene sus dígitos rotados en 1. Entonces, por ejemplo:
fuente
Python 2,
565554 bytesAquí están las primeras 21 salidas:
El patrón es obvio si dividimos la lista en trozos así:
fuente
Pyth, 25 bytes
Esta es la misma secuencia que @ Sp3000, pero con una forma cerrada. La forma cerrada es:
fuente
Python3, 40 bytes
Cada número que contiene un 0 dígitos se asigna a sí mismo. Cualquier otro número se asigna al número que tiene sus dígitos rotados en 1. Entonces, por ejemplo:
fuente
Rubí, 22 + 1 = 23
Con el indicador de línea de comando
-p
, ejecuteCuando se le da como entrada una representación de cadena de un número (sin nueva línea final), mantiene constante el primer dígito, luego gira el resto hacia la izquierda, por lo que
1234
convierte1342
.Esto se puede reducir a 21 caracteres con
$_=$1+$'+$2if/(.)(.)/
, pero imprime una advertencia.fuente
Rubí, 16 + 1 = 17
Con el indicador de línea de comando
-p
, ejecuteEsta es una función más complicada que mi otra respuesta, pero resulta más fácil de jugar (y tolerante a las nuevas líneas). Toma el último dígito distinto de cero de la entrada, más los ceros finales, y lo mueve al comienzo del número. Así se
9010300
convierte3009010
. Cualquier número con n dígitos distintos de cero será parte de un ciclo de n longitudes.La entrada es una cadena en cualquier base a través de STDIN, la salida es una cadena en esa base.
fuente
Python, 43
La inversa de la función de Sp3000 , implementada recursivamente.
La función es un ciclo seguido de dos ciclos seguido de tres ciclos, ...
La operación
n%k+1
actúa como unk
ciclo en los números1..k
. Para encontrar el apropiadok
para usar, cambie todo hacia abajok=1
, luegok=2
, y así sucesivamente, hastan<=k
.fuente
Pyth, 15 bytes
La respuesta más corta hasta el momento que utiliza operaciones numéricas en lugar de operaciones de cadena.
El efecto de esta función en la representación binaria es extender el bloque más a la derecha de 1s al siguiente 0; o si no hay 0, para restablecerlo de nuevo a un solo 1:
Pyth, 26 bytes, variante divertida
Realiza la operación anterior simultáneamente en todos los bloques de 1s, no solo en el más a la derecha, aún utilizando solo operaciones bit a bit y aritméticas.
fuente
Swift 1.2, 66 bytes
fuente
Brachylog , 5 bytes
Pruébalo en línea!
Puerto de la respuesta Pyth de @ orlp. Sale simple y ordenado:
Originalmente quería portar la solución Python de @ Sp3000, pero eso tomó la friolera de 23 bytes :
Pruébalo en línea!
fuente
JavaScript (ES6), 43 bytes
fuente
Matlab (189)
La función:
Asigna cualquier número entero de acuerdo con sus factores primos, si el número es nulo o factorizado en 2 o 1, el número se asigna a sí mismo, de lo contrario, elegimos el factor primo más grande de este número, luego incrementamos los factores primos restantes restantes por el más cercano factor primo más grande hasta que alcancemos el número
biggest_prime^n
donden
está la suma de todos los exponentes de todos los factores, una vez que alcanzamos esa cantidad, recurrimosmax_prime*2^(n-1)
y reproducimos el mismo ciclo nuevamente.fuente
Matlab (137)
2
hasta que nos topemos con un exponente2
que sea divisible por la suma de exponentes de otros factores primos. luego nos movemos al comienzo del ciclo dividiendo por2^(sum of exponents of other primes)
. los otros entumecidos se asignan a sí mismos.fuente