introduction
Un code Gray est une alternative à la représentation binaire dans laquelle un nombre est incrémenté en ne basculant qu'un bit, plutôt qu'une quantité variable de bits. Voici quelques codes gris ainsi que leurs équivalents décimaux et binaires:
decimal | binary | gray
-------------------------
0 | 0 | 0
-------------------------
1 | 1 | 1
-------------------------
2 | 10 | 11
-------------------------
3 | 11 | 10
-------------------------
4 | 100 | 110
-------------------------
5 | 101 | 111
-------------------------
6 | 110 | 101
-------------------------
7 | 111 | 100
-------------------------
8 | 1000 | 1100
-------------------------
9 | 1001 | 1101
-------------------------
10 | 1010 | 1111
-------------------------
11 | 1011 | 1110
-------------------------
12 | 1100 | 1010
-------------------------
13 | 1101 | 1011
-------------------------
14 | 1110 | 1001
-------------------------
15 | 1111 | 1000
Motif de bits cyclique d'un code gris
Parfois appelée "binaire réfléchi", la propriété de ne changer qu'un bit à la fois est facilement obtenue avec des modèles de bits cycliques pour chaque colonne à partir du bit le moins significatif:
bit 0: 0110011001100110011001100110011001100110011001100110011001100110
bit 1: 0011110000111100001111000011110000111100001111000011110000111100
bit 2: 0000111111110000000011111111000000001111111100000000111111110000
bit 3: 0000000011111111111111110000000000000000111111111111111100000000
bit 4: 0000000000000000111111111111111111111111111111110000000000000000
bit 5: 0000000000000000000000000000000011111111111111111111111111111111
...etc.
Objectif
Avec une chaîne d'entrée non complétée d'un code gris, incrémentez ce dernier en alternant un seul caractère de la séquence ou en ajoutant un préfixe 1
(lors de l'incrémentation à la puissance suivante de 2), puis exportez le résultat sous forme de code gris non complété.
Mises en garde
- Ne vous inquiétez pas de prendre
0
ou d'une chaîne vide en entrée. - L'entrée la plus basse sera
1
, et il n'y a pas de limite supérieure à la longueur de chaîne autre que les limites de mémoire imposées par l'environnement. - Par chaîne non complétée, j'entends qu'il n'y aura pas d'espaces de début ou de fin (autres qu'un retour à la ligne facultatif), ni de
0
s de début dans l'entrée ou la sortie.
Formats d'E / S
Les formats suivants sont acceptés sous forme d’entrée et de sortie, mais les chaînes sont encouragées par rapport à d’autres formats:
- le plus significatif "bit" premier
- tableau de caractères non complété ou chaîne de caractères ASCII
'1'
et'0'
s - tableau entier non-complété de
1
s et0
s - tableau booléen non rembourré
Ce qui n'est pas permis:
- le "bit" le moins significatif en premier
- entier décimal, binaire ou unaire
- structure de données de longueur fixe
- tableau de caractères ou chaîne d'index ASCII non imprimables
1
et0
Des tests
input -> output
1 -> 11
11 -> 10
111 -> 101
1011 -> 1001
1111 -> 1110
10111 -> 10110
101100 -> 100100
100000 -> 1100000
Plus de tests peuvent être ajoutés sur demande.
Critères
C'est du code-golf , donc le programme le plus court en octets gagne! Tous les liens seront brisés en favorisant les soumissions antérieures; les failles standard s'appliquent. La meilleure réponse soumise sera acceptée le 9 octobre 2016 et mise à jour chaque fois que de meilleures réponses seront données.
la source
0011
pour 8Réponses:
Gelée ,
10 à8 octetsMerci à Dennis d'avoir économisé 2 octets.
L'entrée et la sortie sont des listes de 0 et de 1.
Essayez-le en ligne!
Explication
L'inverse du code Gray est donné par A006068 . En utilisant cela, il n'est pas nécessaire de générer un grand nombre de codes gris pour rechercher l'entrée. Une classification de cette séquence donnée sur OEIS est la suivante:
Où
[]
sont les supports de sol. Prenons l'exemple de44
la représentation binaire101100
. Diviser par 2 et les revêtements de sol n’est qu’un virage à droite, coupant le bit le moins significatif. Donc, nous essayons de XOR les nombres suivantsNotez que la
n
colonne th contient la premièren
bits. Par conséquent, cette formule peut être calculée trivialement sur l'entrée binaire en tant que réduction cumulative de XOR sur la liste (qui applique fondamentalement XOR à chaque préfixe de la liste et nous fournit une liste des résultats).Cela nous donne un moyen simple d’inverser le code Gray. Ensuite, nous incrémentons simplement le résultat et le convertissons en code Gray. Pour la dernière étape, nous utilisons la définition suivante:
Heureusement, Jelly semble balancer automatiquement les entrées lorsque vous essayez de les exécuter. Quoi qu'il en soit, voici le code:
la source
Ḟ$
; opérateurs au niveau des bits convertis en int .JavaScript (ES6), 58 octets
Bascule directement le bit approprié. Explication: Comme indiqué dans la réponse de MartinEnder ♦, chaque bit d'un code Gray décodé correspond au XOR cumulé, ou parité, de lui-même et aux bits situés à sa gauche. Nous devons ensuite incrémenter le nombre qui provoque une ondulation de report qui fait basculer tous les 1 bits les plus à droite sur 0, puis les 0 bits suivants sur 1. Le recodage donne un code avec uniquement le 0 position de bit basculé sélectionné. Si la parité de tous les bits 1 est paire, le bit le plus à droite est 0 et nous basculons donc simplement le dernier bit. Si la parité de tous les 1 bits est impair, alors les bits les plus à droite sont 1 et nous devons trouver le dernier bit. C'est maintenant le dernier des bits transportés, le bit que nous devons basculer est le bit suivant de la droite.
la source
?
à/.?(?=10*$)/
vraiment nécessaire? Oh peu importe. Oui, ça l'est. :-)Perl,
27 à25 octetsComprend +1 pour
-p
Donnez une chaîne d'entrée sur STDIN, par exemple
gray.pl
:Perl n'a pas d'entiers bon marché de précision infinie. Vous devez donc basculer directement sur le bit de droite, celui qui se trouve juste avant l'emplacement du dernier chiffre impair 1.
la source
\G
rend vraiment les choses faciles pour vous!\K
rend les choses encore plus faciles pour vous.\G
mise en œuvre aussi.Haskell,
118 115108 octetsEssayez-le sur Ideone.
Approche naïve:
g
génère l’ensemble des codes gris avec longueurn
(avec 0-padding),f
appelsg
aveclength(input)+1
, supprime tous les éléments jusqu’à ce qu’il0<inputstring>
soit trouvé et retourne l’élément suivant (tronquant éventuellement le premier0
).la source
MATL , 18 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Soit a ( n ) la séquence d’entiers correspondant aux codes Gray ( OEIS A003188 ). Le programme utilise la caractérisation a ( n ) = n étage XOR ( n / 2), où XOR est exprimé en bits.
Essentiellement, le code convertit l'entrée en un entier égal à 0 , trouve cet entier dans la séquence, puis sélectionne le terme suivant. Cela nécessite la génération d' un nombre suffisant de termes de la suite d' un ( n ). Il s'avère que 2 · un 0 est suffisamment grand. Cela découle du fait que le code Gray un ( n ) n'a jamais plus de chiffres binaires que n .
Prenons l'entrée
'101'
comme exemple.la source
CJam (19 octets)
Démo en ligne . Il s'agit d'un bloc anonyme (fonction) d'un tableau de bits à un tableau de bits, que la démonstration exécute en boucle.
Cela fonctionne sur le principe simple que si le nombre de bits définis est pair, nous devrions basculer le bit le moins significatif, sinon nous devrions basculer le bit à gauche du bit le moins significatif. En fait, identifier ce bit s'avère beaucoup plus facile en utilisant des hacks de bits sur un entier qu'en utilisant la liste de bits.
Dissection
En travaillant uniquement avec le tableau de bits, je pense qu’il est nécessaire de l’inverser: travailler avec le plus à gauche
1
est beaucoup plus facile que le plus à droite. Le meilleur que j'ai trouvé jusqu'à présent est (24 octets):Approche alternative (19 octets)
Ceci convertit le code Gray en index, incrémente et reconvertit en code Gray.
la source
JavaScript (ES6), 53 octets (non en concurrence)
Une fonction récursive qui construit tous les codes de gris jusqu'à ce que l'entrée soit trouvée, puis s'arrête à l'itération suivante.
L'entrée la plus élevée possible dépend de la limite de récursivité du navigateur (environ 13 bits dans Firefox et 15 bits dans Chrome).
la source
--harmony
ajouté pour les octets de pénalité afin d'avoir accès à l'optimisation de la récursivité des appels différés, ce qui semble possible ici.Retina, 25 octets
Je suis convaincu qu'il devrait y avoir une meilleure façon de faire cela ...
la source
^
?05AB1E , 12 octets
Utilise le codage CP-1252 .
Essayez-le en ligne!
Explication
Exemple pour l'entrée 1011 .
la source
Python 2.7, 68 caractères
Python 3, 68 caractères
Cette fonction convertit la chaîne binaire donnée en un entier, puis x ou le dernier bit si le nombre de bits définis dans la chaîne d'origine est pair, ou échange le bit situé à gauche du bit défini le plus à droite si le nombre de bits définis dans la chaîne d'origine la chaîne est étrange. Ensuite, il convertit le résultat en chaîne binaire et supprime le
0b
préfixe booléen.la source
def f(s):
et (en supposant Python 2) un autre en utilisant à laprint
place dereturn
.int()
générer un entier de 32 bits, bien que mon exigence soit d’incrémenter toute chaîne de longueur. Je ne suis pas sûr que cela soit considéré comme une candidature validelong
au lieu deint
pourrait résoudre le problème.C ++, 205 octets
Description: Les nombres pairs ont un nombre pair de uns.
z
Celles variables siz
est pair (z mod 2 = z%2 = 0
- autre branche), modifie le dernier bit; Siz
est impair, appelez cette fonction sans le dernier caractère et calculez la nouvelle valeur, puis ajoutez le dernier caractère après.Cliquez ici pour l'essayer pour les cas de test.
la source
Lot,
199197 octetsLit l'entrée de STDIN dans la variable
s
. Supprime les 0 et effectue un contrôle de parité sur les 1. S'il y a un nombre impair, il supprime les 0 les plus à droite d'une boucle et s'arrête lorsqu'il supprime un 1.s
contient donc le préfixe pair etr
le reste de la chaîne.s
est mis à zéro s'il était vide afin que son dernier chiffre puisse être basculé, puis tout est concaténé.la source
En fait,
201913 octetsBasé sur la réponse de Martin Ender Jelly avec ma propre version de "réduction cumulative de XOR sur l'entrée". Les suggestions de golf sont les bienvenues. Essayez-le en ligne!
Ungolfing
la source
J, 38 octets
Essayez-le en ligne!
Ceci est essentiellement l'algorithme de Martin dans J.
Notez que
22 b.
c'est XOR.la source