O tornado da matriz é como qualquer outro tornado: consiste em coisas que giram em torno de um centro. Nesse caso, elementos da matriz em vez de ar.
Aqui está um exemplo de um furacão da matriz:
Primeiro, começamos o corte da matriz em anéis quadrados, cada seção consiste em elementos que estão mais distantes da borda pela mesma distância. Essas seções serão giradas no sentido horário em torno do centro. Em tornados reais, a gravidade aumenta em direção ao centro, assim como a etapa de rotação em um tornado de matriz: a seção mais externa (a vermelha) é girada em 1 etapa, a próxima (a amarela) é girada por 2, e assim em. Um passo de rotação é uma rotação de 90 ° em torno do centro.
Tarefa:
Sua tarefa, se você a aceitar, é escrever uma função ou programa que tome como entrada uma matriz quadrada, aplique o efeito tornado a ela e, em seguida, produza a matriz resultante.
Entrada:
A entrada deve ser uma matriz quadrada de ordem n
onde n >= 1
. Nenhuma suposição deve ser feita sobre os elementos da matriz, eles podem ser qualquer coisa.
Saída:
Uma matriz quadrada da mesma ordem que seria o resultado da aplicação do efeito tronado à matriz de entrada.
Exemplos:
Uma matriz de ordem n = 1
:
[['Hello']] ===> [['Hello']]
Uma matriz de ordem n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Uma matriz de ordem n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Respostas:
Python 3 , 100 bytes
Experimente online!
fonte
a[1:-1,1:-1]=f(a[1:-1,1:-1])
como se fosse a coisa mais normal do mundo para directamente obter e definir todo o interior de uma matriz 2-dimensionalnumpy
numpy.rot90(a,1,(1,0))
é mais curto em 3 bytes e também deve funcionar.if len(a):a=...
para -1 byte).Carvão , 44 bytes
Experimente online! Link é a versão detalhada do código. Só funciona nos quadrados de caracteres porque a E / S padrão do Charcoal não faz justiça às matrizes normais. Explicação:
Leia o quadrado dos caracteres.
Faça um loop até ficar vazio.
Girá-lo.
Imprima, mas mova o cursor para um quadrado na diagonal a partir do canto original.
Apare a parte externa da matriz.
fonte
Gelatina , 27 bytes
Experimente online!
Eu acho que isso poderia ser muito menor.
fonte
µG
no rodapé e alegação de que sua submissão é 25.Perl 6 ,
78 7372 bytesObrigado ao nwellnhof por -5 bytes!
Experimente online!
Bloco de código recursivo que pega uma matriz 2D achatada e retorna uma matriz achatada da mesma forma.
Explicação:
fonte
@a[*;*]
vez demap |*,@a
achatar a matriz. (Seria bom se houvesse uma maneira de trabalhar com matrizes não-achatadas e subscritos multi-dimensão, mas eu não posso pensar em um.)@a[1..*-2;1..@a-2].=$!
funciona.Oitava ,
8681 bytesExperimente online!
Estou ciente de que funções anônimas recursivas não são o método mais curto para fazer as coisas no Octave, mas são o método mais divertido de longe. Essa é a menor função anônima que eu poderia ter, mas adoraria ser derrotada.
Explicação
A função recursiva é definida de acordo com estas dicas, respondidas pelo tetocat.
q=f(f=@(g)@(M) ... g(g)(M) ...
é a estrutura básica de uma função anônima, comg(g)(M)
a chamada recursiva. Uma vez que este seria recurse indefinidamente, nós envolvemos a chamada recursiva em uma matriz de célula condicional:{@()g(g)(M),M}{condition}()
. A função anônima com lista de argumentos vazia atrasa a avaliação para após a seleção da condição (embora mais tarde, vejamos que podemos usar essa lista de argumentos para definirz
). Até agora, foi apenas a contabilidade básica.Agora, para o trabalho real. Queremos que a função retorne
rot90(P,-1)
com P uma matriz na qualg(g)
foi chamada recursivamente na parte central de M. Começamos definindo oz=2:end-1
que podemos ocultar na indexação de M. Dessa forma,M(z,z)
seleciona a parte central da matriz que precisa ser ser tornado ainda mais por uma chamada recursiva. A,3
peça garante que as rotações estejam no sentido horário. Se você mora no hemisfério sul, pode remover esse bit por -2 bytes.Nós fazemos então
M(z,z)=g(g)M(z,z)
. No entanto, o valor resultante desta operação é apenas a parte central modificada, e não aP
matriz inteira . Por isso, fazemos o{M(z,z)=g(g)M(z,z),M}{2}
que é basicamente roubado desta resposta de dicas de Stewie Griffin.Finalmente, a
condition
recursão para quando a entrada está vazia.fonte
R , 87 bytes
Experimente online!
fonte
seq(0.5)
retornos 1 em vez de vector vazio)MATL ,
25 24 2322Experimente online!
A indexação no MATL nunca é fácil, mas com alguns jogos de golfe ele realmente supera a melhor resposta atual da Jelly ...
* Para uma
n x n
matriz, este programa fazn
iterações, enquanto você realmente precisa apenas den/2
rotações. No entanto, a indexação em MATL (AB) é suficientemente flexível para que a indexação de faixas impossíveis seja apenas um não-op. Dessa forma, não há necessidade de desperdiçar bytes para obter o número correto de iterações.fonte
Python 2 , 98 bytes
Experimente online!
fonte
K (ngn / k) ,
413938 bytesExperimente online!
{
}
função com argumentox
#x
comprimento dex
- a altura da matriz2##x
duas cópias - altura e largura (assumida a mesma)s:
atribuir as
"forma"!s
todos os índices de uma matriz com formas
, por exemplo,!5 5
éEsta é uma matriz de 2 linhas (lista de listas) e suas colunas correspondem aos índices em uma matriz 5x5.
&/
mínimo nas duas linhas:i&|i:
atribua ai
, reverse (|
) e use minima (&
) comi
Estes são os números dos anéis achatados de uma matriz 5x5:
4!1+
adicione 1 e pegue os restantes módulos 4(+|:)
é uma função que gira revertendo (|
- precisamos:
forçá-lo a ser monádico) e depois transpondo (+
- já que não é o verbo mais à direita no "trem", não precisamos de um:
)4(+|:)\x
aplique-o 4 vezes emx
, preservando resultados intermediários,/'
achatar cada+
transpor(
)@'
indexe cada valor à esquerda com cada valor à direitas#
remodelar paras
fonte
JavaScript (ES6), 99 bytes
Experimente online!
Quão?
enquanto os outros permanecem inalterados.
Isso é equivalente a dizer que uma célula é nãogirada se tivermos:
qual é o teste usado no código:
fonte
Gelatina , 24 bytes
Experimente online!
- Lynn
fonte
ḷ""
parece mágico para mim ^^ gostaria de adicionar uma explicação?ḷ""
é mágico. É apenasḷ"
com um extra"
... oh, há uma pequena possibilidade de queḷ"
também "inventei" algo que não tenha sido usado tanto, pois muitas vezes pode ser substituído por um único átomo (não neste caso, como o entrada também pode conter0
).Haskell , 108 bytes
Experimente online!
I utilizados de transposição do Laikoni e modificou-se um pouco, para rodar uma matriz de 90 °:
Explicação
r
gira uma matriz em 90 °.(!)
é uma função de nível superior: "aplicar ao centro".g![1,2,3,4,5]
é[1] ++ g[2,3,4] ++ [5]
.f
é a função tornado: os casos base são do tamanho 1 e 2 (de alguma forma, 0 não funciona).A última linha é onde a mágica acontece: aplicamos
r.r.r.(f!).r
nas linhas do meiox
e depois giramos o resultado. Vamos chamar as linhas médias M . Queremos recuar nas colunas do meio de M e, para chegar a elas, podemos girar M e depois usar(f!)
. Em seguida, usamosr.r.r
para girar M de volta à sua orientação original.fonte
Java 10,
198192 bytes-6 bytes graças a @ceilingcat .
Experimente online.
Explicação:
b
é basicamente usado para indicar em qual anel estamos. E ele girará esse anel, incluindo tudo dentro dele uma vez no sentido horário durante cada iteração.A substituição da matriz de entrada é feita porque o Java é transmitido por referência; portanto, a simples configuração
r=m
significa que as duas matrizes são modificadas ao copiar das células, causando resultados incorretos. Portanto, temos que criar um novoObject
matriz (nova referência) e copiar os valores em cada célula, um por um.fonte
MATLAB, 93 bytes
Tenho certeza de que isso pode ser jogado de alguma forma.
Explicação
fonte
C (gcc) ,
128118115 bytes-15 bytes de @ceilingcat
Experimente online!
fonte
Haskell, 274 bytes
w
é a função principal, que tem o tipo[[a]] -> [[a]]
que você esperaria.Tenho certeza de que um jogador de golfe Haskell mais experiente poderia melhorar isso.
fonte