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).
Respostas:
Haskell , 94 bytes
Uma função anônima recebendo e retornando uma lista de
String
s.Use como
(cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"]
.Experimente online!
Como funciona
r
éreverse
.t
é um byte menor que a importaçãoData.List.transpose
.t.r
gira uma lista de listas 90 graus no sentido horário er.t
gira no sentido anti-horário.?
usa dois argumentos, uma lista de funções e uma matriz como uma lista de cadeias.?
retira a primeira funçãof
da lista de funções e a primeira linhaa
da matriz.b
da 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.a
ao resultado e aplica a funçãof
a ela para ajustar a orientação da matriz.?
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.?
durante a recursão.fonte
Python 2 , 104 bytes
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 certafonte
Mathematica, 113 bytes
é melhor inserir como string "E" para letras especiais como E, eu ...
entrada
saída
fonte
Oitava, 86 bytes
Experimente online!
fonte