Uma função é dito que tem um ciclo de comprimento n se existe um x no seu domínio de tal modo que f n (x) = x e f m (x) ≠ x para 0 <m <n , onde o expoente n denota n - dobre a aplicação de f . Observe que um ciclo de comprimento 1 é um ponto fixo f (x) = x .
Sua tarefa é implementar uma função bijetiva dos números inteiros para si mesmos, que possui exatamente um ciclo de cada comprimento positivo n . Uma função bijetiva é uma correspondência individual, ou seja, todo número inteiro mapeado para exatamente uma vez. Tendo exactamente um ciclo de comprimento n significa que não são exactamente n números distintos x para o qual f n (x) = x e f m (x) x ≠ para 0 <m <n .
Aqui está um exemplo de como essa função pode parecer em torno de x = 0 :
x ... -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
f(x) ... 2 4 6 -3 -1 1 -4 0 -2 5 7 -7 -6 3 -5 ...
Este trecho contém ciclos de 1 a 5 :
n cycle
1 0
2 -2 1
3 -4 -3 -1
4 -5 6 3 7
5 -7 2 5 -6 4
...
Observe que, acima, estou usando "função" apenas no sentido matemático. Você pode escrever uma função ou um programa completo no idioma de sua escolha, desde que use um único número inteiro (assinado) como entrada e retorne um único número inteiro (assinado). Como de costume, você pode receber entradas via STDIN, argumento de linha de comando, argumento de função etc. e saída via STDOUT, valor de retorno da função ou argumento da função (saída) etc.
Obviamente, muitos idiomas não suportam (facilmente) números inteiros de precisão arbitrária. Tudo bem se a sua implementação funcionar apenas no intervalo do tipo inteiro nativo do seu idioma, desde que abranja pelo menos o intervalo [-127, 127] e funcione para números inteiros arbitrários se o tipo inteiro do idioma for substituído por arbitrário- números inteiros de precisão.
Aplicam-se as regras de código-golfe padrão .
fonte
Respostas:
Pitão,
2718 bytesExplicação (Pyth inicializa
Q
no número inteiro de entrada):Isso tem ciclos
(−1)
(0, −2)
(1, −3, −4)
(2, −5, −7, −6)
(3, −9, −13, −11, −8)
(4, - 17, −25, −21, −15, −10)
(5, −33, −49, −41, −29, −19, −12)
(6, −65, 97, −81, −57, −37, −23, −14)
(7, −129, −193, −161, −113, −73, −45, −27, −16)
(8, −257, −385, −321, −225 , −145, −89, −53, −31, −18)
(9, −513, −769, −641, −449, −289, −177, −105, −61, −35, −20)
⋮
O ciclo de comprimento n é dado por
( n - 2,
−2 ^ ( n - 2) ⋅1 - 1,
−2 ^ ( n - 3) ⋅3 - 1,
−2 ^ ( n - 4) ⋅5 - 1,
…,
−2 ^ 2 ⋅ (2 · n - 7) - 1,
−2 ^ 1⋅ (2 · n - 5) - 1,
−2 ^ 0⋅ (2 · n - 3) - 1).
Cada número inteiro k ≥ −1 aparece como o primeiro elemento do ciclo ( k + 2). Para cada número inteiro k <−1, podemos escrever exclusivamente 1 - k = 2 ^ i ⋅ (2⋅ j + 1) para alguns i , j ≥ 0; então k aparece como o ( j + 2) º elemento do ( i + j + 2) -Ciclo.
fonte
MATL , 47 bytes
Experimente online!
Explicação geral
A função 2 abaixo é a mesma usada na resposta do @ Sp3000 para o desafio relacionado. Obrigado a Agawa001 por perceber.
A função é a composição de três:
As funções 1 e 3 são usadas porque é mais fácil (penso) para obter o comportamento desejado em N do que em Z .
A função 2 é a seguinte: linha superior é domínio, linha inferior é codomain. Vírgulas são usadas para maior clareza:
O primeiro bloco (de cima
1
para baixo1
) é um ciclo de comprimento 1. O segundo (de2 3
para3 2
) é um ciclo de comprimento 2, etc. Em cada bloco, a parte inferior (imagem da função) é a parte superior deslocada circularmente um passo para a direita.A função 1 é a seguinte:
A função 3 é igual a 1 com as duas linhas trocadas.
Exemplos
A imagem de
3
é-5
. Primeiro3
é mapeado para7
pela função 1; então7
é mapeado para10
pela função 2; então10
é mapeado para -5` pela função 3.O ciclo comprimento-1 é
0
. O ciclo comprimento-2 é-1 1
. O ciclo comprimento-3 é-3 2 -2
etc.Código explicado
As funções 1 e 3 são simples.
A função 2 funciona encontrando o ponto final inferior do bloco de entrada correspondente. Por exemplo, se a entrada para esta função for
9
encontrada7
(consulte os blocos acima). Ele escolhe o ponto final superior, que está10
no exemplo. O deslocamento circular do bloco é alcançado graças à indexação modular baseada em 1 do MATL.fonte
Python 2, 55 bytes
59 bytes:
Cria os ciclos
Modificado da minha solução no desafio anterior , modificado da construção do Sp3000 .
A função
faz ciclos de tamanho ímpar de números não negativos
Para encontrar o tamanho correto do ciclo
k
,n
reduza a entradak=1,3,5,7,...
até que o resultado esteja no intervalo[0,k)
. Cicle esse intervalo com a operaçãon->(n+1)%k
e desfaça todas as subtrações feitas na entrada. Isso é implementado recursivamente pork+g(n-k,k+2)
.Agora, precisamos do negativo para fazer os ciclos pares. Nota que, se modificar
g
para começark=2
emg
, teríamos ciclos mesmo tamanhoEstes biject para negativos via bit-complemento
~
. Então, quandon
é negativo, simplesmente avaliamosg(n)
como~g(~n,2)
.fonte
k
parece serMath.floor(Math.sqrt(n))*2+1
.Python 3, 110 bytes
Eu ainda não descobri como conseguir um lambda lá
se n for um número de triângulo [1,3,6,10,15,21,28, etc ...], então f (n) é a ordem na lista multiplicada pela negativa. se o número for negativo, dê 1 + o próximo número menor do triângulo. caso contrário, incremente.
Exemplo: 5 não é um número triângulo, então adicione 1.
Na próxima iteração, temos 6. 6 é um número de triângulo e é o terceiro da lista; daí sai -3.
O programa fornece essas listas
comprimento 1: [0]
comprimento 2: [1, -1]
comprimento 3: [2,3, -2]
comprimento 4: [4,5,6, -3]
comprimento 5: [7,8,9,10, -4]
Edit: Obrigado novamente a @TuukkaX por remover o excesso de caracteres.
fonte
0.5
para.5
einput('')
parainput()
.Python 3, 146 bytes
Para cada número maior que 0, existem loops pares (len 2,4,6,8 ...) e menos de 0, loops ímpares (1,3,5,7). 0 mapeia para 0.
(-3, -2, -1), (0), (1,2), (3,4,5,6)
mapeia para
(-2, -1, -3), (0), (2,1), (6,3,4,5)
Edit: @TuukkaX retirou 8 bytes da solução anterior. E outro 3.
fonte
mi
pode ser alterado para algo menor, comob
.f=lambda x:1+2*int(abs(x)**0.5)if x<1 else 2*int(x**0.5+0.5) x=int(input()) n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
input('')
parainput()
. As aspas são inúteis, pois não precisamos imprimir nada no console quando queremos apenas obter a entrada.f=lambda x:1+2*int(abs(x)**.5)if x<1 else 2*int(x**.5+.5) x=int(input());n=f(x) if x>0:b=n*(n-2)/4 else:b=-((n+1)/2)**2 print(b+1+(x-b-2)%n)
Matlab (423)
Não-concorrente porque quebra um bom recorde de liderança no último ranking, enquanto estou lutando para reduzi-lo o máximo possível.
Alguns erros absurdos relativos à precisão no matlab que eu não conseguia encontrar outra saída a não ser tornar meu código sarcatisticamente grande, por outro lado, o mapeamento que escolhi foi em termos de principais fatores e logaritmo n-ário.
Execução
Explicação
Sabendo, em primeiro lugar, que qualquer número pode ser escrito como produto de expoentes de números primos a
N=e1^x1*e2^x2...
partir dessa base, escolhi mapear imagens de ciclosC
extraídos do maior expoente do menor fator (não necessariamente o número primo) de que N é uma potência perfeita de .em palavras mais simples,
N=P^x
onde P é a menor raiz perfeita,x
denota precisamente dois termos essenciais para o ciclo:,x=Ʃ(r*P^i)
um termoP
é a base do ciclo e também uma raiz perfeita para o número principal N ek
é o grau do cicloC=p^k
, em quei
varia entre 1 e k, o coeficienter
é incrementado em 1 e delimitado por P-1 para qualquer pré-imagem a seguir, até que todos os coeficientes sejam configurados para r = 1, então passamos para o início desse ciclo.Para evitar colisões entre ciclos, a escolha da exponenciação dos números primos, em vez de seus produtos, é precisa, porque como um exemplo de dois ciclos de bases
3
e2
um ponto de encontro entre eles, pode ser3*2
evitado, pois um ciclo é definido por seu grau mais do que o seu base e para o ponto de encontro há outro ciclo de base6
e grau 1.Os números negativos colocam uma exceção; por isso, reservei graus ímpares para números negativos e graus pares para o resto. Como assim ?
para qualquer número N incorporado dentro de um ciclo
P^k
, é escrito comoP^(a0*P^i0+a1*P^i1+...)
, a quantidade(a0*P^i0+a1*P^i1+...)
é transaltada na base P-ária comoa0,a1,....
, para esclarecer esse ponto se (p = 2) a sequência deve estar na base binária. Como é sabido de forma inquestionável, sem definir a condição de graus positivos / negativos e a exceção (+/- 1), um número N está nas bordas de um ciclo de grauk
se, e somente se, a seqüênciaA
for escrita como1111..{k+1}..10
ou111..{k}..1
para todas as bases, caso contrário nenhuma rotação é necessária, assim, atribuir uma condição negativa / positiva para os respectivos graus pares / ímparesk/k'
para ambos cria uma sequência ímpar escrita no formulário101..{k}..100
, uma sequência par é escrita no formulário101..{k'}..10
para uma aresta inicial de um ciclo numérico respectivamente negativo / positivo .Exemplo:
Tomando um número
N=2^10
,x=10=2^1+2^3
a sequência A é escritaA=1010
, esse tipo de sequência sintetiza uma aresta finita do ciclo numérico positivo, ou sejaC=2^3
, a próxima imagem é a aresta inicialA=011
que é8
, Mas , ao padronizar esse resultado para (+ / -) 1 exceção é2^10/2
mapeada8/2
e a imagem anterior não deve ser girada.Tomando um número
N=-3^9
,x=9=3^2
a sequência A é escritaA=100
, esse tipo de sequência sintetiza uma aresta finita do ciclo numérico negativo, ou sejaC=3^1
, a próxima imagem é a aresta inicialA=01
que é3
, mas, adaptando esse resultado a negativo / positivo a condição-3^9
mapeia para-3
.para o casal
(-/+)1
, pretendia intrometê-lo em um número de bases de ciclo2
, sob o pretexto de que uma sequência comum de grupos cíclicos{2,4}{8,16,32,64}..
é composta de outra forma{1,2}{4,8,16,32}..
, isso evita a perda de elementos anteriores, e a opação feita está apenas mudando com estalos um novo elemento no.Resultados:
executando esta pequena planilha de códigos para verificar os primeiros intervalos razoáveis de números cíclicos:
Isso leva a esses resultados
O último é o erro de segmentação, mas se encaixa no intervalo de número inteiro assinado padrão [-127.127].
fonte
JavaScript (ES6), 73 bytes
Funciona enumerando a sequência (0, -1, 1, -2, 2, -3, 3, ...) até encontrar
n
, contando os ciclos à medida que avança.i
contém a entrada atual;j
contém o início do ciclo atual,k
o índice dentro do ciclo,l
a duração do ciclo atual em
a próxima entrada na sequência. Assim que descobrimosn
, tomamosj
se estamos no final de um ciclo oum
se não.fonte