Der Matrix-Tornado ist wie jeder andere Tornado: Er besteht aus Dingen, die sich um ein Zentrum drehen. In diesem Fall Elemente der Matrix anstelle von Luft.
Hier ist ein Beispiel für einen Matrix-Tornado:
Zunächst unterteilen wir die Matrix in quadratische Ringe, wobei jeder Abschnitt aus Elementen besteht, die um denselben Abstand vom Rand entfernt sind. Diese Abschnitte werden im Uhrzeigersinn um die Mitte gedreht. Bei echten Tornados nimmt der Schweregrad zur Mitte hin zu, ebenso wie der Rotationsschritt bei einem Matrix-Tornado: Der äußerste Abschnitt (der rote) wird um 1 Schritt gedreht, der nächste (der gelbe) um 2, und so weiter auf. Ein Rotationsschritt ist eine 90 ° -Drehung um das Zentrum.
Aufgabe:
Ihre Aufgabe ist es, eine Funktion oder ein Programm zu schreiben, das eine quadratische Matrix als Eingabe verwendet, den Tornado-Effekt darauf anzuwenden und dann die resultierende Matrix auszugeben.
Eingang:
Die Eingabe sollte eine quadratische Matrix der Reihenfolge sein, n
in der n >= 1
. Es ist keine Annahme über die Elemente der Matrix zu treffen, sie könnten alles sein.
Ausgabe:
Eine quadratische Matrix derselben Ordnung, die das Ergebnis der Anwendung des Tronado-Effekts auf die Eingangsmatrix wäre.
Beispiele:
Eine Matrix der Ordnung n = 1
:
[['Hello']] ===> [['Hello']]
Eine Matrix der Ordnung n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Eine Matrix der Ordnung n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Antworten:
Python 3 , 100 Bytes
Probieren Sie es online!
quelle
a[1:-1,1:-1]=f(a[1:-1,1:-1])
als wäre es die normalste Sache der Welt, das gesamte Innere eines zweidimensionalen Arraysnumpy
numpy.rot90(a,1,(1,0))
ist um 3 Bytes kürzer und sollte auch funktionieren.if len(a):a=...
für -1 Byte).Kohle , 44 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Funktioniert nur auf Zeichenfeldern, da Charcoals Standard-E / A normalen Arrays nicht gerecht wird. Erläuterung:
Lesen Sie das Zeichenfeld.
Schleife, bis es leer ist.
Drehe es.
Drucken Sie es aus, und bewegen Sie den Cursor von der ursprünglichen Ecke aus auf ein Quadrat diagonal nach innen.
Schneiden Sie die Außenseite vom Array ab.
quelle
Gelee , 27 Bytes
Probieren Sie es online!
Ich denke, das könnte viel kürzer sein.
quelle
µG
in die FußzeilePerl 6 ,
78 7372 BytesDanke an nwellnhof für -5 Bytes!
Probieren Sie es online!
Rekursiver Codeblock, der ein abgeflachtes 2D-Array verwendet und ein ähnlich abgeflachtes Array zurückgibt.
Erläuterung:
quelle
@a[*;*]
stattdessen verwendenmap |*,@a
, um das Array zu reduzieren. (Es wäre schön, wenn es eine Möglichkeit gäbe, mit nicht abgeflachten Arrays und mehrdimensionalen Subskripten zu arbeiten, aber mir fällt keine ein.)@a[1..*-2;1..@a-2].=$!
.Oktave ,
8681 BytesProbieren Sie es online!
Ich bin mir bewusst, dass rekursive anonyme Funktionen nicht die kürzeste Methode sind, um Dinge in Octave zu erledigen, aber sie sind bei weitem die unterhaltsamste Methode. Dies ist die kürzeste anonyme Funktion, die ich mir vorstellen konnte, aber ich würde gerne überrumpelt werden.
Erläuterung
Die rekursive Funktion wird nach diesen Tipps von ceilingcat beantwortet.
q=f(f=@(g)@(M) ... g(g)(M) ...
ist die Grundstruktur einer solchen anonymen Funktion mitg(g)(M)
dem rekursiven Aufruf. Da diese auf unbestimmte Zeit Rekursion würde, wickeln wir den rekursiven Aufruf in einem bedingten Zellenfeld:{@()g(g)(M),M}{condition}()
. Die anonyme Funktion mit leerer Argumentliste verzögert die Auswertung, nachdem die Bedingung ausgewählt wurde (obwohl wir später sehen, dass wir diese Argumentliste zum Definieren verwenden könnenz
). Bisher war es nur eine einfache Buchhaltung.Nun zur eigentlichen Arbeit. Wir möchten, dass die Funktion
rot90(P,-1)
mit P eine Matrixg(g)
zurückgibt, die im zentralen Teil von M rekursiv aufgerufen wurde. Wir beginnen mit der Einstellung,z=2:end-1
die wir in der Indizierung von M ausblenden können. Auf diese WeiseM(z,z)
wird der zentrale Teil der Matrix ausgewählt, der benötigt wird durch einen rekursiven Aufruf weiter aufgewühlt werden. Das,3
Teil stellt sicher, dass die Drehungen im Uhrzeigersinn sind. Wenn Sie auf der südlichen Hemisphäre leben, können Sie dieses Bit für -2 Bytes entfernen.Wir machen es dann
M(z,z)=g(g)M(z,z)
. Der Ergebniswert dieser Operation ist jedoch nur der modifizierte zentrale Teil und nicht die gesamteP
Matrix. Daher tun wir das,{M(z,z)=g(g)M(z,z),M}{2}
was Stewie Griffin aus dieser Tippantwort im Grunde genommen gestohlen hat .Schließlich
condition
stoppt die Rekursion nur, wenn die Eingabe leer ist.quelle
R 87 Bytes
Probieren Sie es online!
quelle
seq(0.5)
statt eines leeren Vektors 1 zurückgegeben wird)MATL ,
25 24 2322Probieren Sie es online!
Das Indexieren in MATL ist nie einfach, aber mit etwas Golf schlägt es tatsächlich die aktuell beste Gelee-Antwort ...
* Für eine
n x n
Matrix führt dieses Programmn
Iterationen durch, während Sie wirklich nurn/2
Rotationen benötigen . Die Indizierung in MATL (AB) ist jedoch so flexibel, dass die Indizierung unmöglicher Bereiche nur ein No-Op ist. Auf diese Weise müssen keine Bytes verschwendet werden, um die richtige Anzahl von Iterationen zu erhalten.quelle
Python 2 , 98 Bytes
Probieren Sie es online!
quelle
K (ngn / k) ,
413938 BytesProbieren Sie es online!
{
}
Funktion mit Argumentx
#x
Länge vonx
- die Höhe der Matrix2##x
zwei Kopien - Höhe und Breite (als gleich vorausgesetzt)s:
zuweisens
für "Form"!s
Alle Indizes einer Matrix mit Forms
, beispielsweise!5 5
istDies ist eine 2-zeilige Matrix (Liste von Listen) und ihre Spalten entsprechen den Indizes in einer 5x5-Matrix.
&/
Minimum über die beiden Reihen:i&|i:
zuweiseni
, umkehren (|
) und Minima nehmen (&
) miti
Dies sind die abgeflachten Ringnummern einer 5x5-Matrix:
4!1+
addiere 1 und nimm die restlichen modulo 4(+|:)
ist eine Funktion, die sich umkehrt (|
- wir müssen:
sie zwingen, monadisch zu sein) und dann transponiert (+
- da es nicht das am weitesten rechts stehende Verb im "Zug" ist, brauchen wir kein:
).4(+|:)\x
Wenden Sie es 4-mal aufx
, um Zwischenergebnisse zu erhalten,/'
jeweils abflachen+
transponieren(
)@'
Indizieren Sie jeden Wert auf der linken Seite mit jedem Wert auf der rechten Seites#
umformen zus
quelle
JavaScript (ES6), 99 Byte
Probieren Sie es online!
Wie?
Wir beginnen mitk = m und führen Sie eine Drehung aller Zellen um 90 ° im Uhrzeigersinn durch ( x , y) befriedigend:
während die anderen unverändert bleiben.
Dies bedeutet, dass eine Zelle nicht gedreht wird, wenn Folgendes vorliegt:
Welcher Test wird im Code verwendet:
Dann dekrementieren wirk und fange nochmal an, bis k = - 1 oder k = - 3 / 2 (abhängig von der Parität von W ). In jedem Fall löst es unseren Haltezustand aus:
quelle
Gelee , 24 Bytes
Probieren Sie es online!
- Lynn
quelle
ḷ""
sieht für mich magisch aus ^^ Möchtest du eine Erklärung hinzufügen?ḷ""
es magisch ist. Es ist nurḷ"
mit einem Extra"
... oh, es gibt eine kleine Möglichkeit, dieḷ"
ich auch "erfunden" habe und die nicht so oft verwendet wurde, da sie oft durch ein einzelnes Atom ersetzt werden kann (in diesem Fall nicht als das Eingabe kann auch enthalten0
).Haskell , 108 Bytes
Probieren Sie es online!
Ich habe Laikonis Transponierte benutzt und ein wenig modifiziert, um ein Array um 90 ° zu drehen:
Erläuterung
r
Dreht ein Array um 90 °.(!)
ist eine übergeordnete Funktion: „Auf Mitte anwenden“.g![1,2,3,4,5]
ist[1] ++ g[2,3,4] ++ [5]
.f
ist die Tornado-Funktion: Die Basisfälle sind Größe 1 und 2 (irgendwie funktioniert 0 nicht).In der letzten Zeile geschieht die Magie: Wir wenden
r.r.r.(f!).r
auf die mittleren Reihen von anx
und drehen dann das Ergebnis. Nennen wir diese mittleren Reihen M . Wir wollen auf die mittleren Spalten von M zurückgreifen , und um an diese heranzukommen , können wir M drehen und dann verwenden(f!)
. Dannr.r.r
drehen wir M zurück in seine ursprüngliche Ausrichtung.quelle
Java 10,
198192 Bytes-6 Bytes dank @ceilingcat .
Probieren Sie es online aus.
Erläuterung:
b
wird im Grunde genommen verwendet, um anzuzeigen, an welchem Ring wir gerade sind. Und dann dreht es diesen Ring, einschließlich allem, was sich darin befindet, einmal im Uhrzeigersinn während jeder Iteration.Das Ersetzen der Eingabematrix erfolgt, weil Java als Referenz übergeben wird.
r=m
Wenn Sie also einfach festlegen, werden beim Kopieren aus Zellen beide Matrizen geändert, was zu falschen Ergebnissen führt. Wir müssen daher eine neueObject
Matrix (neue Referenz) erstellen und stattdessen die Werte nacheinander in jede Zelle kopieren.quelle
MATLAB, 93 Bytes
Ich bin sicher, das kann man noch irgendwie spielen.
Erläuterung
quelle
C (GCC) ,
128118115 Bytes-15 Bytes von @ceilingcat
Probieren Sie es online!
quelle
Haskell, 274 Bytes
w
ist die Hauptfunktion, die den Typ hat[[a]] -> [[a]]
, den Sie erwarten würden.Ich bin sicher, dass ein erfahrener Haskell-Golfer dies verbessern könnte.
quelle