Rotazioni intrecciate


25

Sfida

Data una matrice quadrata di caratteri (caratteri ASCII stampabili a byte singolo), ruota ciascun "anello" della matrice in direzioni opposte.

Facciamo un esempio:

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

Quindi, l'anello più esterno viene ruotato di 90 gradi in senso orario, in questo modo:

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

Il secondo anello viene ruotato in senso antiorario di 90 gradi:

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

L'anello finale viene ruotato di 90 gradi in senso orario, ma poiché si tratta di un singolo numero (lettera nel nostro esempio), non è realmente interessato.

Il risultato finale è:

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

Se la matrice ha una lunghezza laterale uniforme, l'anello più interno sarà un quadrato di 2x2 e dovrebbe comunque essere ruotato.

Ingresso

Un elenco di elenchi in qualsiasi formato standard ragionevole. Ad esempio, una stringa delimitata da spazi delimitata da newline o un elenco di stringhe delimitate da spazi è accettabile, ma un elenco di valori come anelli attorno alla matrice non è accettabile. I personaggi non sono necessariamente unici.

Produzione

Un elenco di elenchi in qualsiasi formato standard ragionevole. Stesse regole dell'input.

Casi test

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

Crediti

Fortemente ispirato da una sfida correlata che ruota ciascun elemento in senso antiorario di una posizione (non di 90 gradi).



@ rahnema1 Bene, ricordo quel post. Questo post è per lo più ispirato a quello; Accrediterò. Grazie!
HyperNeutrino,

@ Mr.Xcoder Whoops. Hai ragione, grazie.
HyperNeutrino,

@HyperNeutrino possiamo prendere la dimensione della matrice come parte dell'input?
Uriel,

Tutti i personaggi nei tuoi esempi sono unici. Sarà sempre così?
Dennis,

Risposte:


9

Haskell , 94 byte

Una funzione anonima che accetta e restituisce un elenco di messaggi di posta Stringelettronica.

Usa come (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[]

Provalo online!

Come funziona

  • rlo è reverse. tè un byte più corto dell'importazione Data.List.transpose. t.rruota un elenco di elenchi di 90 gradi in senso orario e lo r.truota in senso antiorario.
  • L'operatore ?accetta due argomenti, un elenco di funzioni e una matrice come un elenco di stringhe.
    • Viene appena restituita una matrice vuota.
    • In caso contrario, ?rimuove la prima funzione fdall'elenco di funzioni e la prima riga adalla matrice.
    • Quindi ruota il resto bdella matrice in senso orario e ricorre con quella e le restanti funzioni. Questo spoglia gradualmente la matrice dall'esterno, un anello ogni quattro passi.
    • Quindi antepone la linea originale aal risultato e applica la funzione fad essa per regolare l'orientamento della matrice.
  • La funzione anonima chiama ?con la matrice di input come un elenco di stringhe e un elenco infinito di funzioni, che si ripete ciclicamente ogni quattro passaggi.
    • Per la maggior parte dei passaggi la funzione è la rotazione in senso antiorario, che annulla la rotazione implicita in senso orario eseguita da ?quando si ripete.
    • Tuttavia, il primo passo e ogni quarto passo successivo è invece la rotazione in senso orario.
      • Questa funzione viene applicata quando un anello della matrice è completo, facendo ruotare ciascun anello di 180 gradi rispetto a quello successivo.
      • Per fortuna, questa è anche la trasformazione corretta da applicare alla matrice finale completata per ottenere il risultato finale.

6

Python 2 , 104 byte

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]

Provalo online!

x[l-i][j]sono le coordinate di un giro in senso orario, x[i][l-j]per un giro controcorrente. min(i,j,l-i,l-j)%2è usato per scegliere la giusta direzione


rotazioni di ritorno in modo ricorsivo.
tuskiomi,

@tuskiomi hmm ??
Rod,

@tuskiomi Ho provato un approccio ricorsivo in ES6. Era circa il doppio di un semplice porto di questa risposta ...
Neil,

4

Mathematica, 113 byte

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)&


è meglio inserire come stringa di caratteri come "E" per lettere speciali come E, I ...

ingresso

[{{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, "!", "@", "#", "&"}}]

produzione

{{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}}


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.