El determinante de una matriz 2 por 2
a b
c d
está dada por ad - bc
.
Dada una matriz de dígitos con dimensiones 2 n por 2 n , n ≥ 1, genera el resultado obtenido calculando recursivamente el determinante de cada subbloque 2 por 2 hasta llegar a un solo número.
Por ejemplo, dada la entrada
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
Después de un paso, obtenemos:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
E iterando una vez más, obtenemos:
(22*-57 - 22*8) = -1430
Por lo tanto, la salida debería ser -1430
.
Reglas
- Los elementos de la matriz siempre serán enteros de un solo dígito, es decir, de 0 a 9.
- Puede tomar la entrada en cualquier lista conveniente o formato de cadena, siempre que no se realice un procesamiento previo de los datos. Dado que la matriz siempre es cuadrada, puede tomar la entrada como una sola lista 1D en lugar de una lista 2D si lo desea.
- La entrada puede ser a través de la entrada de función, STDIN, argumento de línea de comando o la alternativa más cercana.
- La salida debe ser un solo entero para funcionar con salida, STDOUT o la alternativa más cercana. No puede generar el entero único en una lista o matriz.
- Puede utilizar métodos de manipulación de determinantes y matrices incorporados si su idioma los respalda.
- Su algoritmo debe funcionar en teoría para cualquier entrada válida.
- Aplican reglas estándar de código de golf .
Casos de prueba
Los siguientes casos de prueba se dan como listas de estilo 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
(Gracias a @ MartinBüttner por la ayuda con este desafío)
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
. El determinante completo es cero, ya que tiene dos filas idénticas. Por lo tanto, esta es una matriz 4 × 4 singular (es decir, no invertible), por lo que A055165 no la cuenta. Sin embargo, el determinante "recursivo" discutido aquí es1*1-1*0==1
. En la dirección opuesta, la matriz[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
tiene determinante "recursivo"0*0-0*0==0
. Sin embargo, su determinante completo debe ser distinto de cero porque sus filas son solo las filas de la matriz de identidad en otro orden; y se cuenta por A055165.Respuestas:
J,
2125 bytesUso:
En cada paso, cortamos la matriz a 2 por 2 y calculamos cada uno determinante que resulta en la matriz de entrada del siguiente paso. Repetimos este proceso hasta que el resultado no cambie (el elemento final es el determinante mismo). Convertimos el resultado final a un escalar con
0{0{
.Pruébelo en línea aquí.
fuente
(2 2$2)&(-/ .*;._3^:(2^.#@]))
Pruébelo en línea!Mathematica,
5240 bytesGracias a Martin Büttner por guardar 12 bytes.
Explicación
BlockMap[f,expr,n]
dividirexpr
en sublistas de tamañon
y mapaf
en cada sublista.BlockMap[Det,#,{2,2}]&
divide la matriz de entrada en bloques 2 * 2 y calcula sus determinantes.Caso de prueba
fuente
[[1,1]]
conTr
y elNest
con//.
:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
Jalea,
2017 bytesPruébalo en línea! o verificar todos los casos de prueba a la vez .
Cómo funciona
fuente
Haskell ,
9386 bytesEDITAR: ¡Gracias a @Laikoni por acortar esto un total de 7 bytes!
No sabía que podía poner una declaración let antes de = y nunca me he acostumbrado a esos operadores de mónada. Gracias de nuevo @Laikoni
Versión antigua:
Pruébalo en línea!
Esta es una función que se repite en sí misma de dos maneras diferentes. Primero, la coincidencia de patrones captura el caso base: una matriz de 2x2 y realiza el cálculo. Utilizo esto para hacer el cálculo en el caso recursivo llamando a la función con una matriz 2x2 que genero que tiene las soluciones recursivas. Esa matriz se genera iterando dos veces sobre una matriz de funciones que cada una corta una lista a la mitad. Lo aplico a filas con una simple llamada y lo aplico a columnas usando
map
.fuente
where h=length m`div`2;l=[take h,drop h]
, puedes usarf m|let l=[take,drop]<*>[length m`div`2]=
.map b m
puede serb<$>m
, y[f$a$b<$>m|a<-l]
puede acortarse aún másf.($b<$>m)<$>l
. En total 86 bytes: [ tio.run/… ¡ Pruébelo en línea!]Python, 166 bytes
Esto pasa todos los casos de prueba proporcionados. m tiene que ser una matriz 2D (como en los casos de prueba), g selecciona la submatriz.
fuente
Pyth, 26
Banco de pruebas
Esto tiene dos partes:
M-F*VG_H
redefine la funcióng
para calcular el determinante de una matriz de dos por dos. Esto ahorra bytes aunque solo lo usemos una vez porque desempaqueta las dos filas.La otra parte es una gran declaración de reducción que llamamos
log_2( len( input() ) )
tiempos. Desafortunadamente, realizar un paso en la reducción en una matriz 1 por 1 hace que el resultado quede envuelto en una lista, por lo que no obtenemos un punto fijo. La reducción consiste principalmente en dividir la matriz para obtener 2 por 2 matrices y luego aplicarg
.fuente
MATL , 26
30bytesLa entrada es una matriz 2D con filas separadas por
;
, es decir,Pruébalo en línea!
fuente
Perl 5 , 120 + 1 (
-a
) = 121 bytesPruébalo en línea!
Toma la entrada como una lista de números separados por espacios.
fuente
ES6, 91 bytes
Solución recursiva directa.
fuente
R , 111 bytes
Pruébalo en línea!
Toma la entrada como una matriz R (que es convertida por la función en el encabezado).
fuente
Groovy,
221189 bytes (en este punto, podría haber usado Java)Antigua versión de mierda, que también podría ser Java (221 bytes):
Código sin golf:
fuente