Le déterminant d'une matrice 2 par 2
a b
c d
est donné par ad - bc
.
Étant donné une matrice de chiffres de dimensions 2 n par 2 n , n ≥ 1, sortez le résultat obtenu en calculant récursivement le déterminant de chaque sous-bloc 2 par 2 jusqu'à ce que nous atteignions un nombre unique.
Par exemple, étant donné l'entrée
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
Après une étape, on obtient:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
Et en répétant, nous obtenons:
(22*-57 - 22*8) = -1430
Par conséquent, la sortie devrait être -1430
.
Règles
- Les éléments de la matrice seront toujours des entiers à un chiffre, c'est-à-dire de 0 à 9.
- Vous pouvez prendre des entrées dans n'importe quel format de liste ou de chaîne pratique, tant qu'aucun prétraitement des données n'est effectué. Puisque la matrice est toujours carrée, vous pouvez prendre l'entrée comme une seule liste 1D au lieu d'une liste 2D si vous le souhaitez.
- L'entrée peut se faire via l'entrée de fonction, STDIN, l'argument de ligne de commande ou l'alternative la plus proche.
- La sortie doit être un entier unique pour fonctionner en sortie, STDOUT ou l'alternative la plus proche. Vous ne pouvez pas sortir le seul entier dans une liste ou une matrice.
- Vous pouvez utiliser des méthodes intégrées de manipulation des déterminants et de la matrice si votre langue les prend en charge.
- Votre algorithme doit fonctionner en théorie pour toute entrée valide.
- Les règles de code-golf standard s'appliquent.
Cas de test
Les cas de test suivants sont donnés sous forme de listes de style 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
(Merci à @ MartinBüttner pour son aide dans ce défi)
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
. Le déterminant complet est zéro car il a deux lignes identiques. Celui-ci est donc une matrice singulière (c'est-à-dire non inversible) 4 × 4, il n'est donc pas compté par A055165. Cependant, le déterminant "récursif" discuté ici l'est1*1-1*0==1
. Dans la direction opposée, la matrice[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
a un déterminant "récursif"0*0-0*0==0
. Cependant, son déterminant complet doit être différent de zéro car ses lignes ne sont que les lignes de la matrice d'identité dans un autre ordre; et il est compté par A055165.Réponses:
J,
2125 octetsUsage:
À chaque étape, nous découpons la matrice en 2 par 2 et calculons chacun des déterminants résultant en la matrice d'entrée de l'étape suivante. Nous répétons ce processus jusqu'à ce que le résultat ne change pas (l'élément final est le déterminant lui-même). Nous convertissons le résultat final en un scalaire avec
0{0{
.Essayez-le en ligne ici.
la source
(2 2$2)&(-/ .*;._3^:(2^.#@]))
essayez-le en ligne!Mathematica,
5240 octetsMerci à Martin Büttner pour avoir économisé 12 octets.
Explication
BlockMap[f,expr,n]
diviséexpr
en sous-listes de taillen
et cartef
sur chaque sous-liste.BlockMap[Det,#,{2,2}]&
divisez le tableau d'entrée en blocs 2 * 2 et calculez leurs déterminants.Cas de test
la source
[[1,1]]
avecTr
et leNest
avec//.
:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
Gelée,
2017 octetsEssayez-le en ligne! ou vérifiez tous les cas de test à la fois .
Comment ça fonctionne
la source
Haskell ,
9386 octetsEDIT: Merci à @Laikoni pour avoir raccourci ces 7 octets!
Je ne savais pas que vous pouviez mettre une instruction let avant le = et je ne me suis jamais habitué à ces opérateurs de monade. Merci encore @Laikoni
Ancienne version:
Essayez-le en ligne!
Il s'agit d'une fonction qui se reproduit de deux manières différentes. Tout d'abord, la correspondance des motifs capture le cas de base: une matrice 2x2 et fait le calcul. Je l'utilise pour faire le calcul dans le cas récursif en appelant la fonction avec une matrice 2x2 que je génère qui contient les solutions récursives. Cette matrice est générée en itérant deux fois sur un tableau de fonctions qui coupent chacune une liste en deux. Je l'applique aux lignes avec un simple appel et l'applique aux colonnes en utilisant
map
.la source
where h=length m`div`2;l=[take h,drop h]
, vous pouvez utiliserf m|let l=[take,drop]<*>[length m`div`2]=
.map b m
peut êtreb<$>m
, et[f$a$b<$>m|a<-l]
peut être encore raccourcif.($b<$>m)<$>l
. Au total 86 octets: [ tio.run/… Essayez-le en ligne!]Python, 166 octets
Cela passe tous les cas de test fournis. m doit être un tableau 2D (comme dans les cas de test), g sélectionne la sous-matrice.
la source
Pyth, 26
Suite de tests
Cela comporte deux parties:
M-F*VG_H
redéfinit la fonctiong
pour calculer le déterminant d'une matrice deux par deux. Cela économise des octets même si nous ne l'utilisons qu'une seule fois car il décompresse les deux lignes.L'autre partie est une grande instruction de réduction que nous appelons
log_2( len( input() ) )
temps. Malheureusement, effectuer une étape de réduction sur une matrice 1 par 1 entraîne le résultat dans une liste, donc nous n'obtenons pas de point fixe. La réduction consiste principalement à diviser la matrice pour obtenir des matrices 2 par 2, puis à appliquerg
.la source
MATL , 26
30octetsL'entrée est un tableau 2D avec des lignes séparées par
;
, c'est-à-direEssayez-le en ligne!
la source
Perl 5 , 120 + 1 (
-a
) = 121 octetsEssayez-le en ligne!
Prend l'entrée comme une liste de nombres séparés par des espaces.
la source
ES6, 91 octets
Solution récursive simple.
la source
R , 111 octets
Essayez-le en ligne!
Prend l'entrée comme une matrice R (qui est convertie par la fonction dans l'en-tête).
la source
Groovy,
221189 octets (à ce stade, aurait pu utiliser Java)Ancienne version merdique, qui pourrait aussi bien être Java (221 octets):
Code non golfé:
la source