Walsh matryca jest specjalny rodzaj macierzy kwadratowej z aplikacji Quantum computing (i zapewne gdzie indziej, ale zależy mi tylko o quantum computing).
Właściwości macierzy Walsha
Wymiary są takie same moc 2. Dlatego, możemy odnieść się do tych matryc o dwa za wykładnik tutaj, nazywając je W(0)
, W(1)
, W(2)
...
W(0)
jest zdefiniowany jako [[1]]
.
Dla n>0
, W(n)
wygląda następująco:
[[W(n-1) W(n-1)]
[W(n-1) -W(n-1)]]
Tak W(1)
jest:
[[1 1]
[1 -1]]
I W(2)
jest:
[[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
Wzór trwa ...
Twoje zadanie
Napisz program lub funkcję, która przyjmuje jako liczbę całkowitą n
i drukuje / zwraca W(n)
w dowolnym dogodnym formacie. Może to być tablica tablic, spłaszczona tablica booleanów, .svg
obraz, nazywasz go, o ile jest poprawny.
Standardowe luki są zabronione.
Kilka rzeczy:
Dla W(0)
The 1
nie muszą być owinięte jeszcze raz. Może to być zwykła liczba całkowita.
Masz prawo do 1-indeksu wyników - W(1)
byłoby [[1]]
.
Przypadki testowe
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
To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie w każdym języku! Miłej gry w golfa!
W(1)
zwraca[[1]]
,W(2)
zwraca[[1,1],[1,-1]
...)Odpowiedzi:
Perl 6 ,
634440 bajtówWypróbuj online!
Podejście nierekurencyjne, wykorzystujące fakt, że wartość przy współrzędnych x, y wynosi
(-1)**popcount(x&y)
. Zwraca spłaszczoną tablicę wartości logicznych.-4 bajty dzięki XNOR jest bit parzystości podstęp .
źródło
MATL , 4 bajty
Wypróbuj online!
Jak to działa:
Bez wbudowanego: 11 bajtów
Wypróbuj online!
Jak to działa :
Dla każdej macierzy Walsha W następną macierz oblicza się jako [ W W ; W - W ], jak opisano w wyzwaniu. Kod robi to tyle
n
razy, zaczynając od macierzy 1 × 1 [1].źródło
kron
. ;)Haskell ,
5756 bajtówWypróbuj online! To implementuje daną konstrukcję rekurencyjną.
-1 bajt dzięki Ørjan Johansen !
źródło
(iterate(\m->zipWith(++)(m++m)$m++(map(0-)<$>m))[[1]]!!)
.Oktawa z wbudowanym
1817 bajtamiWypróbuj online!
Oktawa bez wbudowanego,
56 5147 bajtówWypróbuj online! Dzięki @Luis Mendo za -4.
Oktawa z rekurencyjną lambda,
54 53 5248 bajtówWypróbuj online! Dzięki tej odpowiedzi i temu pytaniu o inspirację.
źródło
end
nie jest potrzebny. Możesz więc przenieść go do nagłówka TIO, a tym samym usunąć go z liczby bajtówAPL (Dyalog Unicode) , 12 bajtów
Wypróbuj online!
Dane wyjściowe to tablica dwuwymiarowa.
źródło
Python 2 ,
7571 bajtówWypróbuj online!
Matryca Walsha wydaje się być związana ze złymi liczbami. Jeśli
x&y
(bitowe oraz współrzędne w oparciu o 0) jest liczbą zła wartość w matrycy1
,-1
dla liczb odrażających. Obliczenie parzystości bitowejint(bin(n),13)%2
pochodzi z komentarza Noodle9 do tej odpowiedzi .źródło
x&y
aby określić, ile razy należy odwrócić znak.R ,
61565350 bajtówWypróbuj online!
Rekurencyjnie oblicza macierz według produktu Kronecker i zwraca 1 dla
n=0
przypadku (podziękowania dla Giuseppe za wskazanie tego, a także dla JAD za pomoc w golfa w początkowej wersji).Dodatkowe -3 bajty ponownie dzięki Giuseppe.
źródło
1
aniżelimatrix(1)
jest ważny, ale jeśli jest to możliwe golf to w dół, a tam 61 bajtówReduce
podejście, a także: spróbuj!n=0
przypadku, większość innych odpowiedzi otacza go [[1]], ale nie wszystkie ...matrix(1)
zt(1)
.1-2*!3:0
jest krótszy niżc(1,1,1,-1)
o trzy bajty.Galaretka , 14 bajtów
Wypróbuj online!
Zmienić
G
sięŒṘ
w stopce, aby zobaczyć rzeczywistą wydajność.źródło
JavaScript (ES6), 77 bajtów
Naiwny obliczanie rozpoczyna się od podejmowania
0 <= X, Y <= 2**N
wW[N]
. Prostym przypadkiem jest, gdy albo jestX
alboY
mniej niż2**(N-1)
, w którym to przypadku powracamy doX%2**(N-1)
iY%2**(N-1)
. W przypadku obuX
iY
bycia przynajmniej2**(N-1)
rekursywne połączenie musi być zanegowane.Jeśli zamiast porównywania
X
lubY
mniej niż2**(N-1)
maska bitowaX&Y&2**(N-1)
jest brana, jest to niezerowe, gdy wywołanie rekurencyjne musi być zanegowane i zero, gdy nie jest. Pozwala to również uniknąć konieczności zmniejszania modulo2**(N-1)
.Bity można oczywiście testować w odwrotnej kolejności, aby uzyskać ten sam wynik. Następnie zamiast podwajać maskę bitową za każdym razem, gdy współrzędne są współrzędne, można zamiast tego zmniejszyć o połowę, co pozwala na XOR, a końcowy wynik
0
oznacza brak negacji i1
oznacza negację.źródło
Pari / GP , 41 bajtów
Wypróbuj online!
źródło
K (ngn / k) , 18 bajtów
Wypróbuj online!
źródło
05AB1E , 16 bajtów
Wypróbuj online!
Wyjaśnienie
Chciałbym znać krótszy sposób obliczania wagi Hamminga.
1δ¢˜
ma taką samą długość jak0м€g
.źródło
Łuska , 13 bajtów
Wypróbuj online!
1-indeksowany.
Wyjaśnienie
źródło
JavaScript (Node.js) ,
1008979 bajtówWypróbuj online!
źródło
Python 2 ,
8079 bajtówWypróbuj online!
źródło
0**n*[[1]]
dla -1 bajtówPython 2 , 49 bajtów
Prezentacja kilku podejść przy użyciu dodatkowych bibliotek. Ten opiera się na wbudowanym w Scipy:
Wypróbuj online!
Python 2 , 65 bajtów
A ten używa tylko Numpy i rozwiązuje produkt Kronecker, analogicznie do mojej odpowiedzi R :
Wypróbuj online!
źródło
Stax , 20 bajtów
Uruchom i debuguj na staxlang.xyz!
Pomyślałem, że po pewnym czasie spróbuję własnego wyzwania. Podejście nierekurencyjne. Niezbyt konkurencyjny w stosunku do innych języków golfowych ...
Rozpakowano (24 bajty) i wyjaśnienie
źródło