Rotations entrelacées

25

Défi

Étant donné une matrice carrée de caractères (caractères ASCII imprimables sur un octet), faites tourner chaque "anneau" de la matrice dans des directions opposées.

Prenons un exemple:

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

Ensuite, l'anneau le plus à l'extérieur est tourné de 90 degrés dans le sens des aiguilles d'une montre, comme suit:

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

Le deuxième anneau est tourné de 90 degrés dans le sens antihoraire:

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

L'anneau final est tourné de 90 degrés dans le sens des aiguilles d'une montre, mais comme il s'agit d'un seul chiffre (lettre dans notre exemple), il n'est pas vraiment affecté.

Le résultat final est:

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

Si la matrice a une longueur de côté uniforme, l'anneau le plus à l'intérieur sera un carré 2x2 et devrait toujours être tourné.

Contribution

Une liste de listes dans n'importe quel format standard raisonnable. Par exemple, une chaîne délimitée par des espaces délimitée par des sauts de ligne ou une liste de chaînes délimitées par des espaces est acceptable, mais une liste des valeurs sous forme d'anneaux autour de la matrice n'est pas acceptable. Les personnages ne sont pas nécessairement uniques.

Sortie

Une liste de listes dans n'importe quel format standard raisonnable. Mêmes règles que l'entrée.

Cas de 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

Crédits

Fortement inspiré par un défi connexe qui fait tourner chaque élément dans le sens antihoraire d'une position (pas de 90 degrés).

HyperNeutrino
la source
En relation
rahnema1
@ rahnema1 Oui, je me souviens de ce post. Ce message est principalement inspiré de celui-ci; Je créditerai. Merci!
HyperNeutrino
@ Mr.Xcoder Whoops. Vous avez raison, merci.
HyperNeutrino
@HyperNeutrino peut-on prendre la dimension de la matrice comme élément d'entrée?
Uriel
Tous les personnages de vos exemples sont uniques. Est-ce que ce sera toujours le cas?
Dennis

Réponses:

9

Haskell , 94 octets

Une fonction anonyme prenant et renvoyant une liste de Strings.

Utiliser comme (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[]

Essayez-le en ligne!

Comment ça marche

  • rest reverse. test un octet plus court que l'importation Data.List.transpose. t.rfait pivoter une liste de listes de 90 degrés dans le sens horaire et la r.tfait tourner dans le sens antihoraire.
  • L'opérateur ?prend deux arguments, une liste de fonctions et une matrice comme liste de chaînes.
    • Une matrice vide est juste retournée.
    • Sinon, ?supprime la première fonction fde la liste des fonctions et la première ligne ade la matrice.
    • Ensuite, il fait pivoter le reste bde la matrice dans le sens des aiguilles d'une montre, et revient avec cela et les fonctions restantes. Cela dépouille progressivement la matrice de l'extérieur vers l'intérieur, un anneau toutes les quatre étapes.
    • Ensuite, il ajoute la ligne d'origine aau résultat et lui applique la fonction fpour ajuster l'orientation de la matrice.
  • La fonction anonyme appelle ?avec la matrice d'entrée comme une liste de chaînes et une liste infinie de fonctions, qui se répète cycliquement toutes les quatre étapes.
    • Pour la plupart des étapes, la fonction est une rotation dans le sens antihoraire, ce qui annule la rotation implicite dans le sens horaire effectuée ?lors de la récurrence.
    • Cependant, la première étape et toutes les quatre étapes par la suite est une rotation dans le sens horaire.
      • Cette fonction est appliquée lorsqu'un anneau de la matrice est terminé, entraînant une rotation de 180 degrés de chaque anneau par rapport au suivant.
      • Par chance, c'est également la transformation correcte à appliquer à la matrice finale et complète pour obtenir le résultat final.
Ørjan Johansen
la source
6

Python 2 , 104 octets

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]

Essayez-le en ligne!

x[l-i][j]sont les coordonnées d'un virage dans le sens horaire, x[i][l-j]pour un virage à contre-sens. min(i,j,l-i,l-j)%2est utilisé pour choisir la bonne direction

Barre
la source
retourner les rotations récursivement.
tuskiomi
@tuskiomi hmm ??
Rod
@tuskiomi J'ai essayé une approche récursive dans ES6. C'était environ deux fois plus long qu'un simple portage de cette réponse ...
Neil
4

Mathematica, 113 octets

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


il est préférable de saisir une chaîne de caractères comme "E" pour des lettres spéciales comme E, I ...

contribution

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

sortie

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

J42161217
la source
3

Octave, 86 octets

@(a){k=a;k(x=2:end-1,x)=0;a=rot90(a);a(m)=rot90(a,-2)(m=~mod(bwdist(+k,'ch'),2));a}{5}

Essayez-le en ligne!

rahnema1
la source