Erstellen Sie ein Programm, das das Hamming-Gewicht von berechnet ein Faden. Gewinner ist das Programm mit dem niedrigsten Hamming-Gewicht.
Regeln:
- Das Hamming-Gewicht für ein ASCII-Zeichen ist definiert als die Gesamtzahl der auf in seiner binären Darstellung.
- Angenommen, die Eingabecodierung ist 7-Bit-ASCII und wird über den für Ihre Sprache normalen Eingabemechanismus (z. B. stdin, args usw.)
- Geben Sie das Ergebnis als Zahl an stdout oder einen anderen Standard- / normalen Ausgabemechanismus aus, den Ihre Sprache verwendet.
- Es sollte selbstverständlich sein, aber Sie müssen in der Lage sein, tatsächlich auszuführen das Programm im wirklichen Leben, damit es eine gültige Lösung ist.
- Gewinner ist die Lösung, deren Code das niedrigste Hamming-Gewicht hat.
-
Entschuldigung, Keine Lösungen in Whitespace für dieses!Ok, Sie können jetzt in Whitespace codieren. Ich habe die Regeln aussortiert 🙂
Beispiele pro Zeichen:
char | binary | weight -----+----------+------- a | 01100001 | 3 x | 01111000 | 4 ? | 00111111 | 6 \x00 | 00000000 | 0 \x7F | 01111111 | 7
Kommentare
- wenn wir
0x20
/ ASCII 32 als Referenz ist nicht ‚ das Summengewicht vonhello world
10 statt 11? - Warum ist das Gewicht von
hello world
11? Nur 10 Zeichen unterscheiden sich von einem Leerzeichen. Außerdem scheint das Hamming-Gewicht eines Programms ‚ nur seine Länge zu sein, ausgenommen Leerzeichen. Nicht so anders als normales Code-Golf. - Entschuldigung, ich habe das total vermasselt. Der Artikel über das Hamming-Gewicht von Wikipedia ‚ ist ziemlich irreführend, und ich habe die Regeln von ‚ total befolgt. Jetzt neu schreiben. Update: Ok, neu geschrieben, um es als die Anzahl der Bits zu definieren, die in der ASCII-Zeichenfolge auf 1 gesetzt sind. Entschuldigen Sie den Fehler.
- @ugoren Eine Lösung mit niedrigerem Wert -Wert ASCII-Zeichen haben ein geringeres Hamming-Gewicht.
- Jetzt macht alles Sinn. Verwenden Sie Großbuchstaben, achten Sie auf
~
UNDo
.
Antwort
J (33)
Eins niedriger als 34!
+/,#:3 u:
Stark inspiriert von dieser Antwort , aber einem Hamming-Gewicht von eins weniger.
+/,#:3 u:"+/,#:3 u:" 33
Antwort
J, Gewicht 34
+/,#:a.i.
Verwendung – platzieren Sie die Zeichenfolge, die am Ende in Anführungszeichen gemessen werden soll:
+/,#:a.i."+/,#:a.i." 34
Alternativ können Sie Eingaben über die Tastatur vornehmen (Gewicht 54):
+/,#:a.i.1!:1[1 hello 21
Kommentare
- ‚ gibt es nur eine Möglichkeit, dies zu schreiben 🙂
- Es gibt kein ‚ t … Ich habe eine Lösung gefunden, deren Hamming-Gewicht um eins niedriger ist.
- Ich versuche nicht, ein Buzzkill zu sein. Die Regeln verlangen jedoch ein Programm, kein Fragment.
Antwort
J , 39
+/,#:a.i:]
Dies ist eine Funktion, die eine übernimmt Streit. (Oder ersetzen Sie ]
direkt durch die Zeichenfolge. Wie Gareth bemerkt, werden die Kosten dadurch auf 34 gesenkt.)
+/,#:a.i:] "hello world" 45 +/,#:a.i:] "+/,#:a.i:]" 39
Kommentare
- Große Köpfe denken gleich. 🙂
Antwort
Python, 189
print sum(bin(ord(A)).count("1")for A in raw_input())
Kommentare
- Das Python 3-Äquivalent
print(sum(bin(ord(A)).count('1')for A in input()))
hat eine Punktzahl von 180. - @ dan04: Verwenden Sie für 176 doppelte Anführungszeichen anstelle von einfachen.
Antwort
QBasic, 322 311 286 264
H$=COMMAND$ FOR A=1 TO LEN(H$) B=ASC(MID$(H$,A,1)) WHILE B>0 D=D+B MOD 2 B=B\2 WEND NEXT ?D
Art von Das richtige Werkzeug für den Job ist natürlich immer noch zum Kotzen.
Kommentare
- +1 für die Verwendung einer meiner Lieblingssprachen aller Zeiten. ‚ ist die erste Sprache, die ich gelernt habe, auf einem PC zu codieren.
Antwort
Unary 0
Sie alle wussten, dass es kommen würde. Zuerst das BrainFuck-Programm:
,[[>++[>>+>+<<<-]>>> [<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-] [-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>> [-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<< [>>+<[>>+>+<<<-]>>>[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]> [-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<]>>> [>+>+<<-]>>[<<+>>-][-]+<[>[-]<<[<<->>-]<<[>>+<<-]>>>[-]]>[<<<+<[-]>>>> [-]]<<[->>>>+<<<<]<[-<<+>>]<<],]>>>>>>>.
Ich habe Zeilenumbrüche hinzugefügt, um es „lesbar“ zu machen, aber es hat ein Hamming-Gewicht von 4066. Es funktioniert durch wiederholtes Abrufen des Quotienten / Reste einer Eingabezeichenfolge und Addition aller Reste. Wenn Sie es auf sich selbst ausführen, erhalten Sie natürlich: 226 (4066% 256) (technisch \ xe2), so klar, dass es sich selbst als Gewinner ausgibt.
Jetzt konvertieren wir es in Unary und erhalten
000 ... 9*google^5.9 0"s ... 000
Wir verwenden eine unäre Implementierung mit NULL-Zeichen \ x00 für „0“ und Boom mit einem Hamming-Gewicht von 0.
Bonusfrage : Für welche ASCII-Zeichen c
können Sie dieses Programm für eine Zeichenfolge ausführen, die aus N
wiederholt und lässt dieses Zeichen ausgeben. (Zum Beispiel gibt eine Zeichenfolge von 32 Leerzeichen ein Leerzeichen).Welche Werte von N
funktionieren (entweder funktioniert eine unendliche Anzahl von ihnen oder keine).
Kommentare
- Ich ‚ bin mir nicht sicher, ob ich diese Lösung verstehe. Das Brainfuck-Programm hat ein enormes Hamming-Gewicht. Akzeptiert Unary Null-Bytes als Programm oder müssten Sie Unary erneut implementieren? Wenn es ‚ das letztere ist, ist es ‚ keine wirklich gültige Lösung – jeder könnte einfach “ Ich definiere eine Programmiersprache, in der jedes einzelne Eingabebyte {result} “ ergibt, und gewinne jede Code-Golf-Herausforderung auf der Site.
- Eine Null Charakter Unary wäre in Ordnung. Alles, was Sie brauchen, ist ein EOF, um zu sagen, dass Sie aufhören zu zählen. Tatsächlich ist hier ‚ ein Pseudo-C zum Lesen dieser Datei:
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
Nicht ‚ Es spielt überhaupt keine Rolle, was Sie als unären Charakter auswählen (solange es nicht ‚ t EOF ist). - Nun, hier ‚ ist für den C-Compiler unary, der mit Nullzeichen einwandfrei funktioniert: ideone.com/MIvAg . Natürlich würde die für dieses Programm erforderliche Datei nicht in das Universum passen, aber wir können es ausführen.
- Wenn Sie ‚ t tatsächlich ausführen, ‚ ist keine wirkliche Lösung.
- Als Carl Sagan einmal gesagt: “ Wenn Sie das Hamming-Gewicht eines Strings berechnen möchten, müssen Sie zuerst 10 ^ 500 Universen erfinden. “ (Milliarden und Milliarden, sogar)
Antwort
C, Gewicht 322 263 256
Zählt das Hamming-Gewicht des Hamming-Gewichts?
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);}
Wird hauptsächlich zum Standardgolf verwendet Techniken.
Eine einzelne Schleife berechnet das Gewicht (nach rechts verschieben und bis Null addieren) und scannt die Zeichenfolge (bewegt den Zeiger vor, wenn Null erreicht ist).
Angenommen, D
wird auf 2 initialisiert (einzelner Parameter).
Hamming gewichtsspezifische Optimierungen ons:
1. ABDH
mit einem Gewicht von jeweils 2, das für Namen verwendet wird.
2. *++H
bevorzugt gegenüber H[1]
.
Kommentare
- Hah, ich habe Ihren ersten Satz bis jetzt überhaupt nicht verstanden.
- Sie können die Punktzahl auf 230 senken, indem Sie das Ergebnis als unäre Zahl ausgeben:
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
- @schnaader Ich wusste nie, dass
@
eine Ziffer im unären System ist. Ich dachte, es wird nur0
verwendet.0
. Wenn Sie diesen Weg gehen möchten, istprintf("@"+*a%2)
kürzer. - @ugoren: Hängt von der Konvention / Definition von unary ab. Z.B. en.wikipedia.org/wiki/Unary_numeral_system verwendet Strichmarkierungen und sagt “ Es gibt kein explizites Symbol für Null in unary wie in anderen traditionellen Basen „.
- @schnaader, OK, aber ich denke es ‚ s Erweitern der Anforderung “ als Zahl “ zu weit.
Antwort
Golfscript 84 72 58
{2base~}%{+}*
(danke an Howard und Peter Taylor für ihre Hilfe)
Eingabe: Die Eingabezeichenfolge muss sich auf dem Stapel befinden (als Befehlszeile übergeben) Argument oder einfach auf den Stapel gelegt).
Wenn Sie es über die Befehlszeile ausführen, stellen Sie sicher, dass Sie echo -n
verwenden. Andernfalls wird auch die nachfolgende neue Zeile verwendet gezählt werden.
Ausgabe: druckt den Hamming-Gewichtswert auf die Konsole
Das Programm kann getestet werden
hier .
Kommentare
- Bei Golfscript wird zwischen Groß- und Kleinschreibung unterschieden? Wenn nicht, können Sie einige Bits speichern, indem Sie
BASE
anstelle vonbase
verwenden. Update: Gerade überprüft,BASE
funktioniert ‚ nicht. Gute Lösung 🙂 - @Polynomial Ich habe das versucht, nachdem ich Ihren
TEST
/test
Kommentar gesehen habe 🙂 Aber das tut es nicht ‚ funktioniert nicht. - Sie können
{...}2*
entfernen, indem Sie2base~
an erster Stelle. Erzielt eine Punktzahl von 72. - @Howard, danke für diesen tollen Tipp! Ich ‚ habe es in meiner Antwort angewendet.
- Ihr Testmechanismus ist falsch, weil Sie ‚ eine vergessen haben wichtige Einschränkung Ihrer Web GolfScript-Seite. Sie sollten ein
;
vor der Zeichenfolge haben, die Sie für stdin ersetzen, damit(;
nicht erforderlich ist. Dann wird die Beobachtung von Howard ‚ auf 65 reduziert.
Antwort
Perl, 80 (22 Zeichen)
Fertig und fertig:
perl -0777nE "say unpack"%32B*""
Oder hier ist eine alternative Version mit einem Gewicht von 77 (21 Zeichen):
perl -0777pE "$_=unpack"%32B*""
Diese Version gefällt mir jedoch nicht so gut, da in der Ausgabe der letzte Zeilenumbruch weggelassen wird.
Um das Gewicht zu berechnen, gehe ich davon aus, dass ich die Zeichen auf die übliche Weise zähle (Ausgenommen perl -e
/ -E
, jedoch einschließlich anderer Optionszeichen). Wenn sich Leute aus irgendeinem Grund darüber beschweren, kann ich ohne Optionen am besten auf 90 (26 Zeichen) verzichten:
$/=$,,say unpack"%32B*",<>
Beispielnutzung:
$ perl -0777nE "say unpack"%32b*"" rickroll.txt 7071
Boom.
Antwort
Pyth – 15
Haftungsausschluss: Diese Antwort ist nicht gewinnberechtigt, da Pyth jünger als diese Herausforderung ist.
Verwendet .B
für die binäre Darstellung und zählt die Anzahl der "1"
„s.
/.BQ\1
Nimmt Eingaben in eine Zeichenfolge vor, um z
gegenüber Q
zu speichern.
Antwort
Scala 231
readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum
Selbsttestcode:
"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum
mit Selbsttest-Änderung.
Kommentare
- Es ‚ hat ein Gewicht von 495, nicht 231. Sie können ‚ kein Gewicht 231 mit 126 Zeichen erhalten – das ‚ ist ein Durchschnitt von weniger als 2 und alle druckbaren Zeichen (außer
@
und Leerzeichen, die Sie nicht ‚ t use) haben mindestens das Gewicht 2. - @ugoren: Aber ‚ sind nur 65 Zeichen. Das Programm wird fast zweimal gedruckt: Einmal den Code zur Berechnung des Hamming-Gewichts und ein zweites Mal als statische Eingabe zur Berechnung für das Programm. Dem Berechnungsteil fehlt jedoch die “ readLine () „, da die Literaleingabe erforderlich ist. Ich habe versucht, die Antwort selbst zu klären.
Antwort
Java, Gewicht 931. 774 499 454
Ich denke, dies ist derzeit die einzige Antwort mit einem Gewicht von über 300.
class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}}
Erwartet die Eingabe als Befehlszeilenargument.
Antwort
GNU sed -r
, 467 + 1
(+1 für die Verwendung von -r
– oder sollte das +4 sein?)
Gibt als unären Wert pro Quellzeile aus. Um in eine Dezimalsumme umzuwandeln, leiten Sie die Ausgabe in | tr -d "\n" | wc -c
um. Zählt alle druckbaren ASCII-Zeichen (32-126) plus Zeilenvorschub (10).
s@[a-z]@\U& @g s@[?{}~]@ @g s@[][/7;=>OW|^]@ @g s@[-"+.3569:<GKMNSUVYZ\\]@ @g s@[#%&)*,CEFIJL1248ORTX]@ @g s@$|[!"$(ABDH0P`]@ @g y! @!11!
Es ist schwer zu vermeiden, alle Zeichen aufzulisten, aber wir können reduzieren Dies zeigt, dass Kleinbuchstaben ein Hamming-Gewicht von eins mehr haben als die entsprechenden Großbuchstaben. Wir bevorzugen Zeilenumbruch (Punktzahl 2) gegenüber Semikolon (Punktzahl 5) als Anweisungstrennzeichen; wir bevorzugen @
(Punktzahl 1) oder !
(Punktzahl 2) über /
(Punktzahl 5) als Musterbegrenzer.
Hinweis – Um die richtigen Zeichensätze zu erhalten, habe ich diese Tabelle aus der Tabelle in man ascii
erstellt, sortiert nach Gewicht. Fügen Sie einfach die Punktzahlen rechts und unten hinzu, um das Gesamtgewicht jedes Zeichens zu erhalten:
2 4 3 5 6 7 --- ------ - 0: @ 0 P ` p |0 1: ! A 1 Q a q | 2: " B 2 R b r |1 4: $ D 4 T d t | 8: ( H 8 X h x | 3: # C 3 S c s | 5: % E 5 U e u | 6: & F 6 V f v |2 9: ) I 9 Y i y | A: * J : Z j z | C: , L < \ l | | 7: ´ G 7 W g w | B: + K ; [ k { |3 D: - M = ] m } | E: . N > ^ n ~ | F: / O ? _ o |4 --- ------ - 1 2 3
Dies könnte sich für andere als nützlich erweisen.
Antwort
Julia 262 268
Die modifizierte Version verwendet die praktische Funktion „count_ones“ zum Speichern von 6 (262)
show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1]))))
Alt Version ohne integrierte Einzählfunktion (268)
show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1]))))
Verwendet das Befehlszeilenargument für die Eingabe.
Antwort
CJam 52 oder 48
Wenn sich die Eingabe nicht bereits auf dem Stapel befindet (52)
q:i2fbs:s:i:+
Wenn sich die Eingabe auf dem Stapel befindet (48)
:i2fbs:s:i:+
Zum Beispiel
"Hello World":i2fbs:s:i:+
Antwort
Julia, HW 199
H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))
Mit
A="H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))"
oder durch direktes Einfügen der Zeichenfolge:
julia> H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect("H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))"))) 199
Die ungolfed Version (HW 411) sieht so aus:
bitstring=mapreduce(x->bits(x),*,collect(teststring[:])) mapreduce(checkbit->checkbit=="1",+,bitstring)
Und zum Spaß hier eine optimierte Version (Hamming Weight 231 ) von Bakergs Übernahme des Problems:
A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))
mit
H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))"
Antwort
HPPPL (HP Prime Programming Language), 74
sum(hamdist(ASC(a),0))
Der HP Prime-Grafikrechner verfügt über eine integrierte Funktion hamdist ().Das Hamming-Gewicht jedes Zeichens entspricht dem Hamming-Abstand von 0.
ASC (Zeichenfolge) erstellt ein Array der ASCII-Werte jedes Zeichens in einer Zeichenfolge.
hamdist ( value, 0) berechnet den Hamming-Abstand von 0 für jeden ASCII-Wert.
sum () fasst alle Werte zusammen.
Berechnen des Hamming-Gewichts seines eigenen Quellcodes:
Antwort
05AB1E , Gewicht 17 (4 Bytes )
ÇbSO
Probieren Sie es online aus oder Überprüfen Sie weitere Testfälle .
Erläuterung:
Ç # Convert the characters in the (implicit) input to their ASCII decimal values # i.e. "Test" → [84,101,115,116] b # Convert those values to binary # i.e. [84,101,115,116] → ["1010100","1100101","1110011","1110100"] S # Split it into a list of 0s and 1s (implicitly flattens) # i.e. ["1010100","1100101","1110011","1110100"] # → [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] O # Sum those (and output implicitly) # i.e. [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] → 16
Antwort
Perl 6 , 102
+*.ords>>.base(2).comb(~1)
Während dies kein Code-Golf ist, scheint die kürzeste Lösung auch das kleinste Hamming-Gewicht zu haben …