Gracias a Dennis por jugar dos bytes de mi enfoque recursivo anterior.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
Pruébalo en línea! o Ver un conjunto de pruebas.
Python 2 , 80 81 83 85 bytes (no recursivo)
Toma la entrada como una lista singleton .
l=input()
exec"l+=zip(*l[-1][::-1]),;"*3
print[map(sum,zip(*d))for d in zip(*l)]
Pruébalo en línea!
Funcionalidad de código
Dado que esto es bastante largo para analizarlo en su conjunto, vamos a verlo pieza por pieza:
f = lambda *l: # This defines a lambda-function that can accept any number
# of arguments (the matrix) using starred expressions.
l[3:] and ...X... or ...Y... # If l[3:] is truthy (that is, the length of the list is
# higher than 3), return X, otherwise Y.
[map(sum,zip(*d))for d in zip(*l)] # The first expression, X.
[ ] # Start a list comprehension, that:
for d in # ... Iterates using a variable d on:
zip(*l) # ... The "input", l, transposed.
zip(*d) # ... And for each d, transpose it...
map(sum, ) # ... And compute the sum of its rows.
# The last two steps sum the columns of d.
f(zip(*l[0][::-1]),*l) # The second expression, Y. This is where the magic happens.
f( ) # Call the function, f with the following arguments:
zip(* ) # ... The transpose of:
l[0][::-1] # ...... The first element of l (the first arg.), reversed.
, # And:
*l # ... l splatted. Basically turns each element of l
# into a separate argument to the function.
Y para el segundo programa:
l=input() # Take input and assign it to a variable l.
# Note that input is taken as a singleton list.
exec"l+=zip(*l[-1][::-1]),;"*3 # Part 1. Create the list of rotations.
exec" ;"*3 # Execute (Do) the following 3 times:
l+= , # ... Append to l the singleton tuple:
zip(* ) # ...... The transpose of:
l[-1][::-1] # ......... The last element of l, reversed.
print[map(sum,zip(*d))for d in zip(*l)] # Part 2. Generate the matrix of sums.
print # Output the result of this expression:
[ for d in ] # Create a list comprehension, that iterates
# with a variable called "d" over:
zip(*l) # ... The transpose of l.
map(sum, ) # ... And computes the sum:
zip(*d) # ... Of each row in d's transpose.
# The last 2 steps generate the column sums.
TL; DR: Genere la lista de matrices necesarias girando la entrada 3 veces en 90 grados y recopilando los resultados. Luego, obtenga las sumas de las columnas de cada matriz en la transposición del resultado.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
guarda dos bytes con entrada "normal". Pruébalo en línea!lambda*l
no era posible en Python 2 por alguna razón.x,*y=1,2,3
en Python 2.7 o[*x]
en Python 3.4, pero las expresiones destacadas se pueden usar para argumentos de función incluso en Python 1.6. Pruébalo en línea!Octava , 29 bytes
Pruébalo en línea!
Explicación
Esto agrega la matriz de entrada con una versión girada de 90 grados de sí misma. El resultado se agrega luego con una versión girada de 180 grados de sí mismo.
fuente
Limpio , 110 bytes
Pruébalo en línea!
De las matrículas:
X = transpose(reverse M)
: Rotación de 90 gradosY = reverse(map reverse M)
: Rotación de 180 gradosZ = reverse(transpose M)
: Rotación de 270 gradosEsto comprime el operador de suma sobre
M
yX
, así comoY
yZ
, y luego sobre los resultados.fuente
Wolfram Language (Mathematica) , 28 bytes
es\[Transpose]
.Pruébalo en línea!
fuente
ReplacePart[#,{a_,b_}:>Tr@Extract[#,{{a,b},{b,-a},{-a,-b},{-b,a}}]]&
y tambiénPlus@@NestList[Reverse@#&,#,3]&
Julia 0.6 , 29 bytes
Pruébalo en línea!
No pude ponerme debajo de la solución de LukeS
Pero al intentarlo se me ocurrió esto, que creo que es un poco lindo.
Primero redefinimos la multiplicación para que sea la operación de rotación, donde la primera vez es la cantidad de veces que se rota. Entonces, desde julia multipie por yuxtaposición, entonces: se
1x
convierterotr90(x,1)
y se3x
convierte enrotr90(x,3)
etc.Luego escribimos la suma.
fuente
Julia 0.6 ,
2824 bytesPruébalo en línea!
fuente
[1]
ejemplo debería hacerlo~reshape([1], (1,1))
porque así es como se declara una matriz 1x1 en julia 0.6.Jalea , 7 bytes
Pruébalo en línea!
fuente
MATL , 9 bytes
Pruébalo en MATL Online
Explicación
fuente
Octava , 33 bytes
Pruébalo en línea!
Explicación:
(r=@rot90)
en una forma en línea de crear un controlador de funciónr
utilizado para rotar la matriz 90 grados. Si un segundo argumento,k
se da ar
continuación, girará las matricesk*90
grados. Entonces esto es equivalente al pseudocódigo:fuente
Pyth , 13 bytes
Pruébalo en línea!
fuente
J ,
1615 bytesPruébalo en línea!
fuente
^:
. Solución inteligente!MATL , 7 bytes
¡Pruébalo en MATL Online!
Explicación
Puerto de mi octava respuesta.
fuente
R ,
6964 bytesPruébalo en línea!
Intento número tres en codegolf. ¡De 69 a 64 bytes gracias a Giuseppe!
fuente
a
a un argumento de función ahorrará bytes al permitirle deshacerse del{}
cuerpo de la función. Además, ¿portar el enfoque de octava de Luis Mendo podría ahorrar algunos bytes? Finalmente, no estoy 100% seguro pero est(apply(x,2,rev))
equivalente aapply(x,1,rev)
?n
aa()
repetir la operación sin embargo.APL (Dyalog Classic) , 8 bytes
Pruébalo en línea!
fuente
Pari / GP , 31 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 77 bytes
fuente
Jalea , 7 bytes
Pruébalo en línea!
Guardado 1 byte gracias a Erik the Outgolfer (también gracias a una sugerencia para corregir un error).
¿Cómo?
fuente
Python 2 , 76 bytes
Pruébalo en línea!
fuente
APL (Dyalog Classic) , 17 bytes
Pruébalo en línea!
NARS APL 34bytes
2117 caracteres-2 caracteres gracias a ngn
-2 caracteres porque el operador compuesto ∘ parece tener prioridad sobre +
parece ⌽⍉a rotar a de 90 °, ⌽⊖a rotar a de 180 °, ⌽⍉⌽⊖a rotar a de 270 ° como ⍉⌽
Si existe el operador p como:
El operador p anterior sería tal que si g es una función de 1 argumento (¿monádico?) Debería ser:
la solución sería pheraps 15 chars
Pero podría ser mejor un operador "compuesto n tiempo" d tal que "3 df w" es f (f (f (w))).
Ahora escribí algo pero es demasiado frágil sin la necesidad de verificar el tipo.
Pero me gusta más el operador q que repite componer de f con argumento m (no está completo porque los casos de error de los tipos no están escritos)
la solución sería 17 caracteres pero lo prefiero
fuente
⍉⌽
y toda la cosa es adecuado para un tren+/⌽∘⍉f 4⍴⊂⍵
? Para obtener cuatro copias⍵
, primero debe adjuntarlo con⊂
. Tener⌽⍉
como operando af
, debe componer en una única función como esta:⌽∘⍉
. Lo misteriosof
podría ser el escaneo (barra invertida), pero hay otro detalle que⌽∘⍉
se debe tener en cuenta: obtendrá un argumento izquierdo, por lo que debemos hacer que lo ignore:+/{⌽⍉⍵}\4⍴⊂⍵
o+/⊢∘⌽∘⍉\4⍴⊂⍵
.⊢ + ⌽∘⍉ + ⌽∘⊖ + ⍉∘⌽
. Eso puede conducir a soluciones aún más cortas si reorganiza los garabatos de manera inteligente y hace un buen uso de los trenes.K4 / K (oK) ,
238 bytesSolución:
Pruébalo en línea!
Ejemplo:
Explicación:
Gracias a ngn por la técnica de transformación simplificada.
Extra:
En Q esto podría escribirse como
fuente
+/{|+x}\
Ruby ,
74 7266 bytesPruébalo en línea!
Esto funciona elemento por elemento, encontrando los elementos asociados matemáticamente, en lugar de rotar la matriz. La parte clave es
i,j=j,~i
, que gira (i, j) en sentido horario 90 grados.-2 bytes gracias al Sr. Xcoder
-6 bytes debido a
sum
fuente
Pitón 3 ,
105102 bytes3 bytes gracias al Sr. Xcoder.
Pruébalo en línea!
fuente
Ruby
8979 bytes-10 bytes gracias a Unihedron
Pruébalo en línea!
fuente
.map &:dup
con*1
cortar una gran cantidad de caracteres.array*length
crea una nueva matriz y es una forma práctica de clonar poco profundo.n=*m
es aún más corto.transpose
se encarga de eso05AB1E , 12 bytes
Pruébalo en línea!
fuente
Haskell ,
84 8367 bytesPruébalo en línea!
¡Gracias a Laikoni y totalmente humano por guardar muchos bytes!
fuente
Casco , 9 bytes
Pruébalo en línea!
Explicación
fuente
tinylisp , 132 bytes
¡Vamos a probar la función de biblioteca recientemente agregada
transpose
!La última línea es una función lambda sin nombre que realiza la suma de rotación. Para usarlo realmente, querrás usarlo
d
para vincularlo a un nombre. Pruébalo en línea!Ungolfed, con comentarios
fuente
Adjunto , 20 bytes
Pruébalo en línea!
Explicación
MatrixRotate&0:3
expande para, con la entradax
,MatrixRotate[x, 0:3]
que, a su turno para exapnds[MatrixRotate[x, 0], MatrixRotate[x, 1], MatrixRotate[x, 2], MatrixRotate[x, 3]]
. Es decir, se vectoriza sobre el RHS. Luego,Sum
toma la suma de todas estas matrices en un nivel. Esto da el resultado deseado.fuente
Java 8,
135133 bytes-2 bytes gracias a @ceilingcat .
Explicación:
Pruébalo en línea.
fuente