Rotações entrelaçadas

25

Desafio

Dada uma matriz quadrada de caracteres (caracteres ASCII imprimíveis de um byte), gire cada "anel" da matriz em direções opostas.

Vamos dar um exemplo:

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

Em seguida, o anel externo é girado no sentido horário 90 graus, da seguinte maneira:

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

O segundo anel é girado 90 graus no sentido anti-horário:

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

O anel final é girado no sentido horário 90 graus, mas como é um número único (letra no nosso exemplo), não é realmente afetado.

O resultado final é:

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 a matriz tiver um comprimento lateral uniforme, o anel mais interno será um quadrado de 2x2 e ainda deverá ser girado.

Entrada

Uma lista de listas em qualquer formato padrão razoável. Por exemplo, uma string delimitada por espaço delimitada por nova linha ou uma lista de cadeias delimitadas por espaço é aceitável, mas uma lista dos valores como anéis ao redor da matriz não é aceitável. Os personagens não são necessariamente únicos.

Saída

Uma lista de listas em qualquer formato padrão razoável. Mesmas regras que a entrada.

Casos de teste

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éditos

Fortemente inspirado por um desafio relacionado que gira cada elemento no sentido anti-horário uma posição (não 90 graus).

HyperNeutrino
fonte
Relacionados
rahnema1
@ rahnema1 Certo, eu lembro desse post. Este post é inspirado principalmente por esse; Eu credito. Obrigado!
precisa saber é o seguinte
@ Mr.Xcoder Ops. Você está certo, obrigado.
precisa saber é o seguinte
@HyperNeutrino, podemos tomar a dimensão da matriz como parte da entrada?
Uriel
Todos os caracteres em seus exemplos são únicos. Será sempre este o caso?
Dennis

Respostas:

9

Haskell , 94 bytes

Uma função anônima recebendo e retornando uma lista de Strings.

Use como (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[]

Experimente online!

Como funciona

  • ré reverse. té um byte menor que a importação Data.List.transpose. t.rgira uma lista de listas 90 graus no sentido horário e r.tgira no sentido anti-horário.
  • O operador ?usa dois argumentos, uma lista de funções e uma matriz como uma lista de cadeias.
    • Uma matriz vazia é apenas retornada.
    • Caso contrário, ?retira a primeira função fda lista de funções e a primeira linha ada matriz.
    • Em seguida, ele gira o restante bda matriz no sentido horário e retorna com isso e as demais funções. Isso gradualmente tira a matriz de fora para dentro, um anel a cada quatro etapas.
    • Em seguida, ele anexa a linha original aao resultado e aplica a função fa ela para ajustar a orientação da matriz.
  • A função anônima chama ?com a matriz de entrada como uma lista de cadeias e uma lista infinita de funções, que se repete ciclicamente a cada quatro etapas.
    • Para a maioria das etapas, a função é a rotação no sentido anti-horário, que desfaz a rotação implícita no sentido horário, realizada ?durante a recursão.
    • No entanto, o primeiro passo e cada quarto passo depois é a rotação no sentido horário.
      • Esta função é aplicada quando um anel da matriz é concluído, fazendo com que cada anel seja girado em 180 graus em relação ao próximo.
      • Por sorte, essa também é a transformação correta a ser aplicada à matriz final concluída para obter o resultado final.
Ørjan Johansen
fonte
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]

Experimente online!

x[l-i][j]são as coordenadas de uma volta no sentido horário, x[i][l-j]para uma volta no sentido contrário ao da marcha. min(i,j,l-i,l-j)%2é usado para escolher a direção certa

Cajado
fonte
retornando rotações recursivamente.
tuskiomi
@tuskiomi hmm ??
Rod
@tuskiomi Tentei uma abordagem recursiva no ES6. Era cerca de duas vezes, enquanto uma porta simples desta resposta ...
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)&


é melhor inserir como string "E" para letras especiais como E, eu ...

entrada

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

saída

{{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}, {"e", X, R, L, F, 6}}

J42161217
fonte
3

Oitava, 86 bytes

@(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}

Experimente online!

rahnema1
fonte