Te dan una matriz multidimensional de enteros. Cada dimensión tiene un tamaño fijo (para que siempre sea rectangular si es 2D). Su programa debe calcular las sumas en cada dimensión y agregar las sumas como los últimos últimos elementos en esa dimensión.
Suponga que las matrices de entrada y salida son A y B, y el tamaño de la dimensión i de A es n i . B tendría el mismo número de dimensiones que A y el tamaño de la dimensión i sería n i +1. B j 1 , j 2 , ..., j m es la suma de A k 1 , k 2 , ..., k m donde:
- k i = j i si j i <= n i
- 0 <k i <= n i si j i = n i +1
Para la entrada:
[[1 2 3]
[4 5 6]]
Su programa (o función) debería generar:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
La entrada contiene solo la matriz. El número total de dimensiones y el tamaño de cada dimensión no se dan en la entrada. (Pero puede obtenerlos de la matriz mediante su propio código). Puede usar cualquier formato de lista conveniente en su idioma, siempre que no especifique el número de dimensiones o tamaños de dimensión directamente.
La entrada tiene al menos 1 dimensión y tiene al menos 1 elemento en la matriz.
Este es el código de golf. El código más corto gana.
Casos de prueba
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
fuente
Respuestas:
J, 14 bytes
Uso:
La función es equivalente a la siguiente,
(0|:],+/)^:(#@$)
pero utiliza un adverbio definido por el usuario para salvar a los padres.Explicación del último código de derecha a izquierda:
^:(#@$)
repita^:
para el número#
de dimensiones$
:],+/
concatenar,
al argumento]
con la suma del mismo en la última dimensión+/
0|:
rotar dimensiones|:
colocando el primero0
al final de la lista de dimensionesDespués de realizar el procedimiento anterior, recuperamos la entrada original con sumas en todas las dimensiones.
Para mi solución anterior, verifique el historial de revisiones.
Pruébelo en línea aquí.
fuente
Mathematica,
3220 bytesEjemplo:
Explicación:
La forma completa de
{{1, 2, 3}, {4, 5, 6}}
esList[List[1, 2, 3], List[4, 5, 6]]
. Luego reemplace todas lasList
s en la expresión con la función({##,+##}&)
.fuente
Python 2, 95 bytes
Esto itera sobre cada dimensión, concatenando sus sumas usando NumPy.
Me encontré con NumPy's
r_
, que es bastante impresionante para jugar al golf.r_[:n]
es más cortorange(n)
y mucho más poderoso (pr_[:4, 7, 8, 10:100:10]
. ej .). También puede hacer otras cosas como la concatenación a lo largo de un eje arbitrario.Ejemplo de uso:
fuente
APL,
1615 bytesGracias a @ user23013 por jugar 3 bytes y descubrir el formato de entrada adecuado.
Verifique los casos de prueba en línea con TryAPL .
Idea
La idea general es la misma que en mi presentación de CJam, para la cual APL permite una implementación mucho más corta. Consta de solo dos pasos:
Suma la matriz en su dimensión más externa.
Repita el paso 1 para cada submatriz.
Código
fuente
,⊂(,1)(,1)(,1)(,0)
y,⊂,⊂,⊂,¯1
respectivamente. Entonces puedes eliminar otro personaje.Pip ,
1815 bytesEsta es una función anónima, que toma la matriz como argumento y devuelve el resultado. Invocación de muestra, utilizando el
-p
indicador para obtener una salida legible:La idea es básicamente la misma que la APL de Dennis , aunque derivada de forma independiente. Más específicamente:
Este método funciona porque
+
(junto con muchos otros operadores) funciona por elementos en las listas de Pip, una característica inspirada en lenguajes de programación de matriz como APL. Entonces, cuando le$+
gusta una lista[[1 2 3] [4 5 6]]
, el resultado es el[5 7 9]
deseado. También se usa en la prueba de lista o escalar:[1 2 3] - [1 2 3]
da[0 0 0]
, lo cual es verdadero (como lo son todas las listas excepto la lista vacía).Versión anterior de 18 bytes:
Cambios:
[1 2 3] != 123
);M
tienen una precedencia menor que?
(aunque probablemente voy a cambiar eso, especialmente ahora): sin ellos, el código se analizaría como(Ja=a?af)M(aAE$+a)
, lo que llevaría a mensajes de error extraños. Sin embargo, el argumento central de un operador ternario puede ser cualquier expresión de cualquier precedencia, sin paréntesis. Entonces, al hacer que la lista sea el caso verdadero, puedo guardar esos dos bytes.fuente
APL (25)
Las matrices de APL tienen dimensiones incorporadas, por lo que esta es una función que toma una matriz n- dimensional y luego suma a lo largo de cada dimensión.
Explicación:
N←⍵
: almacena la matriz enN
.⍴⍴N
: obtener la cantidad de dimensiones queN
tiene. (⍴
da las dimensiones, es decir,⍴↑(1 2 3)(4 5 6)
da2 3
, así⍴⍴
da las dimensiones de las dimensiones).{
...}¨⍳
: para cada número del 1 al⍴⍴N
:+/[⍵]N
: suma a loN
largo de la dimensión⍵
N,[⍵]←
: une el resultado aN
esa dimensiónN
: finalmente, vuelveN
.fuente
↑(1 2 3)(4 5 6)
está haciendo es simplemente construir una matriz bidimensional a partir de 2 unidades unidimensionales usando↑
. No es una notación incorporada y no generaliza la forma en que podría pensar. La forma canónica de construir las matrices tercera y cuarta sería1 4 1⍴1 1 1 0
y1 1 1 1⍴¯1
, pero también es posible construirlas sin hacer referencia a los tamaños, por ejemplo, la tercera matriz también se puede construir con↑⍉⍪(,1)(,1)(,1)(,0)
la cuarta con la que se puede construir↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), pero parece que los vectores y matrices anidados son diferentes y el primero no diferencia escalares de singletons ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Fijo:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. Ahora es más corto que Mathematica ...CJam, 36 bytes
Esta es una función recursiva con nombre que saca una matriz de la pila y deja una a cambio.
Pruebe los casos de prueba en el intérprete de CJam .
Idea
Lamentablemente, CJam no tiene algún operador automático que permita agregar matrices anidadas arbitrariamente, por lo que debemos implementarlo nosotros mismos. Afortunadamente, hace que dos operadores infijos,
:
(reducir) y.
(vectorizar), sean útiles para esta tarea.El primer paso es calcular el número de dimensiones. Esto es fácil: convierta la matriz en su representación de cadena y cuente el número de [ 's iniciales.
Ahora, para reducir una matriz de una dimensión, generalmente solo ejecuta
:+
:Para una matriz de dos dimensiones,
+
realizaríamos la concatenación en lugar de la suma, por lo que tenemos que vectorizarla:Ahora, para una matriz de tres dimensiones,
.+
operaría en matrices de dos dimensiones y realizaría, una vez más, concatenación. Esta vez, tenemos que vectorizar.+
:Para el caso general, una matriz de dimensión D , tenemos que encadenar uno
:
, D - 1.
y uno+
.Por supuesto, esto solo suma la matriz solo en su dimensión más externa. Podemos resolver esto definiendo una función S que calcule la dimensión (y no haga nada si es cero), realiza la suma como se indicó anteriormente y, finalmente, se aplica a los elementos de la matriz.
Código
fuente
Rubí (
181139119108 bytes)Asume que la entrada se pasa como JSON.
fuente
d
en esta respuesta.Java, 669 bytes
no voy a mentir, estoy bastante orgulloso de mí mismo por este: p
ampliado con pruebas:
ejecutar la versión de prueba ampliada imprime esto:
fuente