Interlaced-Rotationen


25

Herausforderung

Drehen Sie bei einer quadratischen Zeichenmatrix (druckbare Einzelbyte-ASCII-Zeichen) jeden "Ring" der Matrix in entgegengesetzte Richtungen.

Nehmen wir ein Beispiel:

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

Dann wird der äußerste Ring wie folgt um 90 Grad im Uhrzeigersinn gedreht:

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

Der zweite Ring wird um 90 Grad gegen den Uhrzeigersinn gedreht:

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

Der letzte Ring wird um 90 Grad im Uhrzeigersinn gedreht. Da es sich jedoch um eine einzelne Zahl handelt (in unserem Beispiel um einen Buchstaben), ist dies nicht wirklich betroffen.

Das Endergebnis ist:

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

Wenn die Matrix eine gerade Seitenlänge hat, ist der innerste Ring ein 2x2-Quadrat und sollte immer noch gedreht werden.

Eingang

Eine Liste von Listen in einem angemessenen Standardformat. Beispielsweise ist eine durch Zeilenumbrüche oder Leerzeichen getrennte Zeichenfolge oder eine Liste von durch Leerzeichen getrennten Zeichenfolgen zulässig, eine Liste der Werte als Ringe um die Matrix ist jedoch nicht zulässig. Die Zeichen sind nicht unbedingt eindeutig.

Ausgabe

Eine Liste von Listen in einem angemessenen Standardformat. Gleiche Regeln wie die Eingabe.

Testfälle

1 2 3    7 4 1
4 5 6 => 8 5 2
7 8 9    9 6 3

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

Credits

Stark inspiriert von einer ähnlichen Herausforderung , bei der jedes Element um eine Position gegen den Uhrzeigersinn gedreht wird (nicht um 90 Grad).



@ rahnema1 Richtig, ich erinnere mich an diesen Beitrag. Dieser Beitrag ist hauptsächlich von diesem inspiriert. Ich werde es gutschreiben. Vielen Dank!
HyperNeutrino

@ Mr.Xcoder Hoppla. Sie haben recht, danke.
HyperNeutrino

@HyperNeutrino können wir die Dimension der Matrix als Teil der Eingabe nehmen?
Uriel

Alle Zeichen in Ihren Beispielen sind eindeutig. Wird das immer so sein?
Dennis

Antworten:


9

Haskell , 94 Bytes

Eine anonyme Funktion, die eine Liste von Strings aufnimmt und zurückgibt .

Verwenden Sie als (cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"].

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

Probieren Sie es online!

Wie es funktioniert

  • rist reverse. tist ein Byte kürzer als der Import Data.List.transpose.t.rDreht eine Liste von Listen um 90 Grad im Uhrzeigersinn und r.tgegen den Uhrzeigersinn.
  • Der Betreiber ? zwei Argumente, eine Liste von Funktionen und eine Matrix als Liste von Zeichenfolgen.
    • Eine leere Matrix wird gerade zurückgegeben.
    • Andernfalls wird ?die erste Funktion faus der Liste der Funktionen und die erste Zeile aaus der Matrix entfernt.
    • Dann dreht es den Rest bder Matrix im Uhrzeigersinn und wiederholt diese und die übrigen Funktionen. Dadurch wird die Matrix nach und nach von außen nach innen gestrippt, jeweils ein Ring in vier Schritten.
    • Dann wird die ursprüngliche Linie adem Ergebnis vorangestellt und die Funktion angewendet f, um die Ausrichtung der Matrix anzupassen.
  • Die anonyme Funktion ruft auf ? mit der Eingabematrix eine Liste von Zeichenfolgen und eine unendliche Liste von Funktionen auf, die sich zyklisch alle vier Schritte wiederholt.
    • Bei den meisten Schritten handelt es sich um eine Drehung gegen den Uhrzeigersinn, wodurch die implizite Drehung im Uhrzeigersinn von rückgängig gemacht wird ? bei einer Rekursion ausgeführt wird.
    • Der erste Schritt und jeder vierte Schritt danach ist jedoch eine Drehung im Uhrzeigersinn.
      • Diese Funktion wird angewendet, wenn ein Ring der Matrix vollständig ist, wodurch jeder Ring gegenüber dem nächsten um 180 Grad gedreht wird.
      • Glücklicherweise ist dies auch die richtige Transformation für die endgültige, vervollständigte Matrix, um das endgültige Ergebnis zu erhalten.

6

Python 2 , 104 Bytes

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

Probieren Sie es online!

x[l-i][j]sind die Koordinaten einer Drehung im Uhrzeigersinn x[i][l-j]für eine Drehung gegen den Uhrzeigersinn. min(i,j,l-i,l-j)%2wird verwendet, um die richtige Richtung zu wählen


Rotationen rekursiv zurückgeben.
Tuskiomi

@ Tuskiomi hmm?
Rod

@tuskiomi Ich habe einen rekursiven Ansatz in ES6 versucht. Es war ungefähr doppelt so lang wie eine einfache Portierung dieser Antwort ...
Neil

4

Mathematica, 113 Bytes

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


es ist besser, als Zeichenfolge wie "E" für spezielle Buchstaben wie E, I ...

Eingang

[{{1, 2, 3, 4, 5, 6}, {A, B, C, D, "E", F}, {G, H, "I", J, K, L}, {M , N, O, P, Q, R}, {S, T, U, V, W, X}, {Y, Z, "!", "@", "#", "&"}]

Ausgabe

{{Y, S, M, G, A, 1}, {Z, "E", K, Q, W, 2}, {"!", D, O, "I", V, 3}, { "@", C, P, J, U, 4}, {"#", B, H, N, T, 5}, {"&", X, R, L, F, 6}}


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.