Ein Paritätsbit ist eine der einfachsten Formen einer Prüfsumme. Zuerst müssen Sie die gerade oder ungerade Parität auswählen. Nehmen wir an, wir holen gerade. Nun brauchen wir eine Nachricht zum Senden. Angenommen, unsere Nachricht lautet "Foo". Dies ist in binärer Form geschrieben als:
01000110 01101111 01101111
Jetzt zählen wir die Gesamtzahl der darin enthaltenen 1
Bits, also 15. Da 15 eine ungerade Zahl ist, müssen wir am Ende unserer Nachricht ein zusätzliches Bit hinzufügen, und es wird nun eine gerade Anzahl von Ein-Bits angezeigt . Dieses zuletzt hinzugefügte Bit ist als "Paritätsbit" bekannt. Wenn wir eine ungerade Parität für unsere Prüfsumme gewählt hätten, müssten wir eine zusätzliche '0' hinzufügen, damit die Anzahl der Ein-Bits ungerade bleibt.
Die Herausforderung:
Sie müssen ein Programm oder eine Funktion schreiben, die das korrekte Paritätsbit für eine Zeichenfolge bestimmt. Ihr Programm muss zwei Eingaben annehmen:
Eine Zeichenfolge
s
. Dies ist die Meldung, für die die Prüfsumme berechnet wird. Dies ist auf die 95 druckbaren ASCII-Zeichen beschränkt.Ein Zeichen oder eine einzelne Zeichenfolge
p
, die entwedere
für gerade Parität odero
für ungerade Parität steht.
und einen Wahrheits-Falsey- Wert erzeugen , der das korrekte Paritätsbit darstellt. Wahrheit, wenn es eine ist 1
, und Falschheit, wenn es eine ist 0
.
Builtins, die die Anzahl der Ein-Bits in einer Zeichenfolge oder einem Zeichen zählen, sind nicht zulässig. Zum Beispiel eine Funktion f
, die dies tut: f('a') == 3
oder f('foo') == 16
die gesperrt ist. Alles andere, wie die Basisumwandlung, ist Freiwild.
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
Dies ist Codegolf, daher gelten Standardlücken, und die kürzeste Antwort in Bytes gewinnt.
o
hat eben Parität.str(int(s, 2)).count('1')
? Nein, ich würde das nicht als einzelne eingebaute Funktion betrachten, die gegen diese Regel verstößt. Macht meine Bearbeitung es klarer?char == single_char_string
. Das habe ich auch in den Beitrag eingearbeitet.Antworten:
MATL ,
87 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle auf einmal .
quelle
Java, 97 Bytes
Weil, weißt du, Java.
Dies ist ein Lambda für a
BiFunction<String, Character, Boolean>
.e
undo
scheinen in der return-Anweisung umgekehrt zu sein, weil anscheinend meine Logik rückwärts war.quelle
Python 2, 51 Bytes
Dies basiert auf der Idee von Sp3000 , Einsen in der Zeichenfolgendarstellung der Liste der Zeichencodes in Binärform zu zählen, anstatt für jedes Zeichen zu summieren.
Der neue Trick ist, damit umzugehen
e
undo
das auch. Wenne
ungerade undo
gerade war, können wir das Paritätsbit einfach der Zeichenfolge voranstellen, bevor wir die Zählung durchführen (umdrehen, weil '1' Wahrheit ist). Leider sind sie nicht. Aber wenn wir alle bis auf die letzten beiden Bits entfernen, ist es jetzt wahr.Dies erfolgt durch Entfernen des ersten
9
Zeichens der Zeichenfolgendarstellung.quelle
eo
!Gelee,
98 BytesProbieren Sie es online!
Danke an Dennis für ein Byte!
quelle
V}
... das war echt cool !!! (Dennis ist ein echter Golfer) +1 Es hat jeden meiner Versuche geschlagen.C 62 Bytes
XOR hat die nette Eigenschaft, dass es verwendet werden kann, um Zeichenfolgen auf ein Zeichen zu reduzieren, während die Parität erhalten bleibt.
Ideone.
quelle
27030>>((p^p>>4)&15)&1
sollte die Parität von p berechnen und ist sogar 1 Byte kürzerchar *s
ist nicht belegtf(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}
Der%3
gibt immer 0 für eine 0 zurück, kann aber 1 oder 2 für eine 1 zurückgeben. Dies ist unter den folgenden Regeln akzeptabel:truthy if it's a 1
27030>>((p^p>>4)&15)&1
. Gut ähm, offensichtlich. ;-)Python,
5857 Bytesquelle
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 Bytes
Testsuite.
quelle
JavaScript (ES6),
84 bis72 ByteDas Bit-Twiddling erwies sich als kürzer als das Umwandeln in Basis 2 und das Zählen von
1
s.quelle
Perl, 29 Bytes
Beinhaltet +2 für
-p
Führen Sie mit der Eingabe in STDIN eine Paritätszeichenfolge aus, z
parity.pl
quelle
J, 27 Bytes
Verwendung
quelle
JavaScript (ES6), 69 Byte
quelle
PowerShell v2 +, 91 Byte
Ich weine in einer Ecke
Ja, die Basiskonvertierung ist für PowerShell nicht besonders geeignet. Die Konvertierung von Eingabezeichenfolge in binäre Darstellung
$a|%{[convert]::toString(+$_,2)}
beträgt 32 Bytes an und für sich ...Übernimmt Eingaben
$a
und wandelt sie$b
explizit$a
in ein Zeichen-Array um. Wir prüfen dann, ob$b
es-eq
angebracht isto
, und-xor
das mit der anderen Hälfte des Programms. Für diesen Teil nehmen wir die Eingabezeichenfolge$a
, leiten sie durch eine Schleife, um jeden Buchstaben in Binär umzuwandeln,-join
alle diese zusammen bilden eine feste Zeichenfolge und-replace
alle0
s mit nichts. Wir zählen dann die.length
dieser Zeichenkette und nehmen Sie es mod-2 , um zu bestimmen , ob es gerade oder ungerade ist , die bequem sein wird , entweder0
oder1
, ideal für die-xor
.Kommt wieder
True
oderFalse
entsprechend. Siehe Testfälle unten:quelle
Faktor 85 Bytes
Aus irgendeinem Grund konnte ich meinen Kopf nicht um diesen wickeln, bis ich vor ein paar Minuten den Code vereinfachte (und vielleicht verkürzte?).
?
ist wie ein ternärer Operator: Er testet die Richtigkeit des dritten Stapelelements und wählt entweder dentrue
Wert oder denfalse
Wert aus.Es entspricht in etwa dem folgenden C-ähnlichen Pseudocode:
Der Rest des Codes ist ziemlich einfach:
quelle
IA-32 Maschinencode, 15 Bytes
Hexdump:
Assembler-Code:
Dies ist eine Funktion, die ihr erstes Argument (String) in
ecx
und ihr zweites Argument (Char) in erhältdl
. Es gibt das Ergebnis in zurückeax
, sodass es mit derfastcall
Aufrufkonvention kompatibel ist .Dieser Code verbiegt die Regeln, wenn er die
setpo
Anweisung verwendet:Dieser Befehl setzt
al
auf das Paritätsbit, das mit dem vorherigen Befehl berechnet wurde. Ich habe also diese beiden Tipps zu den Regeln:xor
), der das Paritätsbit berechnet. Dersetpo
Befehl verschiebt ihn nur in dasal
Register.Diese semantischen Details werden hier erläutert, was der Code bewirkt.
Die Darstellungen der Zeichen sind:
Wenn wir 1 hinzufügen, haben sie zufällig genau die richtige Parität:
Also werden
XOR
alle Zeichen des Stringsal
mit diesen Werten initialisiert , was die Antwort gibt.Die erste Anweisung ist
movzx eax, dl
statt der offensichtlicheren (und kürzeren)mov al, dl
, weil ich die Nummer 0 (ah
in diesem Fall) in einem Register haben möchte , um sie in der richtigen Reihenfolge (0, [ecx]
anstatt[ecx], 0
) vergleichen zu können .quelle
Julia,
58474540 BytesDies ist eine Funktion, die eine Zeichenfolge und ein Zeichen akzeptiert und eine Ganzzahl zurückgibt.
Um die Anzahl der Einsen in der Binärdarstellung zu erhalten, wenden wir zuerst die
bin
Funktion auf jedes Zeichen in der Zeichenfolge an, wodurch wir ein Array von Binärzeichenfolgen erhalten. Reduzieren Sie sie dann mitprod
(da dies*
in Julia die Verkettung von Zeichenfolgen ist) zu einer und nehmen Sie den Schnittpunkt dieser Zeichenfolge mit dem Zeichencode für1
, wodurch wir eine Reihe von Einsen erhalten. Der letzte Index dieser Zeichenfolge ist die Anzahl der Einsen. Wir XOREN dies mit 1, wenn das bereitgestellte Zeichen o und sonst 0 ist, dann erhalten Sie die Parität mit bitweisem AND 1.Probieren Sie es online! (beinhaltet alle Testfälle)
Dank Dennis 18 Bytes gespart!
quelle
05AB1E ,
15, 13 BytesCode:
Beispiel Eingabe:
Beispielausgabe:
Erläuterung:
Vielen Dank an Adnan für das Speichern von 2 Bytes.
quelle
²
Befehl können Sie zwei Bytes abspulen. Dadurch wird die zweite Eingabe automatisch auf den Stapel gelegt. Zwei-Zeichen-Zeichenfolgen können auch mit gekürzt werden„
. Ist"oe"
also gleichbedeutend mit„
. Für 13 Bytes:€ÇbSOÈ„oe²k<^
:)Ruby, 57 Bytes
Wenn
0
in Ruby eine Falschmeldung vorlag,==
könnte die wahrscheinlich auf "nur" umgestellt werden-
, oder es könnten andere Optimierungen vorgenommen werden, dies ist jedoch nicht der Fall.quelle
Netzhaut , 102 Bytes
Nimmt die Zeichenfolge in der ersten Zeile und den Buchstaben in der zweiten Zeile. Verwendet ISO 8859-1-Codierung.
Probieren Sie es online aus
Die Zeichenklasse in der ersten Zeile entspricht einem beliebigen Zeichen mit einer ungeraden Anzahl von Einsen in der Binärdarstellung.
Beschreibung, wie gerade / ungerade Erkennung mit Regex hier funktioniert .
quelle
Oktave, 56 Bytes
Die
bitunpack
Funktion gibt ASCII-Zeichen in Little-Endian-Reihenfolge zurück. Indem wir also das Paritäts-Flag an das Ende unserer Zeichenkette setzen, das Ganze auspacken und die letzten 5 Bits löschen, können wir das Ganze Mod 2 für unsere endgültige Antwort zusammenfassen.Verwendung:
quelle
Common Lisp, 87
s
.p
in der Zeichenfolge verglichen"oe"
(entweder 0 oder 1). Wenn es beispielsweise 4 Einsen gibt, ist der Rest Null. Wenn p gleich isto
, sollte kein zusätzliches Bit hinzugefügt werden, und der Test gibt false zurück.Hübsch bedruckt
quelle
Java, 91 Bytes
Ich habe das gleiche getan wie @ CAT97, aber einige Zeichen mit dem Modulo 8 und der Verkettung von @ Luis Mendo und der Verwendung von int anstelle von boolean entfernt.
Dies ist ein Lambda für a
BiFunction<String, Character, Boolean>
.quelle
Matlab, 49 Bytes
woher:
Beispielsweise:
quelle
Bash- und Unix-Tools (72 Bytes)
Ausnahmen
s
als erstes undp
als zweites Argument. Glücklicherweise sind die letzten 3 Bitso
unde
hat jeweils ungerade und gerade Parität.Durch die Eingabe über wird
<<<
ein Zeilenvorschubzeichen hinzugefügt, die Parität von\n
ist jedoch gerade, sodass dies kein Problem darstellt.quelle