Die Determinante einer 2 mal 2 Matrix
a b
c d
ist gegeben durch ad - bc
.
Ausgehend von einer Ziffernmatrix mit den Dimensionen 2 n mal 2 n , n ≥ 1 wird das Ergebnis ausgegeben, das durch rekursives Berechnen der Determinante jedes 2 mal 2-Unterblocks erhalten wird, bis eine einzelne Zahl erreicht ist.
Zum Beispiel angesichts der Eingabe
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
Nach einem Schritt erhalten wir:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
Und wenn wir noch einmal iterieren, erhalten wir:
(22*-57 - 22*8) = -1430
Daher sollte die Ausgabe sein -1430
.
Regeln
- Die Elemente der Matrix sind immer einstellige Ganzzahlen, dh 0 bis 9.
- Sie können Eingaben in einem beliebigen Listen- oder Zeichenfolgeformat vornehmen, sofern keine Datenvorverarbeitung erfolgt. Da die Matrix immer quadratisch ist, können Sie Eingaben als einzelne 1D-Liste anstelle einer 2D-Liste vornehmen, wenn Sie dies wünschen.
- Die Eingabe kann über Funktionseingabe, STDIN, Befehlszeilenargument oder die nächstgelegene Alternative erfolgen.
- Die Ausgabe sollte eine einzelne Ganzzahl für die Funktionsausgabe, STDOUT oder die nächstgelegene Alternative sein. Sie können die einzelne Ganzzahl in einer Liste oder Matrix nicht ausgeben.
- Sie können eingebaute Determinanten- und Matrixmanipulationsmethoden verwenden, wenn Ihre Sprache diese unterstützt.
- Ihr Algorithmus muss theoretisch für jede gültige Eingabe funktionieren.
- Es gelten die Standardregeln für Code-Golf .
Testfälle
Die folgenden Testfälle werden als Listen im Python-Stil angegeben:
[[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
(Danke an @ MartinBüttner für die Hilfe bei dieser Herausforderung)
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
. Die vollständige Determinante davon ist Null, da es zwei identische Zeilen hat. Diese ist daher eine singuläre (dh nicht invertierbare) 4 × 4-Matrix und wird daher von A055165 nicht gezählt. Die hier diskutierte "rekursive" Determinante ist jedoch1*1-1*0==1
. In der entgegengesetzten Richtung hat die Matrix[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
eine "rekursive" Determinante0*0-0*0==0
. Seine vollständige Determinante darf jedoch nicht Null sein, da seine Zeilen nur die Zeilen der Identitätsmatrix in einer anderen Reihenfolge sind. und es wird von A055165 gezählt.Antworten:
J,
21-25BytesVerwendung:
Bei jedem Schritt schneiden wir die Matrix in 2-mal-2-Werte auf und berechnen jeweils die Determinante, die zur Eingangsmatrix des nächsten Schritts führt. Wir wiederholen diesen Vorgang, bis sich das Ergebnis nicht mehr ändert (das letzte Element ist die Determinante selbst). Wir konvertieren das Endergebnis in einen Skalar mit
0{0{
.Probieren Sie es hier online aus.
quelle
(2 2$2)&(-/ .*;._3^:(2^.#@]))
Probieren Sie es online!Mathematica,
5240 BytesVielen Dank an Martin Büttner für die Einsparung von 12 Bytes.
Erläuterung
BlockMap[f,expr,n]
Aufteilungexpr
in Unterlisten der Größen
und Zuordnungf
auf jeder Unterliste.BlockMap[Det,#,{2,2}]&
Teilen Sie das Eingabearray in 2 * 2 Blöcke auf und berechnen Sie deren Determinanten.Testfall
quelle
[[1,1]]
mitTr
und dasNest
mit vermeiden//.
:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
Jelly,
2017 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle auf einmal .
Wie es funktioniert
quelle
Haskell ,
9386 BytesEDIT: Danke an @Laikoni für die Verkürzung um ganze 7 Bytes!
Ich wusste nicht, dass Sie eine let-Anweisung vor das = setzen können, und ich habe mich nie an diese Monadenoperatoren gewöhnt. Nochmals vielen Dank @Laikoni
Alte Version:
Probieren Sie es online!
Dies ist eine Funktion, die sich auf zwei verschiedene Arten wiederholt. Zuerst fängt der Mustervergleich den Basisfall ein: eine 2x2-Matrix und es wird die Berechnung durchgeführt. Ich benutze dies, um die Berechnung im rekursiven Fall durchzuführen, indem ich die Funktion mit einer von mir generierten 2x2-Matrix aufrufe, die die rekursiven Lösungen enthält. Diese Matrix wird durch zweimaliges Durchlaufen einer Reihe von Funktionen erzeugt, die jeweils eine Liste in zwei Hälften zerlegen. Ich wende es mit einem einfachen Aufruf auf Zeilen an und wende es mit auf Spalten an
map
.quelle
where h=length m`div`2;l=[take h,drop h]
können Sie verwendenf m|let l=[take,drop]<*>[length m`div`2]=
.map b m
kann seinb<$>m
, und[f$a$b<$>m|a<-l]
kann weiter verkürzt werdenf.($b<$>m)<$>l
. Insgesamt 86 Bytes: [ tio.run/… OnlinePython, 166 Bytes
Damit sind alle bereitgestellten Testfälle bestanden. m muss ein 2D-Array sein (wie in den Testfällen), g wählt die Submatrix aus.
quelle
Pyth, 26
Test Suite
Dies hat zwei Teile:
M-F*VG_H
Definiert die Funktiong
zur Berechnung der Determinante einer Zwei-mal-Zwei-Matrix neu. Das spart Bytes, obwohl wir es nur einmal verwenden, weil es die beiden Zeilen entpackt.Der andere Teil ist eine große Reduce-Anweisung, die wir
log_2( len( input() ) )
Zeiten nennen . Unglücklicherweise wird das Ergebnis in eine Liste eingeschlossen, wenn ein Schritt in der Verkleinerung einer 1-zu-1-Matrix ausgeführt wird, sodass wir keinen festen Punkt erhalten. Das Reduzieren ist meistens nur das Aufteilen der Matrix, um 2 mal 2 Matrizen zu erhalten und dann anzuwendeng
.quelle
MATL , 26
30BytesEingabe ist eine 2D - Array mit Reihen , getrennt durch
;
, das heißt,Probieren Sie es online!
quelle
Perl 5 , 120 + 1 (
-a
) = 121 BytesProbieren Sie es online!
Nimmt die Eingabe als Liste mit durch Leerzeichen getrennten Zahlen.
quelle
ES6, 91 Bytes
Einfache rekursive Lösung.
quelle
R , 111 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als R-Matrix (die von der Funktion im Header konvertiert wird).
quelle
Groovy,
221189 Bytes (Zu diesem Zeitpunkt hätte Java verwendet werden können)Alte beschissene Version, die genauso gut Java sein könnte (221 Bytes):
Ungolfed-Code:
quelle