Dada una matriz, genere una representación de la matriz donde el elemento superior izquierdo está en la parte superior, el antia diagonal es la fila central y el elemento inferior derecho está en la parte inferior.
Por ejemplo, considere la siguiente matriz:
1 2 3
4 5 6
7 8 9
La versión de diamante de esta matriz es:
1
4 2
7 5 3
8 6
9
Entradas y salidas
Se proporcionará una matriz de entrada como una lista de listas (o algo similar en el idioma que elija). El resultado también será una lista de listas.
Las matrices solo contendrán enteros positivos.
La matriz de entrada no necesariamente será cuadrada.
La matriz de entrada será al menos 1 × 1.
Casos de prueba
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]]
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
code-golf
array-manipulation
matrix
Fatalizar
fuente
fuente
Respuestas:
J, 7 bytes
Este es un verbo monádico sin nombre que toma una matriz y devuelve una lista de antidiagonales:
Pruébalo aquí.
Explicación
/.
es una función integrada de J para aplicar una función a cada anti-diagonal. Desafortunadamente, estos anti-diagonales se dan en el orden opuesto de lo que queremos aquí.<@|.
, aplicamos primero lo|.
que invierte el antia diagonal y luego<
lo encuadra (que es la única forma de devolver una matriz irregular en J, ya que las matrices normales siempre son rectangulares, por lo que las antidiagonales se rellenarán con ceros).fuente
Python, 91 bytes
Pruébalo en Ideone .
Python + NumPy, 69 bytes
Espera una matriz NumPy 2D como entrada y devuelve una lista de matrices NumPy. Pruébalo en Ideone .
fuente
Jalea, 7 bytes
Pruébalo en línea!
Explicación
fuente
Mathematica,
5856 bytesFunción anónima, toma matrices anidadas.
fuente
Length[#]
donde
está\[Transpose]
. Y probablemente otro de aliasLength
.Length@#&@@#
para ASCII solo en el mismo recuento de bytes.CJam, 17 bytes
Un bloque (función) sin nombre que espera la matriz en la pila y la reemplaza con sus antidiagonales.
Pruébalo aquí.
Esto (encontrado por Sp3000) funciona para el mismo número de bytes:
Explicación
Esto se explica mejor con un ejemplo. Considere la entrada:
fuente
Python 2,
8887 bytesAnteponga 0s, zip, luego elimine elementos falsos. Devuelve una lista de tuplas. Esto se utiliza
map(None,...)
para realizarzip_longest
(rellenar puntos faltantes conNone
) yfilter(None,...)
para eliminar elementos falsos.De manera molesta, necesitamos agregar una
[]
fila adicional almap
para garantizar que se devuelva una lista de tuplas, ya quemap(None,*[[1]])
devuelve en[1]
lugar de[(1,)]
una matriz 1x1. Sinfilter
embargo, la fila adicional se elimina .(Gracias a @Dennis por -1 byte)
fuente
Ruby,
6866 bytesFunción anónima.
fuente
Mathematica, 60 bytes
donde
es un carácter Unicode que Mathematica lee como el\[Transpose]
operador postfix .Esto es un poco más largo que la otra solución de Mathematica, pero pensé que lo publicaría porque no usa el
Diagonals
incorporado y usa un enfoque completamente diferente.Explicación
Esto primero transpone la matriz (de modo que las antidiagonales aparezcan en el orden correcto si la matriz se aplana). Luego mapeamos
List
sobre las celdas de la matriz junto con el índice, que convierte cada elemento de la matrizi
en{i, {x, y}}
dóndex
yy
son las coordenadas del elemento en la matriz.Esto aplana la dimensión más externa, de modo que ahora tenemos una lista plana de los elementos de la matriz (con sus coordenadas) en orden de columna mayor.
Esto agrupa esos elementos por la suma de sus coordenadas. Tenga en cuenta que las antidiagonales son líneas de constante
x+y
, por lo que esto hace exactamente la agrupación que queremos. Se conserva el orden dentro de cada grupo. Ahora solo necesitamos deshacernos de las coordenadas nuevamente. Esto se hace a través de la críptica:Esto asigna la función
#&@@@#&
sobre cada grupo, que se aplica#&
a cada elemento del grupo, y#
es simplemente el primer argumento, es decir, el elemento matriz original.fuente
se lee como\[transpose]
?T
: reference.wolfram.com/language/ref/character/Transpose.html ...\[Transpose]
es simplemente la transcripción ASCII de ese carácter Unicode. Copiar el carácter Unicode o la transcripción en Mathematica funcionará.Octava, 77 bytes
Con un pequeño abuso de la
accumarray
función:Esto define una función anónima. Para usarlo, asigne a una variable o use
ans
.La entrada es la matriz con un
:
separador de filas. La salida es una matriz de celdas que contiene una matriz para cada fila (el equivalente de Octave a las matrices irregulares). Octave lo muestra mostrando los índices de la matriz de celdas y el contenido de cada celda. Probar aquí .Para mostrar el resultado separado solo por espacios y nuevas líneas: 83 bytes
También puedes probarlo aquí .
fuente
JavaScript (Firefox),
8675 bytes¡Guardado 11 bytes gracias a @Neil!
Funciona en Firefox 30+. Toma una matriz de matrices.
fuente
a.concat(a[0]).slice(1)
para obtener una matriz de la longitud correcta. Además,[for(of)]
no es ES6; Normalmente lo escribo como (Firefox 30+) o algo así.concat
yslice
. ¡Gracias!Octava,
6362 bytesEliminado un byte gracias a
@DonMue ...@LuisMendo!Fui por la ruta aburrida y mordí las antidiagonales.
Ejecución de muestra en ideone .
fuente
'uni'
a'un'
Haskell,
8382 bytesnimi guardó un byte. ¡Gracias!
fuente
Python, 128 bytes (numpy)
fuente
lambda
en solo una lambda que puede usar como su envío.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 en su revisión original) sería un poco más corto. Además, debe cambiarA[U][I-U]
aA[I-U][U]
para obtener orientación de la pregunta.Pyth ,
4117 bytesPruébalo en línea!
Inspirado por la solución de @ Doorknob a otro problema .
Cómo funciona:
Intento previo:
Pruébalo en línea!
Cómo funciona:
fuente
Groovy,
777375Toma una matriz de matrices como entrada y devuelve una matriz de matrices.
Intentalo
EDITAR: olvidé dar salida a la respuesta, después de agregarlo, la puntuación sube a 75.
fuente