A ideia
Já fizemos espirais de matriz antes, rotações completas e até rotações diagonais , mas não, até onde posso encontrar, rotações de serpentes !
O que é uma rotação de cobra?
Imagine as linhas de uma matriz serpenteando para frente e para trás, com divisórias entre elas como as divisórias da longa fila:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Agora imagine girar esses itens em 2. Cada item avança, como pessoas se movendo em uma linha, e os itens no final se espalham e retornam ao início:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
Se houver um número ímpar de linhas, ele sairá da direita, mas continuará sendo inserido no início. Por exemplo, aqui está uma rotação de 3:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
Uma rotação negativa o levará para trás. Aqui está uma rotação -2:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
O desafio
Sua função ou programa terá duas entradas, em qualquer formato conveniente:
- Uma matriz
- Um número inteiro (positivo ou negativo) indicando quantos lugares para rotacioná-lo.
Voltará:
- A matriz rotacionada
Notas:
- Código de golfe. Menos bytes ganha.
- As matrizes não precisam ser quadradas, mas conterão pelo menos 2 linhas e 2 colunas
- Inteiros positivos girarão a linha 1 para a direita
- Inteiros negativos girarão a linha 1 para a esquerda
- Você pode reverter o significado dos números de rotação positivo / negativo, se conveniente
- O número da rotação pode ser maior que o número de itens. Nesse caso, ele será quebrado. Ou seja, será equivalente ao número do módulo o número de itens.
- A matriz conterá apenas números inteiros, mas pode conter números inteiros, incluindo repetições
Casos de teste
Formato:
- Matriz
- Número de rotação
- Valor de retorno esperado
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
Respostas:
Gelatina , 10 bytes
Um link diádico que aceita o marix à esquerda e o número inteiro de rotação à direita (usa o significado inverso de positivo / negativo)
Experimente online!
Quão?
fonte
R ,
121110101 bytesExperimente online!
Passo a passo
fonte
Python 3.8 (pré-releaseSSSse) , 119 bytes
Uma função sem nome
matrix, rotation
que aceita e gera a nova matriz.Usa o sinal de rotação oposto.
Experimente online!
Quão?
Definimos
n=-1
antecipadamente para economizar parênteses mais tarde e usar a matriz comom
e a rotação comor
.Uma nova matriz é construída com as mesmas dimensões que
m
- com uma largura dew
(w:=len(m[0])
) e uma altura deh
(h:=len(m)
).Todas as outras linhas dessa matriz são revertidas (
[::n**j]
).Os valores são pesquisados calculando suas linhas e colunas no original,
m
usando os elementos atuais linhai
, e coluna,j
...Definimos
s
parar+i
ek
para(j+s//w)%h
.k
é a linha do original para acessar nosso elemento atual.Para acessar facilmente as linhas indexadas ímpares da direita, revertemos essas linhas antes de acessar seus elementos (com
[:n**k]
), isso significa que o elemento de interesse está ems%w
.fonte
J ,
413021 bytes-11 bytes graças a Jonah!
-9 bytes graças a FrownyFrog & ngn!
Experimente online!
Invertida
+/-
fonte
$@]t@$(|.,@(t=.#\,`(|.@,)/.]))
( Experimente on-line! )&.
, perdia o argumento da esquerda o tempo todo, por isso desisti.JavaScript (Node.js) , 102 bytes
Toma entrada como
(matrix)(integer)
. O significado do sinal do número inteiro é invertido.Experimente online!
Função auxiliar
Função principal
fonte
05AB1E , 16 bytes
Experimente online!
Obrigado a Emigna por -5. Infelizmente, não consigo ver como jogar fora a parte redundante. :(
fonte
Carvão , 36 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Inverta as linhas alternativas da entrada.
Achatar a matriz.
Gire a matriz nivelada.
Divida a matriz novamente em linhas.
Inverter linhas alternativas.
Converta cada entrada em string e saída no formato de saída padrão, que é um número por linha com linhas em espaço duplo. (A formatação com um separador custaria o tamanho do separador.)
fonte
Pitão, 20 bytes
Experimente online aqui .
fonte
Japonês , 28 bytes
Tente
Resposta do porto de Arnauld . O maior desafio foi criar uma função reutilizável. Em particular, há uma função auxiliar para reverter todas as outras linhas. A abordagem que estou adotando é fazer uma chamada recursiva e dependendo se uma variável está definida.
JS transpilado:
fonte
Python 3 , 94 bytes
Experimente online!
Usou a inversão de linha ímpar da resposta de Jonathan Allan .
fonte
APL (Dyalog Classic) , 20 bytes
Experimente online!
fonte
C # (compilador interativo do Visual C #) , 141 bytes
Experimente online!
-5 bytes no total, graças a alguém!
Função anônima que executa uma modificação no local da matriz de entrada.
Um único loop itera sobre as células. Você pode digitalizar de cima para baixo e da esquerda para a direita usando as seguintes fórmulas:
row=i/w
col=i%w
Onde
i
é um contador de loop ew
é o número de colunas. Isso varia um pouco ao digitalizar em um padrão de cobra.row=i/w
col=i%w
(0ª, 2ª, 4ª etc. linha)col=w-i%w-1
(1ª, 3ª, 5ª, etc. linha)Outro ponto a ser observado é que o
%
C # não se converte em um valor positivo, como ocorre em alguns outros idiomas. São necessários alguns bytes extras para explicar isso.fonte
dynamic
; comentar também l. Experimente online!var
para jogar golfe, o que não permite que você declare uma lista de variáveis. Provavelmente por que eu perdi isso. Boa pegada!y
inteiramente para economizar 2 bytes: Experimente online!