Pode-se dizer que uma função (ou programa) que recebe entradas e fornece saídas possui um ciclo se a chamada da função em sua própria saída atingir repetidamente o número original. Por exemplo, tome a seguinte função:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Se começarmos com 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
.
Isto está escrito (1 5 4 3)
. Como existem 4 números exclusivos nesse loop, esse é um ciclo de comprimento 4.
Seu desafio é escrever um programa ou função que possua ciclos de todos os comprimentos possíveis. Ou seja, deve haver um ciclo de comprimento 1, comprimento 2 e assim por diante.
Além disso, sua função / programa deve ser do número inteiro positivo para o número inteiro positivo e deve ser bijetivo , o que significa que deve haver exatamente um valor de entrada para cada valor de saída possível, sobre todos os números inteiros positivos. Dito de outra forma, a função / programa deve calcular uma permutação dos números inteiros positivos.
Detalhes: Qualquer sistema padrão de entrada / saída é permitido, incluindo STDIN, STDOUT, argumento de função, retorno, etc.
Você não precisa se preocupar com as limitações de seus tipos de dados - as propriedades acima precisam se manter apenas com a suposição de que um int
ou float
pode conter qualquer valor, por exemplo.
Não há restrições no comportamento da função em entradas que não sejam números inteiros positivos, e essas entradas / saídas serão ignoradas.
A pontuação é código de golfe em bytes, o código mais curto vence.