Tome una matriz / matriz numérica no vacía que contenga enteros positivos como entrada. Devuelva, en este orden, las sumas de la primera fila y columna, luego la segunda fila y columna y continúe hasta que no haya más filas o columnas.
Supongamos que la entrada es:
2 10 10 2 4
9 7 7 2 9
1 7 6 2 4
7 1 4 8 9
Entonces la salida debería ser:
45, 33, 16, 17
Debido a que: 2+9+1+7+10+10+2+4=45, 7+7+1+7+2+9=33, 6+4+2+4=16, 8+9=17
.
Casos de prueba:
Los casos de prueba están en el siguiente formato:
Input
---
Output
5
---
5
..........
1 4
----
5
..........
7
2
---
9
..........
8 3 7 10 3 7 10 1
10 7 5 8 4 3 3 1
1 6 4 1 3 6 10 1
2 3 8 2 8 3 4 1
---
62 40 33 18
..........
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
---
320 226 235 263 135 26 20
..........
7 10 1
4 4 2
6 3 4
1 4 10
5 7 6
---
34 20 20
Como matrices:
[[5]]
[[1,4]]
[[7],[2]]
[[8,3,7,10,3,7,10,1],[10,7,5,8,4,3,3,1],[1,6,4,1,3,6,10,1],[2,3,8,2,8,3,4,1]]
[[30,39,48,1,10,19,28],[38,47,7,9,18,27,29],[46,6,8,17,26,35,37],[5,14,16,25,34,36,45],[13,15,24,33,42,44,4],[21,23,32,41,43,3,12],[22,31,40,49,2,11,20]]
[[7,10,1],[4,4,2],[6,3,4],[1,4,10],[5,7,6]]
Este es el código de golf, por lo que gana la solución más corta en cada idioma.
10,7,7,1
, la segunda fila es9,7,7,2,9
y la suma es59
. Y así sucesivamenteRespuestas:
MATL , 16 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Considere, como ejemplo, la entrada
El código
&n:w:!Xl
construye el vector de columna[1; 2; 3; 4]
y el vector de fila[1 2 3 4 5]
. LuegoXl
calcula el elemento mínimo sabio con broadcast, que da la matrizX:
linealiza esta matriz (en orden de columna principal) en el vector de columna[1; 1; 1; 1; 1; 2; 2; ... ; 4]
. Este vector y la matriz de entrada linealizada, obtenida comoGX:
, se pasan como entradas a laaccumarray(... @sum)
función, o1XQ
. Esto calcula la suma de la segunda entrada agrupada por los valores de la primera entrada.fuente
Jalea , 3 bytes
Pruébalo en línea!
Cómo funciona
fuente
CJam ,
2318 bytesBloque anónimo que espera el argumento en la pila y deja el resultado en la pila.
Pruébalo en línea!
Explicación
fuente
q~[{(:+\z}h;]2/::+p
[
. Pero como bloque, creo que lo necesito porque no necesita capturar toda la pila a continuación también.05AB1E ,
1411 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6), 60 bytes
Solución ingenua, puede ser una mejor manera.
fuente
Mathematica, 60 bytes
Inspirado por la respuesta MATL de Luis Mendo .
Explicación:
Min~Array~Dimensions@#
construye una matriz como la siguiente:Luego
Pick[#,...,n]~Total~2
selecciona las entradas de la matriz de entrada correspondiente al númeron
en la matriz extraña de arriba, y las suma. Finalmente se...~Table~{n,Min[d=Dimensions@#]}
repiten
.Este es 1 byte más corto que el enfoque ingenuo:
fuente
Haskell,
5049 bytesPruébalo en línea!
Si hay al menos una fila con al menos un elemento, el resultado es la suma de la primera fila y los encabezados de todas las demás filas, seguido de una llamada recursiva con las colas de todas las demás filas. En todos los demás casos, el resultado es la lista vacía.
Editar: Ørjan Johansen guardó un byte. ¡Gracias!
fuente
Octava ,
6452 bytes¡Gracias a @StewieGriffin por guardar 1 byte!
Esto define una función anónima.
Pruébalo en línea!
Explicación
El código es similar a mi respuesta MATL (vea la explicación allí).
Se han guardado dos bytes utilizando en
1:size(x)
lugar de1:size(x,1)
, explotando el hecho de que se1:[a b]
comporta igual que1:a
. Además, un byte se ha guardado usando en1:rows(x')
lugar de1:size(x,2)
, gracias a Stewie.fuente
k, 19 bytes
Pruébalo en línea!
Explicación:
fuente
05AB1E , 16 bytes
Pruébalo en línea! o prueba todas las pruebas
fuente
Octava ,
6360 bytesPruébalo en línea!
La respuesta para esta matriz:
es el vector de sumas de fila de su parte triangular superior:
más el vector de sumas de columnas de su parte triangular inferior:
que es precisamente lo que mi respuesta es informática.
fuente
Julia , 62 bytes
Funciona de forma recursiva sumando toda la matriz y luego restando la suma del siguiente bloque. Probablemente no sea el enfoque más efectivo, pero muy intuitivo.
fuente
Java 7, 248 bytes
Pruébalo aquí.
Explicación general:
Digamos que la matriz de entrada tiene dimensiones de 4x6. La primera parte del código creará una matriz temporal y la completará de la siguiente manera:
Y en la segunda parte del código, recorrerá esta matriz temporal y sumará todos los valores de la matriz de entrada para cada uno de los números distintos en la matriz temporal.
Explicación del código:
fuente
Perl 6 ,
6355 bytes{($_ Z [Z] $_).kv.map(->\a,\b{b.flatmap(*[a..*]).sum -b[0;a]})}
$_
es la entrada de matriz a la función anónima.skip
es la matriz de entrada con su primera fila eliminada[Z] .skip
es la transposición de la matriz de entrada con su primera fila eliminada; es decir, la transposición sin su primera columna$_ Z [Z] .skip
comprime la matriz de entrada con su transposición-sin-primera-columna, produciendo una lista((first-row, first-column-sans-first-element), (second-row, second-column-sans-first-element), ...)
.kv
prefija cada par con su índicemap({...})
asigna sobre los pares, usando una función que toma su primer argumento (el índice)$^a
y su segundo (el par fila / columna) en$^b
$^b.flatmap(*[$^a..*]).sum
quita los primeros$^a
elementos de cada par de fila / columna, luego suma todos los elementos restantesDespués de pensarlo un poco, me di cuenta de que quitar la primera columna de la transposición antes de comprimir era equivalente a restar los elementos diagonales que contribuyen doblemente, como en mi primera solución. Eso me permitió eliminar esa resta, y usar cada argumento de la función de mapeo solo una vez hizo que el
{...$^a...$^b...}
método de pasar argumentos a una función anónima fuera más eficiente que el original-> \a, \b {...a...b...}
.fuente
Vim,
66, 52 bytesPruébalo en línea!
La herramienta incorrecta para el trabajo ...
fuente
Jalea , 10 bytes
Un programa completo que imprime los valores.
Pruébalo en línea!
¿Cómo?
fuente
Python + NumPy, 75 bytes
La entrada es una matriz numpy 2D.
Pruébalo en línea
fuente
Python 2 , 97 bytes
Pruébalo en línea!
fuente
Pyth,
1615 bytesToma una matriz de matrices de números estilo python, devuelve una matriz de sumas.
¡Intentalo!
Explicación
fuente
GNU APL 1.7, 123 bytes
La solución requiere dos funciones: una crea una matriz global y llama a la segunda, que agrega recursivamente las sumas a esa matriz.
∇
comienza y termina la función. Ambosf
yg
toman tablas como argumentos (esencialmente matrices 2D). Estos se pueden crear conX←rows cols ⍴ 1 2 3 4...
.R←⍬
asigna un vector vacío a la variable globalR
.g N
llama a la segunda función con el mismo argumento dado a la primera.⍴N
da las dimensiones deN
; cuando una de las dimensiones es cero, no hay más filas / columnas para sumar.0∈⍴N
devuelve 1 si hay un cero en las dimensiones.→2+2×0∈⍴N
se bifurca a la línea número 2 más 2 veces el valor de retorno de la∈
función: si no hay cero,∈
devuelve 0 y la función se bifurca a la línea 2 (la siguiente línea). Si no es a, cero∈
devuelve 1 y las ramas de la función a la línea 4 (el final de la función, de modoreturn
esencialmente)./
es el operador de reducción. Aplica el argumento izquierdo, que es un operador (+
) a cada elemento de la lista dado como el argumento correcto.N[1;]
da la primera fila completa de la tabla yN[;1]
da la primera columna.(+/N[1;])+(+/N[;1])-N[1;1]
suma la primera fila y columna y resta el valor en la esquina superior izquierda porque se agrega tanto en la suma de columnas como en la suma de filas.R←R,...
agrega el valor recién calculado al vector globalR
.La función se llama a sí misma (recurse hasta que no haya más filas o columnas). El
⊃
operador de selección obtiene el elemento especificado de la lista.1⊃⍴N
da el número de filas,2⊃⍴N
el número de columnas.⍳
da todos los números del 1 al número especificado. El↓
operador de eliminación elimina elementos del principio de la lista. Si proporciona múltiples índices al acceder a elementos de una tabla o vector (por ejemploN[1 2 3]
), APL accede a cada uno. Por lo tanto,1↓⍳1⊃⍴N
da los índices de cada fila excluyendo el primero (2, 3, 4, ..., N
) y1↓⍳2⊃⍴N
da un vector similar pero para las columnas.g N[1↓⍳1⊃⍴N;1↓⍳2⊃⍴N]
llama a la función nuevamente pero sin la primera fila o columna.fuente
PHP, 76 bytes
Pruébalo en línea!
fuente
Mathematica, 116 bytes
Formulario de entrada
fuente
Clojure, 98 bytes
Itera sobre la entrada con índices de fila y columna (de una manera muy detallada), crea un mapa hash con el mínimo de
i
yj
como clave, combina los mapas hash con+
un mapa ordenado, devuelve valores.fuente
R, 102 bytes
devuelve una función anónima; imprime los resultados en la consola, con una nueva línea final. Probablemente necesito un enfoque diferente.
Itera sobre el mínimo de las filas y columnas; imprime la suma de
x[,1]
(la primera columna) yx[1,-1]
la primera fila, excepto la primera entrada, luego se establecex
como una matriz igual ax[-1,-1]
(es decir,x
excluyendo su primera fila y columna) Desafortunadamente, la configuración simplex=x[-1,-1]
hace que falle en el caso de una matriz cuadrada, porque cuandox
es 2x2, el subconjunto devuelve un vector en lugar de una matriz.Pruébalo en línea!
fuente
Java 7,
280276 bytesPruébalo aquí.
Enfoque alternativo en comparación con mi respuesta anterior con matrices, que aún es más corta que esta al final (por lo que perdí un poco de tiempo probando este enfoque alternativo).
Explicación general:
La inspiración de @Riley increíble respuesta 05AB1E 's
Esta respuesta utiliza una lista y después se calcula cada suma se elimina la primera columna y la primera fila de la lista de matriz, como este:
Explicación del código:
fuente
Python, 93 bytes
Similar a la respuesta de mbomb007, pero sin NumPy
fuente