Agradeço a Dennis por jogar dois bytes fora da minha abordagem recursiva anterior.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
Experimente online! ou Veja uma suíte de testes.
Python 2 , 80 81 83 85 bytes (não recursivo)
Recebe entrada como uma lista de singleton .
l=input()
exec"l+=zip(*l[-1][::-1]),;"*3
print[map(sum,zip(*d))for d in zip(*l)]
Experimente online!
Funcionalidade de código
Como isso é bastante demorado para analisá-lo como um todo, vamos dar uma olhada peça por peça:
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.
E para o 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: Gere a lista de matrizes necessárias girando a entrada 3 vezes por 90 graus e coletando os resultados. Em seguida, obtenha as somas das colunas de cada matriz na transposição do resultado.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
salva dois bytes com a entrada "normal". Experimente online!lambda*l
não era possível no Python 2 por algum motivo.x,*y=1,2,3
no Python 2.7 ou[*x]
no Python 3.4, mas expressões com estrela podem ser usadas para argumentos de função, mesmo no Python 1.6. Experimente online!Oitava , 29 bytes
Experimente online!
Explicação
Isso adiciona a matriz de entrada com uma versão rotacionada em 90 graus de si mesma. O resultado é então adicionado com uma versão girada em 180 graus de si mesmo.
fonte
Limpo , 110 bytes
Experimente online!
Das matrizes:
X = transpose(reverse M)
: Rotação de 90 grausY = reverse(map reverse M)
: Rotação de 180 grausZ = reverse(transpose M)
: Rotação de 270 grausIsso fecha o operador de adição sobre
M
eX
, assim comoY
eZ
, e sobre os resultados.fonte
Wolfram Language (Mathematica) , 28 bytes
é\[Transpose]
.Experimente online!
fonte
ReplacePart[#,{a_,b_}:>Tr@Extract[#,{{a,b},{b,-a},{-a,-b},{-b,a}}]]&
e tambémPlus@@NestList[Reverse@#&,#,3]&
Julia 0.6 , 29 bytes
Experimente online!
Não consegui ficar abaixo da solução do LukeS
Mas, ao tentar, eu pensei nisso, o que eu acho meio fofo.
Primeiro, redefinimos a multiplicação para ser a operação de rotação, onde a primeira vez é o número de vezes para girar. Então, como julia multipes por justaposição, então:
1x
torna - serotr90(x,1)
e3x
torna - serotr90(x,3)
etc.Então escrevemos a soma.
fonte
Julia 0.6 ,
2824 bytesExperimente online!
fonte
[1]
exemplo, deve-se fazer,~reshape([1], (1,1))
porque é assim que uma matriz 1x1 é declarada em julia 0.6.Geléia , 7 bytes
Experimente online!
fonte
MATL , 9 bytes
Experimente no MATL Online
Explicação
fonte
Oitava , 33 bytes
Experimente online!
Explicação:
(r=@rot90)
de uma maneira embutida de criar um identificador de funçãor
usado para girar a matriz 90 graus. Sek
for dado um segundo argumento,r
ele girará osk*90
graus da matriz . Portanto, isso é equivalente ao pseudo-código:fonte
Pitão , 13 bytes
Experimente online!
fonte
J ,
1615 bytesExperimente online!
fonte
^:
. Solução inteligente!MATL , 7 bytes
Experimente no MATL Online!
Explicação
Porto da minha resposta Oitava.
fonte
R ,
6964 bytesExperimente online!
Tentativa número três no codegolf. De 69 a 64 bytes, graças a Giuseppe!
fonte
a
para um argumento de função economizará bytes, permitindo que você se livre do{}
corpo da função. Além disso, portar a abordagem Octave de Luis Mendo pode economizar alguns bytes? Finalmente, não tenho 100% de certeza, mas ét(apply(x,2,rev))
equivalente aapply(x,1,rev)
?n
paraa()
repetir a operação embora.APL (Dyalog Classic) , 8 bytes
Experimente online!
fonte
Pari / GP , 31 bytes
Experimente online!
fonte
JavaScript (ES6), 77 bytes
fonte
Geléia , 7 bytes
Experimente online!
Guardado 1 byte graças a Erik the Outgolfer (também graças a uma sugestão para corrigir um bug).
Quão?
fonte
Python 2 , 76 bytes
Experimente online!
fonte
APL (Dyalog Classic) , 17 bytes
Experimente online!
APL NARS 34bytes
2117 caracteres-2 caracteres graças a ngn
-2 caracteres porque o operador composto ∘ parece ter precedência em +
parece ⌽⍉a gira a de 90 °, ⌽⊖a gira de 180 °, rota gira de 270 ° como ⍉⌽
Se existir, o operador p como:
O operador p acima seria tal que se g for uma função de 1 argumento (monádico?), Deve ser:
a solução seria pheraps 15 caracteres
Mas poderia ser melhor um operador "composto em tempo" d tal que "3 df w" seja f (f (f (w))).
Agora eu escrevi algo, mas é muito frágil sem a necessidade de verificação de tipo.
Mas eu gosto mais do operador q que repete a composição de f com o argumento m (não está completo porque os casos de erro dos tipos não estão escritos)
a solução seria 17 caracteres, mas eu prefiro
fonte
⍉⌽
e a coisa toda é adequada para um trem+/⌽∘⍉f 4⍴⊂⍵
? Para obter quatro cópias⍵
, primeiro você deve anexá-lo⊂
. Ter⌽⍉
como um operando paraf
, você deve compor-lo em uma única função como esta:⌽∘⍉
. O misteriosof
pode ser varrido (barra invertida), mas há outro detalhe a ser resolvido -⌽∘⍉
receberá um argumento à esquerda, portanto devemos ignorá-lo:+/{⌽⍉⍵}\4⍴⊂⍵
ou+/⊢∘⌽∘⍉\4⍴⊂⍵
.⊢ + ⌽∘⍉ + ⌽∘⊖ + ⍉∘⌽
. Isso pode levar a soluções ainda mais curtas se você reorganizar os rabiscos de maneira inteligente e fazer bom uso dos trens.K4 / K (oK) ,
238 bytesSolução:
Experimente online!
Exemplo:
Explicação:
Agradecemos a ngn pela técnica de transformação simplificada.
Extra:
Em Q isso pode ser escrito como
fonte
+/{|+x}\
Ruby ,
74 7266 bytesExperimente online!
Isso funciona elemento a elemento, localizando matematicamente os elementos associados, em vez de girar a matriz. A parte principal é
i,j=j,~i
, que gira (i, j) no sentido horário 90 graus.-2 bytes graças ao Sr. Xcoder
-6 bytes por causa de
sum
fonte
Python 3 ,
105102 bytes3 bytes graças ao Sr. Xcoder.
Experimente online!
fonte
Ruby
8979 bytes-10 bytes graças ao Unihedron
Experimente online!
fonte
.map &:dup
por*1
para cortar muitos caracteres.array*length
cria uma nova matriz e é uma maneira útil de clonar superficialmente.n=*m
é ainda mais curto.transpose
cuida disso #05AB1E , 12 bytes
Experimente online!
fonte
Haskell ,
84 8367 bytesExperimente online!
Obrigado a Laikoni e totalmente humano por economizar muitos bytes!
fonte
Casca , 9 bytes
Experimente online!
Explicação
fonte
tinylisp , 132 bytes
Vamos dar
transpose
uma volta na função de biblioteca recentemente adicionada !A última linha é uma função lambda sem nome que executa a soma da rotação. Para realmente usá-lo, você precisará usá
d
-lo para vinculá-lo a um nome. Experimente online!Ungolfed, com comentários
fonte
Anexo , 20 bytes
Experimente online!
Explicação
MatrixRotate&0:3
expande-se para, com entradax
,MatrixRotate[x, 0:3]
que, por sua vez, para exapnds[MatrixRotate[x, 0], MatrixRotate[x, 1], MatrixRotate[x, 2], MatrixRotate[x, 3]]
. Ou seja, vetoriza sobre o RHS. Em seguida,Sum
assume a soma de todas essas matrizes em um nível. Isso fornece o resultado desejado.fonte
Java 8,
135133 bytes-2 bytes graças a @ceilingcat .
Explicação:
Experimente online.
fonte