Eine variable Anzahl von Bits ist ein Array von 0 oder mehr Bits. So [0, 1]
ist eine variable Anzahl von Bits, aber so ist []
.
Schreiben Sie eine Funktion oder ein Programm, das bei einer nichtnegativen Ganzzahl eine variable Anzahl von Bits zurückgibt, sodass jede Ganzzahl eine Eins-zu-Eins-Zuordnung (bijektiv) mit einem Array aufweist.
Es gibt unendlich viele solcher Zuordnungen. Sie können eine nach Belieben erstellen , aber es muss eins zu eins sein. Ihre Zuordnung muss für eine Ganzzahl beliebiger Größe konzeptionell eins zu eins sein. Es ist jedoch in Ordnung, wenn Ihre Implementierung für große Ganzzahlen aufgrund numerischer Typgrenzen in Ihrer bevorzugten Sprache (z int
. B. Cs ) fehlschlägt .
Als ein Beispiel von dem, was nicht eine Abbildung einer Eins-zu-eins, die Auflistung ist einfach die binären Ziffern der ganzen Zahl. In einem solchen System wird 5 [1, 0, 1]
(oder 0b101
), aber es ist nicht eins zu eins, weil 0b0101
oder [0, 1, 0, 1]
bedeutet auch 5.
Es sollte ziemlich offensichtlich sein, dass eine Zuordnung nicht eins zu eins ist, wenn eine Ganzzahl übersprungen wird (z. B. funktioniert sie nicht für 5), aber ich möchte klarstellen, dass das Überspringen eines variablen Bitarrays auch keine ist -zu eins. Sie müssen jedem möglichen variablen Bitarray zuordnen, einschließlich []
.
Der kürzeste Code in Bytes gewinnt.
Antworten:
Gelee, 3 Bytes
Gleiche Idee wie xnor: Karten
0 1 2 3 4 ...
zu[] [0] [1] [0 0] [0 1] ...
; Der Code ist im Grundeincrement → binary → remove first
.Probieren Sie es online aus .
quelle
Python, 20 Bytes
Prüfung:
Wenn Sie dies tun, wird
lambda n:bin(n+1)[3:]
die Eingabe inkrementiert und dann die Binärdarstellung mit dem ersten entfernten Symbol verwendet ([3:]
da das Präfix aus0b
zwei Zeichen besteht). Da jede positive Zahl mit 1 in binär beginnt, ergibt dies eindeutig eine binäre Darstellung.Ein Byte wird gespeichert, indem stattdessen das Bitkomplement verwendet wird
~n
, um die Negation zu erhalten-(n+1)
, und das negative Vorzeichen entfernt wird, indem ein weiteres Symbol abgeschnitten wird.quelle
lambda s:int('1'+s,2)-1
.Pyth, 5 Bytes
Einfach eine Übersetzung von xnors Antwort in Pyth.
Q
is eval () 'd input (),h
erhöht es,.B
konvertiert es in eine binäre Zeichenfolge undt
nimmt den "Schwanz" (der alles außer dem ersten Zeichen ist).quelle
Haskell,
41383029 BytesAnwendungsbeispiel:
(l!!) 4
->"10"
.Beginnen Sie mit der leeren Liste als erstem Element, gehen Sie träge durch die Liste und hängen Sie das aktuelle Element mit
0
und mit1
davor an.Bearbeiten: @xnor hat
311 Bytes gespeichert . Vielen Dank!quelle
[(0:),(1:)]<*>
<*>
Trick schon einmal gezeigt, aber ich habe ihn vergessen. Danke noch einmal!l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
.[b:x|x<-l,b<-"01"]
mit einem Produkt oder einer Concat-Map auszudrücken, aber der Produktausdruck wird(:)<$>[0,1]<*>l
in der falschen Reihenfolge angezeigt, wobei zunächst 0 vor alles gestellt wird und niemals 1 erreicht wird, da die Liste unendlich ist. Hast du eine Idee?JavaScript (ES6), 29 Byte
Gleiche Idee wie xnor.
quelle
Jolf, 4 Bytes
Probieren Sie es hier aus!
Sehr einfache Strategie, zufällig auch die kürzeste.
quelle
Haskell, 35 Bytes
In Haskell ist keine Binärdatei integriert, daher erfolgt die (umgekehrte) Konvertierung manuell. Um die anfängliche 1 zu entfernen, wurde der Basisfall
1
in die leere Liste umgewandelt.Bearbeiten: Sparte ein Byte durch Konjugieren mit dem
+1
.quelle
C 40 Bytes
Konvertiert die Eingabe wie die anderen Antworten in die bijektive Basis 2 (mit Symbolen
0
und1
).ideone es!
quelle