O determinante de uma matriz 2 por 2
a b
c d
é dado por ad - bc
.
Dada uma matriz de dígitos com dimensões 2 n por 2 n , n ≥ 1, produza o resultado obtido computando recursivamente o determinante de cada sub-bloco 2 por 2 até chegarmos a um único número.
Por exemplo, dada a entrada
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
Após uma etapa, obtemos:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
E iterando mais uma vez, obtemos:
(22*-57 - 22*8) = -1430
Portanto, a saída deve ser -1430
.
Regras
- Os elementos da matriz sempre serão números inteiros de um dígito, ou seja, 0 a 9.
- Você pode receber entradas em qualquer formato conveniente de lista ou string, desde que não seja feito nenhum pré-processamento de dados. Como a matriz é sempre quadrada, você pode receber a entrada como uma única lista 1D em vez de uma lista 2D, se desejar.
- A entrada pode ser via entrada de função, STDIN, argumento de linha de comando ou alternativa mais próxima.
- A saída deve ser um único inteiro para funcionar como saída, STDOUT ou a alternativa mais próxima. Você não pode emitir o único inteiro em uma lista ou matriz.
- Você pode usar métodos internos de determinação de determinantes e de matriz se o seu idioma os suportar.
- Seu algoritmo deve funcionar em teoria para qualquer entrada válida.
- Aplicam-se as regras de código-golfe padrão .
Casos de teste
Os seguintes casos de teste são fornecidos como listas no 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
(Obrigado a @ MartinBüttner pela ajuda com este desafio)
code-golf
arithmetic
linear-algebra
matrix
Sp3000
fonte
fonte
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
. O determinante completo é zero, pois possui duas linhas idênticas. Esta é, portanto, uma matriz 4 × 4 singular (ou seja, não invertível), portanto não é contada por A055165. No entanto, o determinante "recursivo" discutido aqui é1*1-1*0==1
. Na direção oposta, a matriz[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
possui determinante "recursivo"0*0-0*0==0
. No entanto, seu determinante completo deve ser diferente de zero, porque suas linhas são apenas as linhas da matriz de identidade em outra ordem; e é contado por A055165.Respostas:
J,
2125 bytesUso:
Em cada etapa, cortamos a matriz para 2 por 2 e calculamos cada determinante, resultando na matriz de entrada da próxima etapa. Repetimos esse processo até que o resultado não mude (o elemento final é o próprio determinante). Convertemos o resultado final em um escalar com
0{0{
.Experimente online aqui.
fonte
(2 2$2)&(-/ .*;._3^:(2^.#@]))
Experimente online!Mathematica,
5240 bytesObrigado a Martin Büttner por salvar 12 bytes.
Explicação
BlockMap[f,expr,n]
divididoexpr
em sublistas de tamanhon
e mapaf
em todas as sublistas.BlockMap[Det,#,{2,2}]&
divida a matriz de entrada em 2 * 2 blocos e calcule seus determinantes.Caso de teste
fonte
[[1,1]]
comTr
e oNest
com//.
:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
Geléia,
2017 bytesExperimente online! ou verifique todos os casos de teste de uma só vez .
Como funciona
fonte
Haskell ,
9386 bytesEDIT: Obrigado a @Laikoni por reduzir este total de 7 bytes!
Eu não sabia que você poderia colocar uma declaração let antes do = e nunca me acostumei com esses operadores de mônada. Mais uma vez obrigado @Laikoni
Versão antiga:
Experimente online!
Essa é uma função que se repete de duas maneiras diferentes. Primeiro, a correspondência de padrões captura o caso base: uma matriz 2x2 e faz o cálculo. Eu uso isso para fazer o cálculo no caso recursivo, chamando a função com uma matriz 2x2 que eu gero que possui as soluções recursivas. Essa matriz é gerada iterando duas vezes em uma matriz de funções que cada uma divide uma lista pela metade. Aplico-o a linhas com uma chamada simples e aplico-o a colunas usando
map
.fonte
where h=length m`div`2;l=[take h,drop h]
, você pode usarf m|let l=[take,drop]<*>[length m`div`2]=
.map b m
pode serb<$>m
e[f$a$b<$>m|a<-l]
pode ser reduzido ainda maisf.($b<$>m)<$>l
. Ao todo 86 bytes: [ tio.run/... Experimente online!]Python, 166 bytes
Isso passa em todos os casos de teste fornecidos. m deve ser uma matriz 2D (como nos casos de teste), g seleciona a sub-matriz.
fonte
Pyth, 26
Suíte de teste
Isso tem duas partes:
M-F*VG_H
redefine a funçãog
para calcular o determinante de uma matriz dois por dois. Isso economiza bytes, embora o usemos apenas uma vez porque descompacta as duas linhas.A outra parte é uma grande declaração de redução que chamamos de
log_2( len( input() ) )
tempos. Infelizmente, executar uma etapa da redução em uma matriz 1 por 1 faz com que o resultado seja agrupado em uma lista, para que não tenhamos um ponto fixo. A redução é basicamente dividir a matriz para obter matrizes 2 por 2 e depois aplicarg
.fonte
MATL , 26
30bytesEntrada é uma matriz 2D com linhas separadas por
;
, ou seja,Experimente online!
fonte
Perl 5 , 120 + 1 (
-a
) = 121 bytesExperimente online!
Toma a entrada como uma lista de números separados por espaço.
fonte
ES6, 91 bytes
Solução recursiva direta.
fonte
R , 111 bytes
Experimente online!
Recebe a entrada como uma matriz R (que é convertida pela função no cabeçalho).
fonte
Groovy,
221189 bytes (Neste ponto, poderia ter usado Java)Versão antiga ruim, que também pode ser Java (221 bytes):
Código não destruído:
fonte