Vielen Dank an Dennis, der zwei Bytes von meinem vorherigen rekursiven Ansatz abgezogen hat.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
Probieren Sie es online! oder Sehen Sie sich eine Testsuite an.
Python 2 , 80 81 83 85 Bytes (nicht rekursiv)
Übernimmt die Eingabe als Singleton-Liste .
l=input()
exec"l+=zip(*l[-1][::-1]),;"*3
print[map(sum,zip(*d))for d in zip(*l)]
Probieren Sie es online!
Code-Funktionalität
Da es ziemlich langwierig ist, es als Ganzes zu analysieren, sollten wir es Stück für Stück überprüfen:
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.
Und für das zweite Programm:
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: Generieren Sie die Liste der benötigten Matrizen, indem Sie die Eingabe dreimal um 90 Grad drehen und die Ergebnisse sammeln. Dann erhalten Sie die Summen der Spalten jeder Matrix in der Transponierung des Ergebnisses.
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
Speichert zwei Bytes bei "normaler" Eingabe. Probieren Sie es online!lambda*l
dass Python 2 aus irgendeinem Grund nicht möglich ist.x,*y=1,2,3
in Python 2.7 oder[*x]
Python 3.4 nicht möglich, aber Ausdrücke mit Sternchen können auch in Python 1.6 für Funktionsargumente verwendet werden. Probieren Sie es online!Oktave , 29 Bytes
Probieren Sie es online!
Erläuterung
Dies fügt die Eingabematrix mit einer um 90 Grad gedrehten Version von sich selbst hinzu. Das Ergebnis wird dann mit einer um 180 Grad gedrehten Version von sich selbst hinzugefügt.
quelle
Sauber , 110 Bytes
Probieren Sie es online!
Aus den Matricies:
X = transpose(reverse M)
: 90-Grad-DrehungY = reverse(map reverse M)
: 180-Grad-DrehungZ = reverse(transpose M)
: 270-Grad-DrehungDadurch wird der Additionsoperator über
M
undX
sowieY
undZ
und dann über die Ergebnisse gezippt.quelle
Wolfram Language (Mathematica) , 28 Byte
ist\[Transpose]
.Probieren Sie es online!
quelle
ReplacePart[#,{a_,b_}:>Tr@Extract[#,{{a,b},{b,-a},{-a,-b},{-b,a}}]]&
und auchPlus@@NestList[Reverse@#&,#,3]&
Julia 0,6 , 29 Bytes
Probieren Sie es online!
Ich konnte nicht unter die Lösung von LukeS kommen
Aber als ich es versuchte, habe ich mir das ausgedacht, was ich irgendwie süß finde.
Zuerst definieren wir die Multiplikation neu, um die Rotationsoperation zu sein, wobei das erste Mal die Anzahl der Rotationen ist. Da sich Julia also durch Nebeneinander vermehrt,
1x
wirdrotr90(x,1)
und3x
wird sierotr90(x,3)
usw.Dann schreiben wir die Summe aus.
quelle
Julia 0,6 ,
2824 BytesProbieren Sie es online!
quelle
[1]
Beispiels dies tun sollte,~reshape([1], (1,1))
da auf diese Weise eine 1x1-Matrix in Julia 0.6 deklariert wird.Gelee , 7 Bytes
Probieren Sie es online!
quelle
MATL , 9 Bytes
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
Oktave , 33 Bytes
Probieren Sie es online!
Erläuterung:
(r=@rot90)
Inline-Erstellung eines Funktionshandlesr
zum Drehen der Matrix um 90 Grad. Wenn ein zweites Argumentk
angegeben wird,r
wird die Matrix umk*90
Grad gedreht. Das entspricht also dem Pseudocode:quelle
Pyth , 13 Bytes
Probieren Sie es online!
quelle
J ,
16-15BytesProbieren Sie es online!
quelle
^:
. Clevere Lösung!MATL , 7 Bytes
Probieren Sie es bei MATL Online!
Erläuterung
Port meiner Oktavantwort.
quelle
R ,
6964 BytesProbieren Sie es online!
Versuch Nummer drei beim Codegolf. 69 bis 64 Bytes dank Giuseppe!
quelle
a
zu einem Funktionsargument wechseln, werden Bytes gespart, da Sie den gesamten{}
Funktionskörper entfernen können. Auch das Portieren von Luis Mendos Octave-Ansatz könnte einige Bytes sparen? Schließlich bin ich nicht 100% sicher, aber istt(apply(x,2,rev))
gleichbedeutend mitapply(x,1,rev)
?n
zu ,a()
obwohl die Operation zu wiederholen.APL (Dyalog Classic) , 8 Byte
Probieren Sie es online!
quelle
Pari / GP , 31 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 77 Byte
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Dank Erik the Outgolfer 1 Byte gespeichert (auch dank eines Vorschlags zur Behebung eines Fehlers).
Wie?
quelle
Python 2 , 76 Bytes
Probieren Sie es online!
quelle
APL (Dyalog Classic) , 17 Byte
Probieren Sie es online!
APL NARS 34 Bytes
2117 Zeichen-2 Zeichen dank ngn
-2 Zeichen, da der Operator Composite ∘ Vorrang vor + zu haben scheint
Es scheint, als ob Sie a von 90 ° drehen, a von 180 ° drehen, a von 270 ° drehen als
Wenn vorhanden, ist der Operator p als:
Der obige Operator p wäre so, dass wenn g eine 1-Argument-Funktion ist (monadisch?), Es sein sollte:
Die Lösung wären 15 Zeichen
Könnte aber besser ein Operator sein, der n-mal so "zusammengesetzt" ist, dass "3 df w" f (f (f (w))) ist.
Jetzt habe ich etwas geschrieben, aber es ist zu zerbrechlich, ohne dass man den Typ überprüfen muss.
Aber ich mag eher den Operator q, der die Wiederholung von f mit dem Argument m schreibt (es ist nicht vollständig, weil die Fehlerfälle der Typen nicht geschrieben sind).
Die Lösung wäre 17 Zeichen, aber ich bevorzuge es
quelle
⍉⌽
und das Ganze ist für einen Zug geeignet+/⌽∘⍉f 4⍴⊂⍵
? Um vier Exemplare zu erhalten⍵
, sollten Sie sie zuerst beilegen⊂
. Haben⌽⍉
als Operand zuf
können, müssen sie in eine einzige Funktion wie folgt zusammensetzen :⌽∘⍉
. Das Mysteriösef
könnte Scan (Backslash) sein, aber es gibt noch ein weiteres Detail, um das man sich kümmern muss -⌽∘⍉
wird ein linkes Argument bekommen, also müssen wir dafür sorgen, dass es ignoriert wird:+/{⌽⍉⍵}\4⍴⊂⍵
oder+/⊢∘⌽∘⍉\4⍴⊂⍵
.⊢ + ⌽∘⍉ + ⌽∘⊖ + ⍉∘⌽
. Das kann zu noch kürzeren Lösungen führen, wenn Sie die Kringel geschickt neu anordnen und die Züge gut ausnutzen.K4 / K (OK) ,
238 BytesLösung:
Probieren Sie es online!
Beispiel:
Erläuterung:
Danke an ngn für die vereinfachte Transformationstechnik.
Extra:
In Q könnte dies geschrieben werden als
quelle
+/{|+x}\
Ruby ,
74 7266 BytesProbieren Sie es online!
Dies funktioniert Element für Element, indem die zugehörigen Elemente mathematisch ermittelt werden, anstatt das Array zu drehen. Der Schlüsselteil ist
i,j=j,~i
, der sich um 90 Grad im Uhrzeigersinn dreht (i, j).-2 Bytes dank Mr. Xcoder
-6 Bytes wegen
sum
quelle
Python 3 ,
105102 Bytes3 Bytes dank Herrn Xcoder.
Probieren Sie es online!
quelle
Ruby
8979 Bytes-10 Bytes dank Unihedron
Probieren Sie es online!
quelle
.map &:dup
mit*1
abzuschneiden vielen Zeichen.array*length
Erstellt ein neues Array und ist eine praktische Möglichkeit, einen flachen Klon zu erstellen.n=*m
ist noch kürzer.transpose
kümmert sich darum05AB1E , 12 Bytes
Probieren Sie es online!
quelle
Haskell ,
84 8367 BytesProbieren Sie es online!
Vielen Dank an Laikoni und totalhuman für das Speichern vieler Bytes!
quelle
Schale , 9 Bytes
Probieren Sie es online!
Erläuterung
quelle
tinylisp , 132 bytes
Nehmen wir die kürzlich hinzugefügte Bibliotheksfunktion
transpose
für einen Dreh!Die letzte Zeile ist eine unbenannte Lambda-Funktion, die eine Rotationssummierung durchführt. Um es tatsächlich zu verwenden, müssen Sie
d
es an einen Namen binden. Probieren Sie es online!Ungolfed, mit Kommentaren
quelle
Attache , 20 Bytes
Probieren Sie es online!
Erläuterung
MatrixRotate&0:3
erweitert , um mit Eingangx
,MatrixRotate[x, 0:3]
, was wiederum zu exapnds[MatrixRotate[x, 0], MatrixRotate[x, 1], MatrixRotate[x, 2], MatrixRotate[x, 3]]
. Das heißt, es wird über die RHS vektorisiert. NimmtSum
dann die Summe aller dieser Matrizen um eine Stufe. Dies ergibt das gewünschte Ergebnis.quelle
Java 8,
135133 Bytes-2 Bytes dank @ceilingcat .
Erläuterung:
Probieren Sie es online aus.
quelle