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.
fonte
Respostas:
Pitão,
118 bytesMuito mais chato do que minha resposta anterior.
Todo número que contém um dígito 0 é mapeado para si mesmo. Qualquer outro número é mapeado para o número que tem seus dígitos rotacionados por 1. Portanto, por exemplo:
fonte
Python 2,
565554 bytesAqui estão as primeiras 21 saídas:
O padrão é óbvio se dividirmos a lista em pedaços da seguinte forma:
fonte
Pitão, 25 bytes
Essa é a mesma sequência que o @ Sp3000, mas com um formulário fechado. O formulário fechado é:
fonte
Python3, 40 bytes
Todo número que contém um dígito 0 é mapeado para si mesmo. Qualquer outro número é mapeado para o número que tem seus dígitos rotacionados por 1. Portanto, por exemplo:
fonte
Ruby, 22 + 1 = 23
Com sinalizador de linha de comando
-p
, executeQuando fornecida como entrada, uma representação de seqüência de caracteres de um número (sem nova linha à direita), ele mantém o primeiro dígito constante e depois gira o restante para a esquerda,
1234
tornando - se assim1342
.Isso pode ser reduzido para 21 caracteres com
$_=$1+$'+$2if/(.)(.)/
, mas imprime um aviso.fonte
Ruby, 16 + 1 = 17
Com sinalizador de linha de comando
-p
, executeEssa é uma função mais complicada do que minha outra resposta, mas passa a ser mais jogável (e tolerante a seguir novas linhas). Ele pega o último dígito diferente de zero da entrada, mais os zeros à direita, e o move para o início do número. Então
9010300
se torna3009010
. Qualquer número com n dígitos diferentes de zero fará parte de um ciclo de comprimento n.Input é uma string em qualquer base via STDIN, output é uma string nessa base.
fonte
Python, 43
O inverso da função do Sp3000 , implementado recursivamente.
A função é um ciclo seguido por dois ciclos seguidos por três ciclos, ...
A operação
n%k+1
atua como umk
ciclo nos números1..k
. Para encontrar o apropriadok
para usar, mude tudo para baixok=1
, entãok=2
, e assim por diante, atén<=k
.fonte
Pitão, 15 bytes
A resposta mais curta até agora que usa operações numéricas em vez de operações de cadeia.
O efeito dessa função na representação binária é estender o bloco mais à direita de 1s para o próximo 0; ou, se não houver 0, redefina-o para um único 1:
Pitão, 26 bytes, variante divertida
Executa a operação acima simultaneamente para todos os blocos de 1s, não apenas o mais à direita - ainda usando apenas operações bit a bit e aritmética.
fonte
Swift 1.2, 66 bytes
fonte
Braquilog , 5 bytes
Experimente online!
Porto da resposta Pyth do @ orlp. Sai simples e arrumado:
Originalmente, eu queria portar a solução Python do Sp3000, mas isso levou 23 bytes :
Experimente online!
fonte
JavaScript (ES6), 43 bytes
fonte
Matlab (189)
A função:
Mapeia qualquer número inteiro de acordo com seus fatores primos; se o número for nulo ou fatorado em 2 ou 1, o número é mapeado para si mesmo; caso contrário, escolhemos o maior fator primo desse número e aumentamos os fatores primos restantes restantes pelo mais próximo fator primordial maior até atingirmos o número
biggest_prime^n
onden
está a soma de todos os expoentes de todos os fatores, uma vez que atingimos esse valor, recorremos amax_prime*2^(n-1)
e reproduzimos o mesmo ciclo novamente.fonte
Matlab (137)
2
até encontrarmos um expoente2
divisível pela soma dos expoentes de outros fatores primos. então passamos para o início do ciclo, dividindo por2^(sum of exponents of other primes)
. os outros numbes são mapeados para si mesmos.fonte