... Ah sorry, kein Popcorn hier, nur POPCNT.
Schreiben Sie das kürzeste Programm oder die kürzeste Funktion, die eine Zahl aufnimmt, n
und geben Sie alle Ganzzahlen von 0 bis 2 n - 1 in aufsteigender Reihenfolge der Anzahl von 1 Bits in der binären Darstellung der Zahlen aus (Popcount) aus. Duplikate sind nicht erlaubt.
Die Reihenfolge der Nummern mit demselben Popcount ist implementierungsspezifisch.
Beispielsweise sind für n = 3
alle diese Ausgaben gültig:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
Das Eingabe- und Ausgabeformat ist implementierungsdefiniert, um die Verwendung von Sprachfeatures zu ermöglichen, um den Code weiter zu verbessern. Die Ausgabe unterliegt einigen Einschränkungen:
- Die Zahlen müssen im Dezimalformat ausgegeben werden.
Die Ausgabe muss ein angemessenes Trennzeichen zwischen den Zahlen enthalten (nachstehendes Trennzeichen zulässig, jedoch nicht führend).
Zeilenvorschub (
\n
), Register (\t
), Raum,,
,.
,;
,|
,-
,_
,/
ist durchaus sinnvoll Separator. Ich mag keine zusätzlichen Leerzeichen für hübsches Drucken, benutze aber keine Buchstaben oder Ziffern als Trennzeichen.- Die Zahlen und Separatoren können durch umgeben sein
[ ]
,{ }
oder jede Anordnung oder Liste Notation. - Drucken Sie nichts anderes, als oben angegeben.
Bonus
Multiplizieren Sie Ihre Punktzahl mit 0,5 wenn Ihre Lösung die Zahl im Handumdrehen erzeugen kann. Der Sinn dieses Bonus ist, dass, wenn Sie Ihre Drucklösung direkt in einen Generator umwandeln, der Generator nur höchstens O (n) Speicher verwendet, wobei n die oben definierte Anzahl von Bits ist. (Sie müssen Ihre Lösung nicht unbedingt auf Generator umstellen). Beachten Sie, dass, während ich n <= 28 auferlege, der zum Speichern aller Zahlen benötigte Speicher immer noch exponentiell wächst und eine naive Sortierlösung mindestens 4 GB Speicher bei n = 28 belegen würde.
Bitte erläutern Sie kurz, wie Ihre Lösung funktioniert, bevor Sie diesen Bonus in Anspruch nehmen.
Antworten:
Pyth, 9 Bytes
o
Durch dies
um der Basis 2 liegende Darstellung (jN2
) über den Bereich (U
) von2 ^ Q
.(
Q
=eval(input())
).Probieren Sie es hier aus.
quelle
Python 2, 75 * 0,5 = 37,5
v
Mit diesem Bit-Twiddling-Algorithmus wird wiederholt der nächsthöhere Wert mit demselben POPCOUNT generiert .Tatsächlich stellte sich heraus, dass es einfacher war, sie in abnehmender Popanzahl zu generieren und dann das Komplement auszudrucken, um es zu vergrößern. Auf diese Weise entfernen wir bei
v
Überläufen2**n
einfach alle bis aufn
Bits mit&N
whereN=2**n-1
, und das ergibt die kleinste Popcount-Nummer, die um eins niedriger ist. Auf diese Weise können wir nur eine Schleife machen. Es gibt wahrscheinlich eine bessere Lösung, die mit demselben POPCOUNT direkt die nächstniedrigere Nummer findet.Aufgrund eines Zaunpfostenproblems müssen wir mit beginnen
v=2**(n+1)-1
, dass die Operationv=N-1
in der ersten Schleife ausgeführt wird.Ausgabe für
4
:quelle
console.log()
vsprint
) fast das gleiche Ergebnis . Vielleicht ist der Bittrick zu schwer.v=N-~N
J, 19 Zeichen, kein Bonus.
2 ^ y
- Zwei hochy
.i. 2 ^ y
- die ganzen Zahlen von0
bis(2 ^ y) - 1
.#: i. 2 ^ y
- jede dieser ganzen Zahlen in der Basis zwei dargestellt.+/"1 #: i. 2 ^ y
- die Beträge jeder Vertretung(i. 2 ^ y) /: +/"1 #: i. 2 ^ y
- der Vektori. 2 ^ y
sortiert nach der Reihenfolge der Elemente des vorherigen Vektors, unserer Antwort.quelle
Python, 63 Zeichen
quelle
C 179 * 0,5 = 89,5
EDIT: 157 * 0,5 = 78,5
EDIT: 132 * 0,5 = 66
oder etwas besser formatiert:
Was es macht?
berechnet die letzte anzuzeigende Zahl (pow (2, n) - 1)
Die äußere Schleife durchläuft die Anzahl der Bits (also 0 bis n-1), während die innere Schleife nur von 0 bis m zählt
Auf x86 gibt es den POPCNT-Befehl, mit dem die gesetzten Bits gezählt werden können. GCC und kompatible Compiler unterstützen möglicherweise die Funktion __builtin_popcount, die im Wesentlichen für diese Anweisung kompiliert wird.
quelle
CJam, 13 Bytes
Ziemlich einfache Implementierung.
Wie es funktioniert :
Probieren Sie es hier online aus
quelle
Mathematica,
5046.
quelle
JavaScript (ES6) 41 (82 * 0,5)
Der einfachste Weg, Golf zu spielen
Ungolfed
Test In der Firefox / FireBug-Konsole
quelle
Bash + Coreutils, 66
Eines, um Ihnen den Einstieg zu erleichtern:
quelle
sort
lange. Mit n = 28sort
müssen 2 ^ 28 Zeilen / ~ 13 GB Daten sortiert werden.Haskell, (87 × 0,5) = 43,5
Verwendungsbeispiel:,
f 4
welches ausgibt[0,1,2,4,8,3,5,9,6,10,12,7,11,13,14,15]
So funktioniert es: Weder sortieren noch wiederholt über [0..2 ^ n-1] iterieren und nach Zahlen suchen, die i 1s enthalten.
Die
#
Hilfsfunktionen akzeptieren zwei Parametera
undb
erstellen eine Liste aller Zahlen, die ausa
Einsen undb
Nullen bestehen. Die Hauptfunktionf
verlangt#
nach jeder Kombination vona
undb
woa+b
gleich istn
, beginnend mit einer 1 und einern
0, um die Zahlen in der richtigen Reihenfolge zu haben. Dank Haskells Faulheit müssen all diese Listen nicht vollständig im Speicher erstellt werden.quelle
++
ina#b
bedeutet , dass die linke Seite (die groß sein könnte) hergestellt werden muss vollständig und dann kopiert , bevor das erste Element in der Folge erzeugt wird, damit die Anforderungen für den Bonus zu verletzen?Ruby 47 Zeichen
Ähnlich wie beim Python von @KeithRandall:
quelle
Mathematica, 26
Beispiel:
quelle
Perl, 64/2 = 32
Einfach
[0..2^n-1]
n + 1
mal über den Bereich iterieren . In jeder Iteration werden nur die Zahlen ausgegeben, deren Anzahl von 1 Bit der Iterationsvariablen ($i
) entspricht. Bits werden durch Zählen von1
s (y/1//
) in der Zahl gezählt, die mit in eine Binärzeichenfolge umgewandelt wurdesprintf
.Teste mich .
Perl, 63
Sortieransatz:
quelle
Java 8, 205
quelle
C ++ 11, 117 Zeichen:
Ungolfed:
Erläuterung:
Erstellen Sie eine Reihe von int, int-Paaren. Das erste int ist die Anzahl der Bits, das zweite int ist die Anzahl. Paare vergleichen sich nach ihrem ersten Parameter, sodass die Menge nach der Anzahl der Bits sortiert wird.
quelle