Ihr Ziel ist es, eine Funktion oder ein Programm zu erstellen, um die Bits in einem Bereich von Ganzzahlen mit einer Ganzzahl n umzukehren . Mit anderen Worten, Sie möchten die Bit-Umkehr-Permutation eines Bereichs von 2 n Elementen mit einem Index von Null ermitteln. Dies ist auch die OEIS-Sequenz A030109 . Dieser Prozess wird häufig bei der Berechnung schneller Fouriertransformationen verwendet, beispielsweise beim direkten Cooley-Tukey-Algorithmus für FFT. Es gibt auch eine Herausforderung für die Berechnung der FFT für Sequenzen, bei denen die Länge eine Potenz von 2 ist.
Bei diesem Vorgang müssen Sie den Bereich [0, 2 n -1] durchlaufen und jeden Wert in einen Binärwert umwandeln und die Bits in diesem Wert umkehren. Sie behandeln jeden Wert als eine n- stellige Zahl in Basis 2, was bedeutet, dass die Umkehrung nur zwischen den letzten n Bits erfolgt.
Wenn beispielsweise n = 3 ist, ist der Bereich von ganzen Zahlen [0, 1, 2, 3, 4, 5, 6, 7]
. Diese sind
i Regular Bit-Reversed j
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
wobei jeder Index i unter Verwendung von Bitumkehrung in einen Index j umgewandelt wird . Dies bedeutet, dass die Ausgabe ist [0, 4, 2, 6, 1, 5, 3, 7]
.
Die Ausgaben für n von 0 bis 4 sind
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Möglicherweise haben Sie eine Musterbildung bemerkt. Mit n können Sie die vorherige Folge für n -1 nehmen und verdoppeln. Verknüpfen Sie dann diese Doppelliste mit derselben Doppelliste, aber inkrementiert um eins. Zeigen,
[0, 2, 1, 3] * 2 = [0, 4, 2, 6]
[0, 4, 2, 6] + 1 = [1, 5, 3, 7]
[0, 4, 2, 6] ⊕ [1, 5, 3, 7] = [0, 4, 2, 6, 1, 5, 3, 7]
wo ⊕
darstellt Verkettung.
Sie können eine der beiden oben genannten Methoden verwenden, um Ihre Lösung zu bilden. Wenn Sie einen besseren Weg kennen, können Sie diesen auch nutzen. Jede Methode ist in Ordnung, solange sie die richtigen Ergebnisse liefert.
Regeln
- Das ist Code-Golf, also gewinnt die kürzeste Lösung.
- Builtins, die diese Herausforderung als Ganzes lösen, und Builtins, die die Bitumkehr eines Werts berechnen, sind nicht zulässig. Dies schließt keine eingebauten Funktionen ein, die Binärkonvertierungen oder andere bitweise Operationen ausführen.
- Ihre Lösung muss mindestens für n von 0 bis 31 gültig sein .
IntegerReverse[Range[2^#]-1,2,#]&
. (Ich weiß nicht, warum Mathematica das eingebaute braucht, aber ich denke, es ist nicht viel seltsamer alsSunset
...)0
statt[0]
oder ist es eine Liste sein müssen?Antworten:
Gelee ,
76 BytesVielen Dank an @EriktheOutgolfer für das Abschlagen von 1 Byte!
Probieren Sie es online!
Wie es funktioniert
quelle
05AB1E , 8 Bytes
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
0)ïsF·D>«
war zwar nah. Hatte einige Probleme mit der '0'.¾
. Ich muss mich an diesen Trick erinnern.MATL,
13121098 BytesProbieren Sie es online
Erläuterung
Der Vollständigkeit halber war hier meine alte Antwort unter Verwendung des nicht-rekursiven Ansatzes (9 Bytes).
Probieren Sie es online
Erläuterung
quelle
J,
1511 BytesEs gibt eine Alternative für 15 Bytes , die eine direkte binäre Konvertierung und Umkehrung verwendet.
Verwendung
Erläuterung
quelle
Gelee , 5 Bytes
Probieren Sie es online!
-1 danke an Dennis .
quelle
Haskell ,
4037 BytesProbieren Sie es online!
Danke an @Laikoni für drei Bytes!
quelle
Oktave, 37 Bytes
Erstellt eine anonyme Funktion mit dem Namen
ans
, die einfach mit aufgerufen werden kannans(n)
.Online Demo
quelle
Python 2,
565554 BytesTeste es auf Ideone .
Vielen Dank an @xnor für das Golfen ab 1 Byte!
quelle
[0][n:]or
.Java,
422419 Bytes:Nun, ich habe endlich Java für meine zweite Programmiersprache gelernt, also wollte ich meine neuen Fähigkeiten nutzen, um eine einfache Herausforderung zu meistern, und obwohl es sich als sehr lang herausstellte , bin ich nicht enttäuscht. Ich bin nur froh, dass ich eine einfache Herausforderung in Java bewältigen konnte.
Probieren Sie es online! (Ideone)
quelle
Mathematica,
5633 BytesDie Byteanzahl setzt eine ISO 8859-1-codierte Quelle voraus.
Dies verwendet die rekursive Definition, um einen unären Operator zu definieren
±
.quelle
Perl,
4645 BytesBeinhaltet +1 für
-p
Geben Sie die Eingangsnummer für STDIN ein
quelle
Pyth - 11 Bytes
Test Suite .
quelle
Javascript ES6,
655351 BytesVerwendet den rekursiven Double-Increment-Concat-Algorithmus.
Beispiel läuft:
quelle
f=n=>n>0?(r=f(n-1).map(i=>i*2)).concat(r.map(i=>i+1)):[0]
?n==1
, danke.f=(n,m=1)=>n?[...n=f(n-1,m+m),...n.map(i=>i+m)]:[0]
Python 3,
6759 BytesVielen Dank an @Dennis für -8 Bytes
Wir können auch eine (modifizierte) einfache Implementierung in Python haben, auch wenn dies ziemlich lang ist.
Eine anonyme Funktion, die Eingaben von Argumenten akzeptiert und die bitumgekehrte Permutation als Liste zurückgibt.
Wie es funktioniert
Probieren Sie es auf Ideone
quelle
Dyalog APL , 12 Bytes
Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist.2⊥
from-base-2 von⊖
das drehte sich um2⊥⍣¯1
Inverse von from-base-2 von⍳
die ersten n ganzen Zahlen, wobei n ist2*
2 hoch⎕
numerische EingabeTryAPL online!
Zum Vergleich ist hier die andere Methode:
(
der Funktionszug ...2∘×
zweimal (das Argument),
verkettet an1+
eins plus2∘×
zweimal (das Argument))⍣
angewendet so oft wie von angegeben⎕
numerische Eingabe⊢
auf0
Nullquelle
(⍋,⍨)⍣⎕⊢0
(⎕io←0
)K (ngn / k) ,
118 BytesProbieren Sie es online!
&
ist das letzte Verb in der Komposition, also müssen wir:
es zwingen, monadisch zu seinquelle
Julia,
2322 BytesEher unkomplizierte Umsetzung des in der Challenge-Spezifikation beschriebenen Prozesses.
Probieren Sie es online!
quelle
Pyth, 8 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
Clojure, 78 Bytes
Nur nach der Spezifikation ...
quelle
Ruby, 57 Bytes:
quelle
PHP, 57 Bytes
Nimmt Eingaben vom Befehlszeilenparameter entgegen und gibt durch Unterstriche getrennte Werte aus. Laufen Sie mit
-nr
.rekursive Lösung, 72 Bytes
Funktion nimmt Ganzzahl, gibt Array zurück
quelle
Ruby , 51 Bytes
Probieren Sie es online!
quelle
Perl 6 , 42 Bytes
Probieren Sie es online!
Durch Inkrementieren einer Ganzzahl wird einfach eine Folge von niedrigstwertigen Bits, beispielsweise von
xxxx0111
bis, umgedrehtxxxx1000
. So kann der nächste bitumgekehrte Index aus dem vorhergehenden durch Umdrehen einer Folge von höchstwertigen Bits erhalten werden. Die XOR-Maske kann mitm - (m >> (ctz(i) + 1))
form = 2**n
oder berechnet werdenm = 2**n-1
.Perl 6 , 30 Bytes
Probieren Sie es online!
Rekursiver Ansatz.
quelle
JavaScript (Firefox 30-57), 48 Byte
Port von @ Dennis ♦ 's Python 2-Lösung.
quelle
Japt ,
1413 BytesProbieren Sie es online!
Ausgepackt und wie es funktioniert
Einfache Implementierung.
quelle
n2
:Í
APL (Dyalog Classic) , 9 Bytes
Probieren Sie es online!
⎕
ausgewertete Eingabe(
)⍣⎕⊢0
wende das Ding so(
)
oft an, beginnend mit0
,⍨
verketten das aktuelle Ergebnis mit sich selbst⍋
Indizes einer sortier aufsteigenden Permutationquelle
x86, 31 Bytes
Nimmt ein ausreichend großes
int[] buffer
ineax
und n inecx
und gibt den Puffer in zurückeax
.Implementiert den in der Challenge-Anweisung angegebenen Verkettungsalgorithmus. Es kann möglich sein, Bytes zu speichern, indem die Zeiger um 4 erhöht werden, anstatt Array-Zugriffe direkt zu verwenden, aber
lea
/mov
ist bereits ziemlich kurz (3 Bytes für 3 Register und ein Multiplikator).Hexdump:
quelle