(inspirado por esta pergunta sobre matemática)
As Definições
Dada uma n x n
matriz quadrada A , podemos chamá-la invertible
se existir alguma n x n
matriz quadrada B, tal que AB = BA = I n , com I n sendo a matriz de identidade de tamanho n x n
(a matriz com a principal diagonal se 1
qualquer outra coisa 0
), e AB e BA representando a multiplicação matricial usual (não vou entrar nisso aqui - faça uma aula de álgebra linear).
A partir disso, podemos chamar uma m x n
matriz C totally invertible
se cada k x k
submatriz (definido abaixo) de C pode ser invertida para todos k > 1
, k <= (smaller of m,n)
.
Uma submatriz é definida como a matriz resultante após a exclusão de qualquer número de linhas e / ou colunas da matriz original. Por exemplo, a 3x3
matriz C abaixo pode ser transformada em uma 2x2
submatriz C ' removendo a primeira linha 1 2 3
e a coluna do meio da 2 5 8
seguinte maneira:
C = [[1 2 3]
[4 5 6] --> C' = [[4 6]
[7 8 9]] [7 9]]
Observe que existem muitas possibilidades diferentes de submatrizes, o acima é apenas um exemplo. Esse desafio está relacionado apenas àqueles em que a submatriz resultante é uma k x k
matriz quadrada .
O desafio
Dada uma matriz de entrada, determine se é totalmente invertível ou não.
A entrada
- Uma única matriz de tamanho
m x n
, em qualquer formato adequado . - Sem perda de generalidade, você pode assumir
m <= n
oum >= n
, o que for mais golfista para o seu código, e aceitar a entrada dessa maneira (ou seja, você obtém uma operação de transposição gratuitamente, se desejar). - O tamanho da matriz de entrada não será menor que
3 x 3
, nem maior do que o seu idioma pode suportar. - A matriz de entrada será composta apenas por valores numéricos de Z + ( números inteiros positivos ).
A saída
- Um valor de verdade / falsey para saber se a matriz de entrada é totalmente invertível.
As regras
- Um programa completo ou uma função são aceitáveis.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Os exemplos
Truthy
[[1 2 3]
[2 3 1]
[3 1 2]]
[[2 6 3]
[1 12 2]
[5 3 1]]
[[1 2 3 4]
[2 3 4 1]
[3 4 1 2]]
[[2 3 5 7 11]
[13 17 19 23 29]
[31 37 41 43 47]]
Falsey
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 6 2 55 3]
[4 5 5 5 6]
[9 3 7 10 4]
[7 1 8 23 9]]
[[2 3 6]
[1 2 12]
[1 1 6]]
[[8 2 12 13 2]
[12 7 13 12 13]
[8 1 12 13 5]]
fonte
2 6 3; 1 12 2; 5 3 1
?6
no canto, não um7
. Erros de digitação desajeitados.Respostas:
Geléia ,
26 24 23 20 19 1716 bytes-1 byte graças a @miles (desnecessário para cada um
€
, ao tomar determinantes)-2 bytes, @miles novamente! (separação desnecessária de cadeias e uso
Ѐ
rápido)TryItOnline! ou todos os 8 testes
Quão?
fonte
ldepth = 2
na fonteZœcLÆḊ
e outro byte no link principal porçЀJȦ
€
golfe. Esqueci completamenteЀ
.œcЀJµZœcLÆḊµ€€Ȧ
o que é também 16 bytesMathematica 10.0, 34 bytes
Uma cadeia de 6 til ... novo recorde pessoal!
fonte
MATL, 57 bytes
Claro, você pode experimentar online!
A entrada deve estar na orientação 'retrato' (nRows> = nColumns). Sinto que essa pode não ser a solução mais eficiente ... Mas pelo menos estou deixando espaço para que outras pessoas me superem. Eu adoraria ouvir dicas específicas que poderiam tornar essa abordagem específica mais curta, mas acho que esse enorme número de dados deve inspirar outras pessoas a fazer uma entrada no MATL com uma abordagem completamente diferente. Exibe 0 se falso, ou um valor maciço se for verdade (rapidamente se tornará Inf se a matriz for muito grande; por 1 byte extra, pode-se substituir
H*
porH&Y
(lógico e)). Economizei alguns bytes graças a @LuisMendo.fonte