Digamos que eu tenho a seguinte matriz (2D):
[[1, 2, 3, 4 ],
[5, 6, 7, 8 ],
[9, 10, 11, 12],
[13, 14, 15, 16]]
Gire a matriz no sentido anti- R
horário (não em incrementos de 90 graus, apenas um número por vez),
1 2 3 4 2 3 4 8 3 4 8 12
5 6 7 8 --> 1 7 11 12 --> 2 11 10 16
9 10 11 12 5 6 10 16 1 7 6 15
13 14 15 16 9 13 14 15 5 9 13 14
Exemplo completo:
Entrada:
2
[[1, 2, 3, 4 ],
[5, 6, 7, 8 ],
[9, 10, 11, 12],
[13, 14, 15, 16]]
Saída:
[[3, 4, 8, 12],
[2, 11, 10, 16],
[1, 7, 6, 15],
[5, 9, 13, 14]]
(espaços estranhos são para alinhar os números em boas colunas)
O "anel" externo da matriz gira 2 no sentido anti-horário e o interior direito também gira 2. Nesta matriz, existem apenas dois anéis.
Um exemplo com 1 "anel":
2
[[1, 2],
[3, 4],
[5, 6]]
Saída deve:
[[4, 6],
[2, 5],
[1, 3]]
Seu desafio é obter uma matriz e um número inteiro R
e gerar a versão traduzida após as R
rotações.
A rotação de uma matriz 4x5 é representada pela seguinte figura:
Restrições:
2 ≤ M, N ≤ 100
, onde M e N são as dimensões da matriz. É garantido que o mínimo de M e N seja par.1 ≤ R ≤ 80
, em que r é o número de rotações.- A matriz sempre conterá números inteiros positivos.
- Os valores nem sempre são distintos.
- A entrada sempre deve ser como uma matriz 2D (se você não pode receber a entrada de tempo de execução como uma matriz 2D, basta encontrar outra maneira de obter entrada).
Outro caso de teste, com valores não distintos:
1
[[1, 1],
[2, 2],
[3, 3]]
Saídas:
[[1, 2],
[1, 3],
[2, 3]]
Isso é código-golfe , então a resposta mais curta vence!
code-golf
array-manipulation
matrix
Um passo adiante
fonte
fonte
[[3, 4, 8, 12], [2, 11, 10, 16], [1, 7, 6, 16], [5, 9, 13, 14]]
os 16 são subitamente duplicados, acho que deveria ser[[3, 4, 8, 12], [2, 11, 10, 16], [1, 7, 6, 15], [5, 9, 13, 14]]
:?Respostas:
Geléia ,
39383635 bytesExperimente online!
fonte
Oitava, 210 bytes
Experimente no Octave Online!
Versão não destruída:
Explicação:
Uma função que obtém um número e gera um intervalo que é ordenado e centralizado para a entrada 4 (par) gera
-2 -1 1 2
para a entrada 5 (ímpar) gera
-2.5 -1.5 0 1 2
apenas que deve ser ordenada e centralizada
uma matriz complexa gerada a partir de intervalos
Converta coordenadas retangulares em polares e retorne ângulos para que, para cada ângulo, os anéis sejam classificados no sentido horário
A seguinte matriz gerou
Calcula a transformação de distância de B usando a distância do tabuleiro de xadrez para gerar índices de anel
para uma matriz 6 * 7, teremos a seguinte matriz
classificação lexicográfica, primeiro com base no índice de toque e, em seguida, por ordem de ângulo (índices de elementos classificados retornados)
e, finalmente, deslocamento circular de cada anel.
fonte
Python 3,
292288 bytesRecebe entrada com as novas linhas removidas, mas deixa um espaço após o número de incrementos para girá-lo.
Explicação:
Em vez de modelar a matriz como uma série de anéis concêntricos de acordo com a sugestão do OP, pode-se dividi-la em quatro regiões onde os elementos viajam para cima, baixo, direita ou esquerda durante uma única rotação. Esse é o objetivo da cadeia longa
f
avaliada: determinar em qual região cadai,j
combinação se encaixa. Em seguida, o resultado disso é pesquisado duas vezesl
, fornecendo o elemento que deve girar na posiçãoi,j
na próxima etapa. A funçãog
que faz tudo isso e forma a nova matriz após uma única etapa é chamada repetidamente, avaliando uma string gerada contendo a representação de uma chamada de função aninhada.Quando fiz isso originalmente, fiz acidentalmente a matriz girar no sentido horário em vez de no sentido anti-horário. Em vez de fazer uma correção adequada, adicionei duas cópias estrategicamente colocadas
[::-1]
para reverter a matriz antes e depois da rotação. Provavelmente estes poderiam ser jogados para ~280276 bytes, mas estou com preguiça de fazer isso.Além disso, esta é uma porta rápida e não testada de um programa Python 2 um pouco mais longo, então me perdoe se não funcionar corretamente. Aqui está o código Python 2, de qualquer maneira:
EDIT: Golfed off 4 bytes, substituindo
or
por|
duas vezes.and
infelizmente não pode ser ajudado.fonte
Perl,
330328 bytesExperimente em Ideone .
Ungolfed:
fonte