Eine Walsh-Matrix ist eine spezielle Art von Quadratmatrix mit Anwendungen im Quanten-Computing (und wahrscheinlich auch anderswo, aber ich kümmere mich nur um das Quanten-Computing).
Eigenschaften von Walsh-Matrizen
Die Abmessungen sind die gleiche Potenz von 2 Deshalb haben wir auf diese Matrizen durch Zweier-Exponenten hier beziehen können, rufen sie W(0)
, W(1)
, W(2)
...
W(0)
ist definiert als [[1]]
.
Für n>0
, W(n)
wie folgt aussieht:
[[W(n-1) W(n-1)]
[W(n-1) -W(n-1)]]
So W(1)
ist es auch:
[[1 1]
[1 -1]]
Und W(2)
ist:
[[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
Das Muster geht weiter ...
Deine Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die als Eingabe eine Ganzzahl verwendet n
und W(n)
in einem beliebigen Format ausgibt bzw. zurückgibt . Dies kann ein Array von Arrays sein, ein abgeflachtes Array von Booleschen Werten, ein .svg
Bild, wie Sie es nennen, solange es korrekt ist.
Standardlücken sind verboten.
Ein paar Dinge:
Denn W(0)
das 1
muss nicht einmal gewickelt werden. Es kann eine ganze Zahl sein.
Es ist Ihnen gestattet, die Ergebnisse mit einem Index W(1)
zu versehen [[1]]
.
Testfälle
0 -> [[1]]
1 -> [[1 1]
[1 -1]]
2 -> [[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
3 -> [[1 1 1 1 1 1 1 1]
[1 -1 1 -1 1 -1 1 -1]
[1 1 -1 -1 1 1 -1 -1]
[1 -1 -1 1 1 -1 -1 1]
[1 1 1 1 -1 -1 -1 -1]
[1 -1 1 -1 -1 1 -1 1]
[1 1 -1 -1 -1 -1 1 1]
[1 -1 -1 1 -1 1 1 -1]]
8 ->
Pastebin
Das ist Code-Golf , also gewinnt die kürzeste Lösung in jeder Sprache! Viel Spaß beim Golfen!
W(1)
kehrt zurück[[1]]
,W(2)
kehrt zurück[[1,1],[1,-1]
...)Antworten:
Perl 6 ,
634440 BytesProbieren Sie es online!
Nicht-rekursiver Ansatz, der die Tatsache ausnutzt, dass der Wert bei den Koordinaten x, y ist
(-1)**popcount(x&y)
. Gibt ein abgeflachtes Array von Booleschen Werten zurück.-4 Bytes dank xnor ‚s - Bit - Parität Trick .
quelle
MATL , 4 Bytes
Probieren Sie es online!
Wie es funktioniert:
Ohne den eingebauten: 11 Bytes
Probieren Sie es online!
Wie es funktioniert :
Für jede Walsh-Matrix W wird die nächste Matrix berechnet als [ W W ; W - W ], wie in der Challenge beschrieben. Der Code macht das
n
mal, ausgehend von der 1 × 1-Matrix [1].quelle
kron
. ;)Haskell ,
5756 BytesProbieren Sie es online! Dies implementiert die angegebene rekursive Konstruktion.
-1 Byte danke an Ørjan Johansen !
quelle
(iterate(\m->zipWith(++)(m++m)$m++(map(0-)<$>m))[[1]]!!)
.Oktave mit eingebauten,
1817 BytesProbieren Sie es online!
Oktave ohne eingebauten,
56 5147 BytesProbieren Sie es online! Danke an @Luis Mendo für -4.
Oktave mit rekursivem Lambda,
54 53 5248 BytesProbieren Sie es online! Dank dieser Antwort und dieser Frage zur Inspiration.
quelle
end
nicht benötigt. Sie können es also in den Header von TIO verschieben und damit aus der Byteanzahl entfernenAPL (Dyalog Unicode) , 12 Byte
Probieren Sie es online!
Die Ausgabe ist ein zweidimensionales Array.
quelle
Python 2 ,
7571 BytesProbieren Sie es online!
Die Walsh-Matrix scheint mit den bösen Zahlen verwandt zu sein. Wenn
x&y
(bitweise und 0 basierte Koordinaten) ein Übel Zahl ist, ist der Wert in der Matrix1
,-1
für odious Zahlen. Die Bitparitätsberechnungint(bin(n),13)%2
stammt aus Noodle9s Kommentar zu dieser Antwort .quelle
x&y
, um zu bestimmen, wie oft das Vorzeichen umgedreht werden soll.R ,
61565350 BytesProbieren Sie es online!
Berechnet rekursiv die Matrix nach Kronecker-Produkt und gibt 1 für den
n=0
Fall zurück (danke an Giuseppe für den Hinweis und auch an JAD für die Unterstützung beim Golfen der ursprünglichen Version).Nochmals zusätzliche -3 Bytes dank Giuseppe.
quelle
1
anstattmatrix(1)
gültig zu sein, aber wenn dies der Fall ist, können Sie Golf spielen und es gibt auch einen 61-Byte-Reduce
Ansatz: Probieren Sie es aus!n=0
Groß- und Kleinschreibung betrifft, die meisten anderen Antworten schreiben es in [[1]], aber nicht alle ...matrix(1)
mitt(1)
.1-2*!3:0
ist kürzer alsc(1,1,1,-1)
drei Bytes.Jelly , 14 Bytes
Probieren Sie es online!
Ändern Sie das
G
inŒṘ
in der Fußzeile, um die tatsächliche Ausgabe anzuzeigen.quelle
JavaScript (ES6), 77 Byte
Die naive Berechnung beginnt , indem sie
0 <= X, Y <= 2**N
inW[N]
. Der einfache Fall ist, wenn entwederX
oderY
kleiner ist als2**(N-1)
, in welchem Fall wir aufX%2**(N-1)
und zurückgreifenY%2**(N-1)
. Im Fall der beidenX
undY
wobei zumindest2**(N-1)
der rekursive Aufruf muss negiert werden.Wenn anstatt zu vergleichen
X
oderY
weniger als2**(N-1)
eine Bitmaske verwendetX&Y&2**(N-1)
wird, ist diese ungleich Null, wenn der rekursive Aufruf negiert werden muss, und Null, wenn dies nicht der Fall ist. Dies vermeidet auch, dass Modulo reduziert werden muss2**(N-1)
.Die Bits können natürlich in umgekehrter Reihenfolge für das gleiche Ergebnis getestet werden. Anstatt die Bitmaske jedes Mal zu verdoppeln, wenn wir sie koordinieren, kann sie stattdessen halbiert werden, wodurch die Ergebnisse XOR-verknüpft werden können, wobei ein Endergebnis von
0
keine Negation und1
Negation bedeutet.quelle
Pari / GP , 41 Bytes
Probieren Sie es online!
quelle
K (ngn / k) , 18 Bytes
Probieren Sie es online!
quelle
05AB1E , 16 Bytes
Probieren Sie es online!
Erläuterung
Ich wünschte, ich wüsste einen kürzeren Weg, um das Hamming-Gewicht zu berechnen.
1δ¢˜
ist die gleiche Länge wie0м€g
.quelle
Schale , 13 Bytes
Probieren Sie es online!
1-indiziert.
Erläuterung
quelle
JavaScript (Node.js) ,
1008979 BytesProbieren Sie es online!
quelle
Python 2 ,
8079 BytesProbieren Sie es online!
quelle
0**n*[[1]]
für -1 BytePython 2 , 49 Bytes
Darstellung einiger Ansätze unter Verwendung zusätzlicher Bibliotheken. Dieser stützt sich auf einen in Scipy eingebauten:
Probieren Sie es online!
Python 2 , 65 Bytes
Und dieser verwendet nur Numpy und löst nach Kronecker-Produkt, analog zu meiner R-Antwort :
Probieren Sie es online!
quelle
Stax , 20 Bytes
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
Ich dachte, ich würde meine eigene Herausforderung nach einiger Zeit versuchen. Nicht rekursiver Ansatz. Nicht zu konkurrenzfähig gegen andere Golfsprachen ...
Entpackt (24 Bytes) und Erklärung
quelle