Faça uma cadeia infinita

16

Vamos definir uma classe de funções. Essas funções serão mapeadas dos inteiros positivos para os inteiros positivos e devem atender aos seguintes requisitos:

  • A função deve ser bijetiva, o que significa que todo valor é mapeado para e é mapeado para exatamente um valor.

  • Você deve ser capaz de passar de qualquer número inteiro positivo para qualquer outro número positivo por aplicações repetidas da função ou seu inverso.

Agora, escreva algum código que execute qualquer função nesta classe em sua entrada.

Esta é uma questão de para que as respostas sejam pontuadas em bytes, com menos bytes sendo melhores.

Post Rock Garf Hunter
fonte
1
Você pode dar um exemplo?
23417 Jack
1
@Jack Claro, Considere a função que mapeia 1 -> 2, mapeia qualquer outro número ímpar a esse número menos 2, e cada número par àquele número mais 2.
post rock Garf Hunter
1
Não tenho certeza se entendi. F (x): = x + 1 seria uma função dessa classe? Nesse caso, 1+o lisp comum deve fazer o truque aqui.
MONODA43
2
@ MONODA43 Essa função é uma bijeção quando se considera todos os números inteiros. Mas esta pergunta pede uma bijeção nos números inteiros positivos. Sua sugestão falharia em gerar 1 porque não há x positivo para o qual x + 1 = 1.
kasperd
1
@Cowsquack Você deve conseguir passar de um número inteiro positivo para outro número inteiro positivo por aplicações repetidas da função ou seu inverso. Você não pode passar de 1 a 2 aplicando a identidade, não importa quantas vezes você repita.
kasperd

Respostas:

10

Python 3 , 24 bytes

lambda n:n-(-1)**n*2or 1

Experimente online!

Dennis
fonte
Ha, você me ninja'd porque eu levei 20 segundos extras para escrever minha sequência antes de postar ...
ETHproductions
6

Python, 22 bytes

lambda n:n+n%2*4-2or 1

Os números pares vão para o número par anterior, os números ímpares vão para o próximo número ímpar e o mapeamento 2 -> 1 conecta esses dois.

orlp
fonte
espera ... então 6 pode resultar de 5 ou 8? isso é inválido?
Destructible Lemon
@DestructibleLemon Não, apenas um ímpar substituído com par na minha explicação.
orlp 24/07
5

JavaScript (ES6), 20 bytes

n=>n>1?n%2?n-2:n+2:2

Mapas ... -> 5 -> 3 -> 1 -> 2 -> 4 -> ..., o que acho válido. Corrija-me se eu estiver errado...

ETHproductions
fonte
9
Mentes iguais pensam bem. Eu estou usando o inverso.
Dennis
@Dennis Heh, e acabei de perceber que o inverso é 1 byte menor:n=>n%2?n+2:n-2||1:2
ETHproductions
@Dennis Você foi confirmado como Yoda: o ( publicação de bate-papo de StepHen )
HyperNeutrino
@HyperNeutrino muito, mentes tanto pensar
Pavel
5

Haskell, 20 bytes

f 1=2
f x=x+2*(-1)^x

A função de exemplo do comentário do OP em Haskell. Experimente online!

nimi
fonte
4

Gelatina , 6 bytes

-*Ḥạo1

Experimente online!

Como funciona

-*Ḥạo1  Main link. Argument: n

-*      Compute (-1)**n, yielding 1 for even n and -1 for odd n.
  Ḥ     Unhalve; multipliy the result by 2.
   ạ    Compute the absolute difference of the result and n.
    o1  If the difference is 0, yield 1.
Dennis
fonte
13
Estamos realmente deixando Dennis se safar com 'unhalve'? Haha
23417 orlp
2

Python 3, 43 bytes

lambda n,a=(1,3,-3,-1):n+a[n%4]if n-2else 1

Experimente online!

E o inverso, também 43 bytes:

lambda n,a=(-3,-1,1,3):n+a[n%4]if n-1else 2

Experimente online!

Os links TIO usam o código do rodapé de teste de Dennis.

Como todo mundo está usando uma maneira de fazer, eu decidi que seria diferente, então criei por conta própria (embora provavelmente não seja a primeira pessoa a descobri-la) a função. Isso funciona como mapas ... 10 -> 7 -> 6 -> 3 -> 2 -> 1 -> 4 -> 5 -> 8 -> 9 -> ..., eu posso mostrar o desenho que fiz para testar isso, se você quiser.

Meu algoritmo de golfe pode ser provavelmente jogável - dicas serão apreciadas.

Versões ungolfed: Experimente online!

Stephen
fonte
0

Mathematica, 21 bytes

a@1=2;a@b_:=b+2(-1)^b

Siga em frente, nada para ver aqui ...

LegionMammal978
fonte