Faire une chaîne infinie

16

Permet de définir une classe de fonctions. Ces fonctions seront mappées des entiers positifs aux entiers positifs et doivent satisfaire aux exigences suivantes:

  • La fonction doit être bijective, ce qui signifie que chaque valeur correspond à et est mappée à exactement une valeur.

  • Vous devez pouvoir passer de n'importe quel entier positif à tout autre entier positif par des applications répétées de la fonction ou de son inverse.

Maintenant, écrivez du code qui exécutera n'importe quelle fonction de cette classe sur son entrée.

Il s'agit d'une question de donc les réponses seront notées en octets, avec moins d'octets étant mieux.

Post Rock Garf Hunter
la source
1
Pouvez-vous donner un exemple?
Jack
1
@Jack Bien sûr, considérez la fonction qui mappe 1 -> 2, mappe tous les autres nombres impairs à ce nombre moins 2, et chaque nombre pair à ce nombre plus 2.
Post Rock Garf Hunter
1
Pas sûr que je comprenne. Est-ce que f (x): = x + 1 serait une fonction de cette classe? Dans ce cas, 1+le lisp commun devrait faire l'affaire ici.
MONODA43
2
@ MONODA43 Cette fonction est une bijection lorsque l'on considère tous les entiers. Mais cette question demande une bijection sur les entiers positifs. Votre suggestion échouerait à la sortie 1 car il n'y a pas de x positif pour lequel x + 1 = 1.
kasperd
1
@Cowsquack Vous devez pouvoir passer de n'importe quel entier positif à tout autre entier positif par des applications répétées de la fonction ou de son inverse. Vous ne pouvez pas passer de 1 à 2 en appliquant l'identité, peu importe le nombre de répétitions.
kasperd

Réponses:

10

Python 3 , 24 octets

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

Essayez-le en ligne!

Dennis
la source
Ha, tu m'as ninja parce que j'ai pris 20 secondes supplémentaires pour écrire ma séquence avant de poster ...
ETHproductions
6

Python, 22 octets

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

Les nombres pairs descendent jusqu'au numéro pair précédent, les nombres impairs remontent au numéro impair suivant et le mappage 2 -> 1 relie ces deux.

orlp
la source
attendez ... donc 6 peut résulter de 5 ou 8? c'est invalide?
Lemon destructible
@DestructibleLemon Non, juste une impaire remplacée même dans mon explication.
orlp
5

JavaScript (ES6), 20 octets

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

Cartes ... -> 5 -> 3 -> 1 -> 2 -> 4 -> ..., qui je pense est valide. Corrige moi si je me trompe...

ETHproductions
la source
9
Les esprits semblables pensent bien. J'utilise l'inverse.
Dennis
@ Dennis Heh, et je viens de réaliser que l'inverse est plus court d'un octet:n=>n%2?n+2:n-2||1:2
ETHproductions
@Dennis Vous avez été confirmé comme étant Yoda: o ( message de discussion de StepHen )
HyperNeutrino
@HyperNeutrino Très bien, les esprits pensent de la même façon
Pavel
5

Haskell, 20 octets

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

L'exemple de fonction du commentaire de l'OP dans Haskell. Essayez-le en ligne!

nimi
la source
4

Gelée , 6 octets

-*Ḥạo1

Essayez-le en ligne!

Comment ça fonctionne

-*Ḥạ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
la source
13
Laissons-nous vraiment Dennis s'en tirer avec «unhalve»? Haha.
orlp
2

Python 3, 43 octets

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

Essayez-le en ligne!

Et l'inverse, également 43 octets:

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

Essayez-le en ligne!

Les liens TIO utilisent le code de bas de page de test de Dennis.

Puisque tout le monde utilise une façon de faire, j'ai décidé que je serais différent, alors j'ai créé ma propre fonction (bien que je ne sois probablement pas la première à la découvrir). Cette fonction fonctionne comme ... 10 -> 7 -> 6 -> 3 -> 2 -> 1 -> 4 -> 5 -> 8 -> 9 -> ..., je peux vous montrer le dessin à la main que j'ai fait pour tester cela si vous le souhaitez.

Mon algorithme de golf peut être probablement golfable - des conseils seraient appréciés.

Versions non golfées: essayez-le en ligne!

Stephen
la source
0

Mathematica, 21 octets

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

Avancez, rien à voir ici ...

LegionMammal978
la source