Merci à Dennis d' avoir joué deux octets sur ma précédente approche récursive.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
Essayez-le en ligne! ou Voir une suite de tests.
Python 2 , 80 81 83 85 octets (non récursif)
Prend l'entrée en tant que liste singleton .
l=input()
exec"l+=zip(*l[-1][::-1]),;"*3
print[map(sum,zip(*d))for d in zip(*l)]
Essayez-le en ligne!
Fonctionnalité de code
Comme c'est assez long pour l'analyser dans son ensemble, examinons-le morceau par morceau:
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.
Et pour le deuxième programme:
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: générer la liste des matrices nécessaires en faisant tourner l'entrée 3 fois de 90 degrés et en collectant les résultats. Ensuite, récupérez les sommes des colonnes de chaque matrice dans la transposition du résultat.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
enregistre deux octets avec une entrée "normale". Essayez-le en ligne!lambda*l
n'était pas possible dans Python 2 pour une raison quelconque.x,*y=1,2,3
en Python 2.7 ou[*x]
en Python 3.4, mais les expressions étoilées peuvent être utilisées pour les arguments de fonction même en Python 1.6. Essayez-le en ligne!Octave , 29 octets
Essayez-le en ligne!
Explication
Cela ajoute la matrice d'entrée avec une version pivotée de 90 degrés d'elle-même. Le résultat est ensuite ajouté avec une version pivotée à 180 degrés de lui-même.
la source
Propre , 110 octets
Essayez-le en ligne!
Des matricies:
X = transpose(reverse M)
: Rotation à 90 degrésY = reverse(map reverse M)
: Rotation à 180 degrésZ = reverse(transpose M)
: Rotation à 270 degrésCela zippe l'opérateur d'addition sur
M
etX
, ainsi queY
etZ
, puis sur les résultats.la source
Wolfram Language (Mathematica) , 28 octets
est\[Transpose]
.Essayez-le en ligne!
la source
ReplacePart[#,{a_,b_}:>Tr@Extract[#,{{a,b},{b,-a},{-a,-b},{-b,a}}]]&
et aussiPlus@@NestList[Reverse@#&,#,3]&
Julia 0,6 , 29 octets
Essayez-le en ligne!
Je ne pouvais pas descendre en dessous de la solution de LukeS
Mais en essayant, j'ai trouvé cela, qui je pense est plutôt mignon.
D'abord, nous redéfinissons la multiplication comme étant l'opération de rotation, où il y a la première fois le nombre de rotations. Donc depuis julia multipes par juxtaposition alors:
1x
devientrotr90(x,1)
et3x
devientrotr90(x,3)
etc.Ensuite, nous écrivons la somme.
la source
Julia 0,6 ,
2824 octetsEssayez-le en ligne!
la source
[1]
exemple devrait faire~reshape([1], (1,1))
parce que c'est ainsi qu'une matrice 1x1 est déclarée en julia 0.6.Gelée , 7 octets
Essayez-le en ligne!
la source
MATL , 9 octets
Essayez-le sur MATL Online
Explication
la source
Octave , 33 octets
Essayez-le en ligne!
Explication:
(r=@rot90)
d'une manière en ligne de créer une poignée de fonctionr
utilisée pour faire pivoter la matrice de 90 degrés. Si un deuxième argumentk
est donné,r
il fera pivoter lesk*90
degrés de la matrice . C'est donc équivalent au pseudo code:la source
Pyth , 13 octets
Essayez-le en ligne!
la source
J ,
1615 octetsEssayez-le en ligne!
la source
^:
. Solution intelligente!MATL , 7 octets
Essayez-le sur MATL Online!
Explication
Port de ma réponse Octave.
la source
R ,
6964 octetsEssayez-le en ligne!
Tentez le numéro trois au codegolf. De 69 à 64 octets grâce à Giuseppe!
la source
a
à un argument de fonction économisera des octets en vous permettant de vous débarrasser du{}
corps de la fonction. De plus, le portage de l'approche Octave de Luis Mendo pourrait économiser quelques octets? Enfin, je ne suis pas sûr à 100% maist(apply(x,2,rev))
équivaut àapply(x,1,rev)
?n
àa()
pour répéter l'opération.APL (Dyalog Classic) , 8 octets
Essayez-le en ligne!
la source
Pari / GP , 31 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 77 octets
la source
Gelée , 7 octets
Essayez-le en ligne!
Enregistré 1 octet grâce à Erik l'Outgolfer (également grâce à une suggestion de correction d'un bug).
Comment?
la source
Python 2 , 76 octets
Essayez-le en ligne!
la source
APL (Dyalog Classic) , 17 octets
Essayez-le en ligne!
APL NARS 34 octets
2117 caractères-2 caractères grâce à ngn
-2 car car l'opérateur composite ∘ semble avoir la priorité sur +
il semble ⌽⍉a tourner a de 90 °, ⌽⊖a tourner a de 180 °, ⌽⍉⌽⊖a tourner a de 270 ° comme ⍉⌽
S'il existe l'opérateur p comme:
L'opérateur p ci-dessus serait tel que si g est une fonction à 1 argument (monadique?) Elle devrait être:
la solution serait phéraps 15 caractères
Mais pourrait être meilleur un opérateur "composé de n temps" d tel que "3 df w" soit f (f (f (w))).
Maintenant, j'ai écrit quelque chose, mais il est trop fragile sans avoir besoin de vérifier le type.
Mais j'aime plus l'opérateur q qui répète compose de f avec l'argument m (il n'est pas complet car les cas d'erreur des types ne sont pas écrits)
la solution serait de 17 caractères mais je la préfère
la source
⍉⌽
et le tout convient à un train+/⌽∘⍉f 4⍴⊂⍵
? Pour obtenir quatre exemplaires de⍵
, vous devez d’abord le joindre à⊂
. Avoir⌽⍉
comme un opérandef
, vous devez composer en une seule fonction comme ceci:⌽∘⍉
. Le mystérieuxf
pourrait être scan (barre oblique inverse), mais il y a un autre détail à prendre en charge -⌽∘⍉
obtiendra un argument de gauche, nous devons donc le faire ignorer:+/{⌽⍉⍵}\4⍴⊂⍵
ou+/⊢∘⌽∘⍉\4⍴⊂⍵
.⊢ + ⌽∘⍉ + ⌽∘⊖ + ⍉∘⌽
. Cela peut conduire à des solutions encore plus courtes si vous réorganisez intelligemment les gribouillis et faites bon usage des trains.K4 / K (oK) ,
238 octetsSolution:
Essayez-le en ligne!
Exemple:
Explication:
Merci à ngn pour la technique de transformation simplifiée.
Supplémentaire:
En Q, cela pourrait s'écrire
la source
+/{|+x}\
Rubis ,
74 7266 octetsEssayez-le en ligne!
Cela fonctionne élément par élément, en trouvant mathématiquement les éléments associés, au lieu de faire pivoter le tableau. La partie clé est
i,j=j,~i
, qui tourne (i, j) de 90 degrés dans le sens des aiguilles d'une montre.-2 octets grâce à M. Xcoder
-6 octets en raison de
sum
la source
Python 3 ,
105102 octets3 octets grâce à M. Xcoder.
Essayez-le en ligne!
la source
Ruby
8979 octets-10 octets grâce à Unihedron
Essayez-le en ligne!
la source
.map &:dup
par*1
pour couper un grand nombre de caractères.array*length
crée un nouveau tableau et est un moyen pratique de cloner peu profond.n=*m
c'est encore plus court.transpose
05AB1E , 12 octets
Essayez-le en ligne!
la source
Haskell ,
84 8367 octetsEssayez-le en ligne!
Merci à Laikoni et totalement humain d' avoir économisé beaucoup d'octets!
la source
Coque , 9 octets
Essayez-le en ligne!
Explication
la source
tinylisp , 132 octets
Prenons la fonction de bibliothèque récemment ajoutée
transpose
pour un tour!La dernière ligne est une fonction lambda sans nom qui effectue la sommation de rotation. Pour l'utiliser réellement, vous voudrez l'utiliser
d
pour le lier à un nom. Essayez-le en ligne!Non golfé, avec commentaires
la source
Attaché , 20 octets
Essayez-le en ligne!
Explication
MatrixRotate&0:3
se dilate pour, avec l' entréex
,MatrixRotate[x, 0:3]
qui , à son tour , à exapnds[MatrixRotate[x, 0], MatrixRotate[x, 1], MatrixRotate[x, 2], MatrixRotate[x, 3]]
. C'est-à-dire qu'il vectorise sur le RHS. Ensuite,Sum
prend la somme de toutes ces matrices d'un niveau. Cela donne le résultat souhaité.la source
Java 8,
135133 bytes-2 octets grâce à @ceilingcat .
Explication:
Essayez-le en ligne.
la source