Dada uma matriz, produza uma representação da matriz onde o elemento superior esquerdo está no topo, a anti-diagonal é a linha central e o elemento inferior direito está na parte inferior.
Por exemplo, considere a seguinte matriz:
1 2 3
4 5 6
7 8 9
A versão em diamante desta matriz é:
1
4 2
7 5 3
8 6
9
Entradas e saídas
Uma matriz de entrada será fornecida como uma lista de listas (ou qualquer coisa semelhante no idioma de sua escolha). A saída também deve ser uma lista de listas.
As matrizes conterão apenas números inteiros positivos.
A matriz de entrada não será necessariamente quadrada.
A matriz de entrada será pelo menos 1 × 1.
Casos de teste
Input: [[1]]
Output: [[1]]
Input: [[1,2],[3,4]]
Output: [[1],[3,2],[4]]
Input: [[1,2,3],[4,5,6]]
Output: [[1],[4,2],[5,3],[6]]
Input: [[11,2,5],[3,99,3],[4,8,15],[16,23,42]]
Output: [[11],[3,2],[4,99,5],[16,8,3],[23,15],[42]]
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
code-golf
array-manipulation
matrix
Fatalizar
fonte
fonte
Respostas:
J, 7 bytes
Este é um verbo monádico sem nome que pega uma matriz e retorna uma lista de antidiagonais:
Teste aqui.
Explicação
/.
é o J embutido para aplicar uma função a cada anti-diagonal. Infelizmente, essas anti-diagonais são dadas na ordem oposta ao que queremos aqui.<@|.
, aplicamos primeiro o|.
que inverte a anti-diagonal e depois<
a caixa (que é a única maneira de retornar uma matriz irregular em J, pois as matrizes normais são sempre retangulares, portanto as antidiagonais seriam preenchidas com zeros).fonte
Python, 91 bytes
Teste em Ideone .
Python + NumPy, 69 bytes
Espera uma matriz NumPy 2D como entrada e retorna uma lista de matrizes NumPy. Teste em Ideone .
fonte
Geléia, 7 bytes
Experimente online!
Explicação
fonte
Mathematica,
5856 bytesFunção anônima, recebe matrizes aninhadas.
fonte
Length[#]
onde
está\[Transpose]
. E provavelmente outro de serrilhadoLength
.Length@#&@@#
para ASCII apenas na mesma contagem de bytes.CJam, 17 bytes
Um bloco (função) sem nome que espera a matriz na pilha e a substitui por suas antidiagonais.
Teste aqui.
Isso (encontrado pelo Sp3000) funciona para a mesma contagem de bytes:
Explicação
Isso é melhor explicado com um exemplo. Considere a entrada:
fonte
Python 2,
8887 bytesColoque 0s, zip e remova os elementos falsos. Retorna uma lista de tuplas. Isso é usado
map(None,...)
para executarzip_longest
(preenchimento de pontos ausentesNone
) efilter(None,...)
remover elementos falsos.Irritantemente, precisamos adicionar uma
[]
linha extra aomap
para garantir que uma lista de tuplas seja retornada, poismap(None,*[[1]])
retorna em[1]
vez de[(1,)]
para uma matriz 1x1. A linha extra é removida pelofilter
pensamento.(Obrigado a @Dennis por -1 byte)
fonte
Ruby,
6866 bytesFunção anônima.
fonte
Mathematica, 60 bytes
onde
é um caractere Unicode que o Mathematica lê como o\[Transpose]
operador postfix .Isso é um pouco mais longo que a outra solução do Mathematica, mas achei que a postaria porque ela não usa o
Diagonals
built-in e usa uma abordagem completamente diferente.Explicação
Isso primeiro transpõe a matriz (de modo que os antidiagonais apareçam na ordem correta se a matriz foi achatada). Em seguida, mapeamos
List
as células da matriz junto com o índice, que transforma cada elemento da matrizi
em{i, {x, y}}
ondex
ey
são as coordenadas do elemento na matriz.Isso nivela a dimensão mais externa, para que agora tenhamos uma lista simples dos elementos da matriz (com suas coordenadas) na ordem principal da coluna.
Isso agrupa esses elementos pela soma de suas coordenadas. Observe que antidiagonais são linhas de constante
x+y
, portanto, esse é exatamente o agrupamento que queremos. A ordem dentro de cada grupo é preservada. Agora só precisamos nos livrar das coordenadas novamente. Isso é feito através do um tanto enigmático:Isso mapeia a função
#&@@@#&
sobre cada grupo, que se aplica#&
a cada elemento do grupo, e#
é simplesmente o primeiro argumento, ou seja, o elemento da matriz original.fonte
é lida como\[transpose]
?T
: reference.wolfram.com/language/ref/character/Transpose.html ...\[Transpose]
é simplesmente a transliteração ASCII desse caractere Unicode. Copiar o caractere Unicode ou a transliteração para o Mathematica funcionará.Oitava, 77 bytes
Com um pouco de abuso da
accumarray
função:Isso define uma função anônima. Para usá-lo, atribua a uma variável ou use
ans
.Entrada é a matriz com
:
como separador de linhas. Saída é uma matriz de células que contém uma matriz para cada linha (a oitava é equivalente a matrizes irregulares). Isso é exibido pelo Octave, mostrando os índices da matriz de células e o conteúdo de cada célula. Experimente aqui .Para exibir o resultado separado apenas por espaços e novas linhas: 83 bytes
Você também pode tentar aqui .
fonte
JavaScript (Firefox),
8675 bytesGuardado 11 bytes graças a @Neil!
Funciona no Firefox 30+. Toma uma matriz de matrizes.
fonte
a.concat(a[0]).slice(1)
para obter uma matriz do tamanho certo. Além disso,[for(of)]
não é ES6; Eu normalmente escrevo como (Firefox 30+) ou algo assim.concat
eslice
. Obrigado!Oitava,
6362 bytesRemovido um byte graças a
@DonMue ...@LuisMendo!Eu fui a rota chata e munged os antidiagonais.
Amostra executada em ideone .
fonte
'uni'
para'un'
Haskell,
8382 bytesnimi salvou um byte. Obrigado!
fonte
Python, 128 bytes (numpy)
fonte
lambda
em apenas um lambda que você pode usar como seu envio.lambda A:[[A[U][I-U]for U in range(max(I-len(A)+1,0),min(len(A[0])-1,I)+1)]for I in range(len(A+A[0])-1)]
(como em sua revisão original) seria um pouco menor. Além disso, você deve mudarA[U][I-U]
paraA[I-U][U]
obter orientação da questão.Pitão ,
4117 bytesExperimente online!
Inspirado na solução da @ Doorknob para outro problema .
Como funciona:
Tentativa anterior:
Experimente online!
Como funciona:
fonte
Groovy,
777375Pega a matriz de matrizes como entrada e retorna a matriz de matrizes.
Tente
EDIT: Eu esqueci de produzir a resposta, depois de adicioná-lo pontuação sobe para 75.
fonte