Introduction (peut être ignoré)
Mettre tous les nombres positifs dans son ordre normal (1, 2, 3, ...) est un peu ennuyeux, n'est-ce pas? Voici donc une série de défis autour des permutations (remaniements) de tous les nombres positifs. Il s'agit du deuxième défi de cette série. Le premier défi se trouve ici .
Dans ce défi, nous utilisons des codes Gray pour réarranger les nombres naturels. Un code Gray ou "code binaire réfléchi" est un codage binaire de telle manière que deux valeurs successives diffèrent en un seul bit. Une application pratique de cet encodage est de l'utiliser dans des encodeurs rotatifs , d'où ma référence à "Turn My Way" .
Notez que ce codage laisse un certain degré de liberté. Par exemple, après le binaire 1100, il y a quatre codes suivants possibles: 1101, 1110, 1000 et 0100. C'est pourquoi je définirai comme la plus petite valeur non utilisée précédemment qui ne diffère qu'un seul caractère dans le codage binaire. Cette séquence correspond à A163252 .
Puisqu'il s'agit d'un défi de "séquence pure", la tâche consiste à sortir pour un donné en entrée, où a (n) est A163252 .
Tâche
Étant donné une entrée entière , la sortie au format entier ( pas au format binaire).
est défini comme l'entier le moins positif ne se produisant pas plus tôt dans la séquence, de telle sorte que et diffèrent d'un seul bit lorsqu'ils sont écrits en binaire.
Remarque: l'indexation basée sur 1 est supposée ici; vous pouvez utiliser une indexation basée sur 0, donc , etc. Veuillez le mentionner dans votre réponse si vous choisissez de l'utiliser.
Cas de test
Input | Output
--------------
1 | 1
5 | 4
20 | 18
50 | 48
123 | 121
1234 | 1333
3000 | 3030
9999 | 9997
Règles
- L'entrée et la sortie sont des entiers (votre programme doit au moins prendre en charge l'entrée et la sortie dans la plage de 1 à 32 767)
- Une entrée non valide (0, flottants, chaînes, valeurs négatives, etc.) peut entraîner une sortie imprévue, des erreurs ou un comportement (non) défini. Dans A163252 , est défini comme 0. Pour ce défi, nous l'ignorerons.
- Les règles d'E / S par défaut s'appliquent.
- Les failles par défaut sont interdites.
- Il s'agit de code-golf , donc les réponses les plus courtes en octets l'emportent
Note finale
Voir les questions PP&CG connexes (mais pas égales) suivantes:
JavaScript (ES6), 65 octets
1 indexé.
Essayez-le en ligne!
Commenté
la source
Gelée ,
2620 octetsEssayez-le en ligne!
Un programme complet qui prend n comme seul argument. Fonctionne pour tous les cas de test. Notez également que, bien que non obligatoire, il gère n = 0.
Explication
Lien d'aide: trouvez le prochain terme et ajoutez-le
Lien principal
la source
Java (JDK) ,
142138124 12412313213098 octetsEssayez-le en ligne!
la source
import java.util.*;
+Set s=new HashSet();
tovar s=new java.util.HashSet();
. De plus, le reste peut être à golfed:Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;
. Belle réponse néanmoins, donc +1 de ma part. :)Stack
plutôt queHashSet
. Beaucoup plus lent mais ça marche!Python 2 , 81 octets
Indexation basée sur 1
Essayez-le en ligne!
Python 2 , 79 octets
Cela prend beaucoup de temps (9999 n'était pas terminé après une exécution locale pendant 7 minutes)
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 74 octets
Essayez-le en ligne!
la source
APL (Dyalog Extended) , 46 octets
Essayez-le en ligne!
la source
Fusain , 65 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Initialisez le résultat à 0.
n
Temps de boucle .Enregistrez le résultat précédent afin de ne plus l'utiliser.
Trouvez le bit le plus élevé dans le résultat précédent.
Bien que ce bit soit supérieur à 1, si le bit est défini dans le résultat précédent, essayez de soustraire ce bit pour voir si le résultat est un résultat invisible. Cela garantit que les résultats potentiels sont essayés par ordre croissant de valeur.
Essayez maintenant de XORing ce bit avec le résultat précédent, en doublant le bit jusqu'à ce qu'un résultat invisible soit trouvé. Cela gère les cas où un bit doit être défini, à nouveau dans l'ordre croissant de valeur, mais aussi le cas où le bit le moins significatif doit être basculé, ce que la boucle précédente ne prend pas la peine de tester (car il est golfeur de tester pour c'est ici). Si la boucle précédente a trouvé un résultat invisible, cette boucle ne s'exécute jamais; si ce n'est pas le cas, cette boucle testera inutilement ces résultats.
Mettez à jour le résultat en réellement XOR le bit avec.
Afficher le résultat final à la fin de la boucle.
la source
05AB1E ,
212018 octetsAssez inefficace, donc plus l'entrée est grande, plus il faut de temps pour obtenir le résultat. Cela fonctionne également pour les entrées
0
.Explication:
la source
Haskell , 101 octets
Essayez-le en ligne!
Il semble dommage de subir une importation juste pour
xor
, mais je n'ai pas encore trouvé de bonne solution. Je me demande également s'il y a une meilleure façon d'exprimer la boucle.la source
R , 90 octets
Essayez-le en ligne!
la source