Erstellen Sie ein Programm, das das Hamming-Gewicht einer Zeichenfolge berechnet . Gewinner ist das Programm mit dem niedrigsten Hamminggewicht.
Regeln:
- Die Hamming-Gewichtung für ein ASCII-Zeichen ist definiert als die Gesamtzahl der
1
in seiner Binärdarstellung festgelegten Bits . - Angenommen, die Eingabecodierung ist 7-Bit-ASCII, die über den für Ihre Sprache normalen Eingabemechanismus (z. B. stdin, args usw.) übergeben wird.
- Geben Sie das Ergebnis als Zahl an stdout oder an den Standard- / Normalausgabemechanismus aus, den Ihre Sprache verwendet.
- Es sollte selbstverständlich sein, aber Sie müssen in der Lage sein, das Programm im wirklichen Leben auszuführen, damit es eine gültige Lösung darstellt.
- Gewinner ist die Lösung, deren Code das niedrigste Hamming-Gewicht hat.
Entschuldigung, keine Lösungen im Leerraum für diese!Ok, Sie können in Leerzeichen codieren, jetzt habe ich die Regeln aussortiert :)
Beispiele pro Zeichen:
char | binary | weight
-----+----------+-------
a | 01100001 | 3
x | 01111000 | 4
? | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7
code-golf
binary
number-theory
Polynom
quelle
quelle
0x20
/ ASCII 32 als Referenz nehmen, ist das Summen vonhello world
10 nicht gleich 11?hello world
11? Nur 10 Zeichen unterscheiden sich von einem Leerzeichen. Auch - das Hamming-Gewicht eines Programms scheint nur seine Länge ohne Leerzeichen zu sein. Nicht so anders als beim normalen Codegolf.~
UNDo
.Antworten:
J (33)
Einer unter 34!
Stark inspiriert von dieser Antwort , aber ein Hamminggewicht von eins weniger.
quelle
J, Gewicht 34
Verwendung - Platzieren Sie die zu messende Zeichenfolge in Anführungszeichen am Ende:
Alternativ können Sie Eingaben über die Tastatur vornehmen (Gewicht 54):
quelle
J , 39
Dies ist eine Funktion mit einem Argument. (Oder
]
direkt durch die Zeichenfolge ersetzen ; Gareth merkt an, dass dies die Kosten auf 34 senkt.)quelle
Python, 189
quelle
print(sum(bin(ord(A)).count('1')for A in input()))
hat eine Punktzahl von 180.QBasic,
322311286264Irgendwie das richtige Werkzeug für den Job, nervt natürlich immer noch.
quelle
Unär 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 eine Hamming-Gewichtung von 4066. Es funktioniert, indem wiederholt der Quotient / die Reste einer Eingabezeichenfolge abgerufen und alle Reste addiert werden. Natürlich, sollten Sie es auf sich laufen lassen, erhalten Sie: 226 (4066% 256) (technisch gesehen \ xe2) so klar, dass es sich selbst zum Sieger erklärt.
Jetzt konvertieren wir es zu Unary und holen
Wir verwenden eine unäre Implementierung mit NULL-Zeichen \ x00 für '0' und Boom mit einer Hamming-Gewichtung von 0.
Bonusfrage : Für welche ASCII-Zeichen
c
können Sie dieses Programm mit einer ZeichenfolgeN
ausführen, die aus Wiederholungen besteht, und dieses Zeichen ausgeben lassen. (ZB eine Zeichenfolge von 32 Leerzeichen ergibt ein Leerzeichen). Welche Werte derN
Arbeit (entweder eine unendliche Anzahl von ihnen wird funktionieren, oder keiner wird funktionieren).quelle
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
spielt überhaupt keine Rolle, was Sie als unären Charakter auswählen (solange es nicht EOF ist).C, Gewicht
322263256Zählt das Hamming-Gewicht des Hamming-Gewichts?
Meistens Standard-Golftechniken verwendet.
Eine einzelne Schleife berechnet das Gewicht (Verschieben nach rechts und Addieren bis Null) und tastet die Zeichenfolge ab (rückt den Zeiger vor, wenn Null erreicht ist).
Angenommen, es
D
wird 2 (Einzelparameter) initialisiert.Hamming gewichtsspezifische Optimierungen:
1.
ABDH
mit jeweils 2 Gewichten, die für Namen verwendet werden.2.
*++H
lieber alsH[1]
.quelle
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
@
es im unären System eine Ziffer gibt. Ich dachte , es nur verwendet0
..0
. Aber wenn Sie dies gehen möchten, ist der Wegprintf("@"+*a%2)
kürzer.Golfscript
847258(Dank an Howard und Peter Taylor für ihre Hilfe)
Eingabe: Die Eingabezeichenfolge muss sich auf dem Stapel befinden (als Befehlszeilenargument übergeben oder einfach auf dem Stapel abgelegt).
echo -n
Wenn Sie es über die Befehlszeile ausführen, stellen Sie sicher, dass Sie es verwenden , da sonst auch die nachgestellte Zeile gezählt wird.Ausgabe: Druckt den Hamming-Gewichtswert auf die Konsole
Das Programm kann hier getestet werden .
quelle
BASE
anstelle von verwendenbase
. Update: Nur überprüft,BASE
funktioniert nicht. Gute Lösung :)TEST
/test
Kommentar gesehen habe :) Aber es funktioniert nicht.{...}2*
indem Sie sich zuerst bewerben2base~
. Erzielt einen Score von 72.;
String vor dem String haben, den Sie durch stdin ersetzen, damit dies(;
nicht erforderlich ist. Dann bringt es Howards Beobachtung auf 65.Perl, 80 (22 Zeichen)
Gemacht und gemacht:
Oder hier ist eine alternative Version mit einem Gewicht von 77 (21 Zeichen):
Diese Version gefällt mir allerdings nicht so gut, da in der Ausgabe die letzte Newline weggelassen wird.
Um die Gewichtung zu berechnen, gehe ich davon aus, dass ich die Zeichen auf die übliche Weise zähle (mit Ausnahme von
perl -e
/-E
, aber einschließlich anderer Optionszeichen). Wenn sich Leute aus irgendeinem Grund darüber beschweren, ist das Beste, was ich ohne Optionen tun kann, 90 (26 Zeichen):Beispielnutzung:
Boom.
quelle
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.Übernimmt die Eingabe in einer Zeichenfolge, um im
z
Vergleich zu speichernQ
.Probieren Sie es hier online aus .
quelle
Scala 231
Selbsttestcode:
mit selbsttest modifikation.
quelle
@
und Leerzeichen, die Sie nicht verwenden) haben mindestens Gewicht 2.Java, Gewicht
931774499454Ich denke, dies ist die einzige Antwort im Moment mit einem Gewicht von über 300.
Erwartet Eingabe als Befehlszeilenargument.
quelle
GNU
sed -r
, 467 + 1(+1 für die Verwendung von
-r
- oder sollte das +4 sein?)Ausgabe als unärer Wert pro Quellzeile; Um in eine Dezimalsumme umzuwandeln, leiten Sie die Ausgabe in um
| tr -d "\n" | wc -c
. Zählt alle druckbaren ASCII-Zeichen (32-126) plus Zeilenvorschub (10).Es ist schwer zu vermeiden, alle Zeichen aufzulisten, aber wir können dies reduzieren, da Kleinbuchstaben ein Hamming-Gewicht von eins mehr haben als die entsprechenden Großbuchstaben. Wir bevorzugen Zeilenvorschub (Punktzahl 2) gegenüber Semikolon (Punktzahl 5) als Anweisungstrennzeichen. Wir bevorzugen
@
(Punktzahl 1) oder!
(Punktzahl 2) gegenüber/
(Punktzahl 5) als Musterbegrenzer.Hinweis - Um die richtigen Zeichensätze zu erhalten, habe ich diese Tabelle aus der
man ascii
nach Gewicht sortierten Tabelle in erstellt . Addieren Sie einfach die Punkte rechts und unten, um das Gesamtgewicht jedes Charakters zu erhalten:Dies könnte sich für andere als nützlich erweisen.
quelle
Julia 262
268Geänderte Version nutzt praktische 'count_ones'-Funktion zum Speichern von 6 (262)
Alte Version ohne eingebaute One-Counting-Funktion (268)
Verwendet ein Befehlszeilenargument für die Eingabe.
quelle
CJam 52 oder 48
Wenn die Eingabe noch nicht im Stapel ist (52)
Wenn die Eingabe im Stapel ist (48)
Beispielsweise
quelle
Julia, HW 199
Mit
oder durch direktes Einfügen des Strings:
Die ungolfed version (HW 411) sieht so aus:
Und zum Spaß hier eine optimierte Version (Hamming Weight 231 ) von Bakerg's, die das Problem aufgreift:
mit
quelle
HPPPL (HP Prime Programming Language), 74
Der HP Prime Grafikrechner verfügt über eine integrierte hamdist () -Funktion. Das Hamming-Gewicht jedes Charakters entspricht dem Hamming-Abstand von 0.
ASC (Zeichenfolge) erstellt ein Array der ASCII-Werte jedes Zeichens in einer Zeichenfolge.
hamdist (value, 0) berechnet für jeden ASCII-Wert den Hamming-Abstand von 0
sum () summiert alle Werte.
Berechnung des Hamming Weight des eigenen Quellcodes:
quelle
05AB1E , Gewicht 17 (4 Bytes )
Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .
Erläuterung:
quelle
Perl 6 , 102
Probieren Sie es online!
Während dies kein Code-Golf ist, scheint die kürzeste Lösung auch das geringste Hamming-Gewicht zu haben ...
quelle