Un bit de parité est l'une des formes les plus simples d'une somme de contrôle. Tout d'abord, vous devez choisir la parité, paire ou impaire. Disons que nous choisissons même. Maintenant, nous avons besoin d'un message à transmettre. Disons que notre message est "Foo". Ceci est écrit en binaire comme:
01000110 01101111 01101111
Maintenant, nous comptons le nombre total de 1
's là-dedans, qui est 15. Puisque 15 est un nombre impair, nous devons ajouter un bit supplémentaire à la fin de notre message, et nous aurons maintenant un nombre pair de bits' on ' . Ce dernier bit ajouté est appelé "bit de parité". Si nous avions choisi une parité impaire pour notre somme de contrôle, nous aurions dû ajouter un «0» supplémentaire afin que le nombre de bits reste impair.
Le défi:
Vous devez écrire un programme ou une fonction qui détermine le bit de parité correct pour une chaîne. Votre programme doit prendre deux entrées:
Une chaîne,
s
. C'est le message sur lequel la somme de contrôle sera calculée. Cela sera limité aux 95 caractères ASCII imprimables.Un caractère ou une chaîne de caractères unique
p
, qui sera soite
pour la parité paire, soito
pour la parité impaire.
et produire une valeur true-falsey représentant le bit de parité correct. Vérité si c'est un 1
, et falsey si c'est un 0
.
Les commandes internes qui comptent le nombre de bits "on" dans une chaîne ou un caractère ne sont pas autorisées. Par exemple, une fonction f
qui fait cela: f('a') == 3
ou f('foo') == 16
est interdite. Tout le reste, comme la conversion de base, est un jeu équitable.
Test IO:
(without the quotes)
s: "0"
p: 'e'
output: 0
s: "Foo"
p: 'e'
output: 1
s: "Hello World!"
p: 'o'
output: 0
s: "Alex is right"
p: 'e'
output: 1
s: "Programming Puzzles and Code-Golf"
p: 'e'
output: 0
s: "Programming Puzzles and Code-Golf"
p: 'o'
output: 1
Il s'agit de codegolf, donc les failles standard s'appliquent et la réponse la plus courte en octets l'emporte.
o
a même la parité.str(int(s, 2)).count('1')
? Non, je ne considérerais pas cela comme une fonction intégrée unique qui viole cette règle. Ma modification le rend-elle plus claire?char == single_char_string
. J'ai également modifié cela dans le post.Réponses:
MATL ,
87 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test à la fois .
la source
Java, 97 octets
Parce que, tu sais, Java.
Ceci est un lambda pour un
BiFunction<String, Character, Boolean>
.e
eto
semblent être inversés dans la déclaration de retour, car apparemment ma logique était à l'envers.la source
Python 2, 51 octets
Ceci est basé sur une idée de Sp3000 pour compter 1 dans la représentation sous forme de chaîne de la liste des codes de caractères en binaire plutôt que de sommer pour chaque caractère.
La nouvelle astuce consiste à gérer
e
eto
dans ce domaine aussi. Sie
était impair eto
pair, nous pourrions simplement ajouter le bit de parité à la chaîne avant de faire le compte (en les retournant parce que «1» est vrai). Malheureusement, ils ne le sont pas. Mais, si nous supprimons tout sauf leurs deux derniers bits, c'est maintenant vrai.Cela se fait en supprimant le premier
9
caractère de la représentation sous forme de chaîne.la source
eo
!Gelée,
98 octetsEssayez-le en ligne!
Merci à Dennis pour un octet!
la source
V}
... celui-là était vraiment cool !!! (Dennis est un vrai golfeur) +1 Il a battu toutes mes tentatives.C, 62 octets
XOR a la belle propriété qu'il peut être utilisé pour réduire les chaînes à un seul caractère, tout en préservant la parité.
Ideone.
la source
27030>>((p^p>>4)&15)&1
devrait calculer la parité de p et est même 1 octet plus courtchar *s
est inégaléf(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}
le%3
retourne toujours 0 pour un 0, mais peut renvoyer 1 ou 2 pour un 1. Ceci est acceptable selon les règles:truthy if it's a 1
27030>>((p^p>>4)&15)&1
. Eh bien, euh, évidemment. ;-)Python,
5857 octetsla source
lambda s,p:`map(bin,map(ord,s))`.count('1')%2^(p>'e')
!=p>'e'
.lambda s,p:`map(bin,map(ord,p+s))`[8:].count('1')%2
Pyth, 12 octets
Suite de tests.
la source
JavaScript (ES6),
8472 octetsLe twiddling de bits s'est avéré plus court que la conversion en base 2 et en comptant
1
s.la source
Perl, 29 octets
Comprend +2 pour
-p
Exécuter avec l'entrée sur STDIN comme chaîne d'espace de caractères de parité, par exemple
parity.pl
la source
J, 27 octets
Usage
la source
JavaScript (ES6), 69 octets
la source
PowerShell v2 +, 91 octets
/ moi pleure dans un coin
Ouais ... donc, la conversion de base n'est pas un fort avantage pour PowerShell. La conversion de la chaîne d'entrée en représentation binaire
$a|%{[convert]::toString(+$_,2)}
est de 32 octets en soi ...Prend des entrées
$a
et$b
transtype explicitement en$a
tant que tableau de caractères dans le processus. Nous vérifions ensuite si$b
est-eq
uel ào
, et-xor
que l'autre moitié du programme. Pour cette partie, nous prenons la chaîne d'entrée$a
, la canalisons à travers une boucle pour convertir chaque lettre en binaire,-join
toutes celles-ci ensemble pour former une chaîne solide et-replace
tous les0
s sans rien. Nous comptons ensuite le.length
de cette chaîne et le prenons mod-2 pour déterminer s'il est pair ou impair, qui sera commodément soit0
ou1
, parfait pour le-xor
.Reviendra
True
ou enFalse
conséquence. Voir les cas de test ci-dessous:la source
Facteur, 85 octets
Pour une raison quelconque, je n'ai pas pu envelopper ma tête autour de celui-ci jusqu'à il y a quelques minutes, quand j'ai simplifié (et peut-être raccourci?) Le code.
?
est comme un opérateur ternaire: il teste la véracité du troisième élément de pile et sélectionne latrue
valeur ou lafalse
valeur.Il est à peu près équivalent au pséduocode de type C suivant:
Le reste du code est assez simple:
la source
Code machine IA-32, 15 octets
Hexdump:
Code d'assemblage:
Il s'agit d'une fonction qui reçoit son premier argument (chaîne) dans
ecx
et son deuxième argument (char) dansdl
. Il renvoie le résultat danseax
, il est donc compatible avec lafastcall
convention d'appel.Ce code contourne les règles lorsqu'il utilise l'
setpo
instruction:Cette instruction définit
al
le bit de parité calculé par l'instruction précédente - j'ai donc ces deux astuces sur les règles:xor
) qui calcule le bit de parité. L'setpo
instruction la déplace uniquement vers leal
registre.Ces détails sémantiques à l'écart, voici l'explication de ce que fait le code.
Les représentations des personnages sont:
Si on leur ajoute 1, ils se trouvent avoir juste la bonne parité:
Nous avons donc
XOR
tous les caractères de la chaîne, l'initialisational
à ces valeurs, ce qui donne la réponse.La première instruction est
movzx eax, dl
au lieu de la plus évidente (et plus courte)mov al, dl
, car je veux avoir le numéro 0 dans un registre (ah
dans ce cas) afin de pouvoir le comparer dans le bon ordre (0, [ecx]
plutôt que[ecx], 0
).la source
Julia,
58474540 octetsIl s'agit d'une fonction qui accepte une chaîne et un caractère et renvoie un entier.
Pour obtenir le nombre de uns dans la représentation binaire, nous appliquons d'abord la
bin
fonction à chaque caractère de la chaîne, ce qui nous donne un tableau de chaînes binaires. Ensuite, réduisez-les en un en utilisantprod
(car*
c'est la concaténation de chaînes dans Julia) et prenez l'intersection définie de cette chaîne et le code de caractère pour1
, ce qui nous donne une chaîne de uns. Le dernier index de cette chaîne est le nombre de ceux. Nous XOR ceci avec 1 si le caractère fourni est o et 0 sinon, puis obtenir la parité en utilisant AND au niveau du bit 1.Essayez-le en ligne! (inclut tous les cas de test)
Enregistré 18 octets grâce à Dennis!
la source
05AB1E ,
15, 13 octetsCode:
Exemple d'entrée:
Exemple de sortie:
Explication:
Merci à Adnan d'avoir économisé 2 octets.
la source
²
commande. Cela pousse automatiquement la deuxième entrée en haut de la pile. En outre, l'utilisation de chaînes de deux caractères peut être raccourcie„
."oe"
Est donc équivalent à„
. Pour 13 octets:€ÇbSOÈ„oe²k<^
:)Rubis, 57 octets
Si
0
était falsey à Ruby, le==
pourrait probablement être basculé sur juste-
, ou il pourrait y avoir d'autres optimisations, mais ce n'est pas le cas.la source
Rétine , 102 octets
Prend la chaîne sur la première ligne et la lettre sur la deuxième ligne. Utilise le codage ISO 8859-1.
Essayez-le en ligne
La classe de caractères sur la première ligne correspond à n'importe quel caractère avec un nombre impair de caractères dans la représentation binaire.
Description du fonctionnement de la détection paire / impaire avec l'expression régulière ici .
la source
Octave, 56 octets
La
bitunpack
fonction, pour les caractères ASCII, les renvoie dans l'ordre petit-boutien. Donc, en mettant le drapeau de parité à la fin de notre chaîne, en déballant le tout et en supprimant les 5 derniers bits, nous pouvons ensuite résumer le tout mod 2 pour notre réponse ultime.Usage:
la source
Lisp commun, 87
s
.p
dans la chaîne"oe"
(0 ou 1). Par exemple, s'il y en a 4, le reste est nul. Si p esto
, alors aucun bit supplémentaire ne doit être ajouté et le test retourne faux.Assez imprimé
la source
Java, 91 octets
J'ai fait la même chose que @ CAT97, mais j'ai supprimé certains caractères en utilisant le modulo 8 et la concaténation de @Luis Mendo et l'utilisation de int au lieu de booléen.
Ceci est un lambda pour un
BiFunction<String, Character, Boolean>
.la source
Matlab, 49 octets
où:
Par exemple:
la source
Outils Bash et Unix (72 octets)
Excepte
s
comme premier etp
comme deuxième argument. Heureusement, les 3 derniers bits deo
ete
ont respectivement une parité paire et impaire.La fourniture de l'entrée via
<<<
ajoute un caractère de saut de ligne, mais la parité de\n
est égale, donc ce n'est pas un problème.la source