Wyznacznik macierzy 2 na 2
a b
c d
jest podane przez ad - bc
.
Biorąc pod uwagę macierz cyfr o wymiarach 2 n na 2 n , n ≥ 1, wyprowadzaj wynik uzyskany przez rekurencyjne obliczanie wyznacznika każdego podbloku 2 na 2, aż osiągniemy pojedynczą liczbę.
Na przykład biorąc pod uwagę dane wejściowe
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
Po jednym kroku uzyskujemy:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
I powtarzając raz jeszcze, otrzymujemy:
(22*-57 - 22*8) = -1430
Stąd wynik powinien być -1430
.
Zasady
- Elementami macierzy będą zawsze jednocyfrowe liczby całkowite, tj. Od 0 do 9.
- Możesz wprowadzać dane w dowolnym dogodnym formacie listy lub ciągu, o ile dane wstępne nie są przetwarzane. Ponieważ macierz jest zawsze kwadratowa, możesz wziąć dane wejściowe jako pojedynczą listę 1D zamiast listy 2D, jeśli chcesz.
- Dane wejściowe mogą być wprowadzane za pomocą funkcji wejściowej, STDIN, argumentu wiersza poleceń lub najbliższej alternatywy.
- Wyjście powinno być pojedynczą liczbą całkowitą funkcji wyjścia, STDOUT lub najbliższą alternatywą. Nie można wyprowadzać pojedynczej liczby całkowitej z listy lub macierzy.
- Możesz użyć wbudowanych metod wyznaczania i manipulacji macierzą, jeśli Twój język je obsługuje.
- Twój algorytm musi działać teoretycznie dla każdego ważnego wejścia.
- Standard zasady gry w golfa .
Przypadki testowe
Następujące przypadki testowe są podane jako listy w stylu Python:
[[1,0],[0,1]] -> 1
[[1,9],[8,4]] -> -68
[[0,1,2,3],[4,5,6,7],[8,9,0,1],[2,3,4,5]] -> 40
[[3,1,4,1],[5,9,2,6],[5,3,5,8],[9,7,9,3]] -> -1430
[[9,0,0,9],[0,9,9,0],[9,0,9,0],[0,9,0,9]] -> 13122
[[1,0,0,0,0,0,0,0],[2,1,0,0,0,0,0,0],[3,2,1,0,0,0,0,0],[4,3,2,1,0,0,0,0],[5,4,3,2,1,0,0,0],[6,5,4,3,2,1,0,0],[7,6,5,4,3,2,1,0],[8,7,6,5,4,3,2,1]] -> 1
[[7,1,0,5,8,0,1,5],[9,9,6,6,1,2,4,8],[4,8,7,3,8,7,4,7],[4,6,1,9,7,0,1,7],[7,6,7,1,9,4,1,6],[8,0,0,8,5,5,9,9],[4,6,4,8,9,4,8,6],[9,0,8,7,6,2,1,5]] -> 2937504
[[1,2,3,4,5,6,7,8],[2,3,4,5,6,7,8,1],[3,4,5,6,7,8,1,2],[4,5,6,7,8,1,2,3],[5,6,7,8,1,2,3,4],[6,7,8,1,2,3,4,5],[7,8,1,2,3,4,5,6],[8,1,2,3,4,5,6,7]] -> -10549504
[[1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,1,0,1,1,1,1,1,1,0],[1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,0,0,1,1,1,1,1,0,1],[1,0,1,0,1,1,1,0,0,1,1,1,1,0,1,0],[0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0],[1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1],[1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1],[1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1],[0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1],[1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,0],[1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,0,1,0,0,1,0,1,0,1,1,1,1,1,0,1],[1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1]] -> -8
(Podziękowania dla @ MartinBüttner za pomoc w tym wyzwaniu)
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
. Pełna wyznacznik wynosi zero, ponieważ ma dwa identyczne wiersze. Jest to zatem pojedyncza (czyli nieodwracalna) matryca 4 × 4, więc nie jest liczona przez A055165. Jednak omawiana tutaj determinantem „rekurencyjnym” jest1*1-1*0==1
. W przeciwnym kierunku macierz[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
ma wyznacznik „rekurencyjny”0*0-0*0==0
. Jednak jego pełny wyznacznik musi być niezerowy, ponieważ jego wiersze są tylko wierszami macierzy tożsamości w innej kolejności; i jest liczony przez A055165.Odpowiedzi:
J,
2125 bajtówStosowanie:
Na każdym kroku przycinamy macierz do 2 na 2 i obliczamy wyznaczniki każdego z nich, uzyskując macierz wejściową następnego kroku. Powtarzamy ten proces, aż wynik się nie zmieni (ostatnim elementem jest sama determinanta). Końcowy wynik przekształcamy na skalar za pomocą
0{0{
.Wypróbuj online tutaj.
źródło
(2 2$2)&(-/ .*;._3^:(2^.#@]))
Wypróbuj online!Mathematica,
5240 bajtówPodziękowania dla Martina Büttnera za oszczędność 12 bajtów.
Wyjaśnienie
BlockMap[f,expr,n]
podzieloneexpr
na podlisty wielkościn
i mapyf
na każdej podlisty.BlockMap[Det,#,{2,2}]&
podziel tablicę wejściową na 2 * 2 bloki i oblicz ich wyznaczniki.Przypadek testowy
źródło
[[1,1]]
pomocąTr
i zaNest
pomocą//.
:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
Galaretka,
2017 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe jednocześnie .
Jak to działa
źródło
Haskell ,
9386 bajtówEDYCJA: Dzięki @Laikoni za skrócenie tego całego 7 bajtów!
Nie wiedziałem, że możesz umieścić instrukcję let przed = i nigdy nie przyzwyczaiłem się do tych operatorów monad. Jeszcze raz dziękuję @Laikoni
Stara wersja:
Wypróbuj online!
Jest to funkcja, która powtarza się na dwa różne sposoby. Najpierw dopasowanie wzoru łapie przypadek podstawowy: macierz 2x2 i wykonuje obliczenia. Używam tego, aby wykonać obliczenia w przypadku rekurencyjnym, wywołując funkcję za pomocą generowanej przeze mnie macierzy 2x2, która zawiera rozwiązania rekurencyjne. Macierz ta jest generowana przez dwukrotne iterowanie tablicy funkcji, z których każda przecina listę na pół. Stosuję go do wierszy za pomocą prostego wywołania i stosuję do kolumn za pomocą
map
.źródło
where h=length m`div`2;l=[take h,drop h]
możesz użyćf m|let l=[take,drop]<*>[length m`div`2]=
.map b m
może byćb<$>m
i[f$a$b<$>m|a<-l]
może być dalej skróconyf.($b<$>m)<$>l
. W sumie 86 bajtów: [ tio.run/… Wypróbuj online!]Python, 166 bajtów
To przechodzi wszystkie dostarczone przypadki testowe. m musi być tablicą 2D (jak w przypadkach testowych), g wybiera macierz podrzędną.
źródło
Pyth, 26
Pakiet testowy
Składa się z dwóch części:
M-F*VG_H
przedefiniowuje funkcjęg
obliczania wyznacznika macierzy dwa na dwa. To oszczędza bajty, nawet jeśli używamy go tylko raz, ponieważ rozpakowuje dwa rzędy.Druga część to duże ograniczenie, które nazywamy
log_2( len( input() ) )
czasami. Niestety wykonanie kroku redukcji na macierzy 1 na 1 powoduje zawinięcie wyniku w listę, więc nie otrzymujemy stałego punktu. Redukcja polega głównie na podzieleniu macierzy, aby uzyskać macierze 2 na 2, a następnie nałożeniug
.źródło
MATL , 26
30bajtówDane wejściowe to tablica 2D z wierszami oddzielonymi
;
, to znaczyWypróbuj online!
źródło
Perl 5 , 120 + 1 (
-a
) = 121 bajtówWypróbuj online!
Pobiera dane wejściowe jako listę liczb oddzielonych spacjami.
źródło
ES6, 91 bajtów
Proste rozwiązanie rekurencyjne.
źródło
R , 111 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako macierz R (która jest konwertowana przez funkcję w nagłówku).
źródło
Groovy,
221189 bajtów (w tym momencie mogłem użyć Javy)Stara kiepska wersja, którą równie dobrze może być Java (221 bajtów):
Nieskluczony kod:
źródło