Desafio:
Dada uma matriz NxN em que e uma das oito 'opções de dobra' distintas, gera uma lista / matriz 2D com os valores subtraídos.
As oito opções de dobragem são: da esquerda para a direita; direita para esquerda; de cima para baixo; de baixo para cima; da esquerda para a direita; do topo à direita; da esquerda para a direita; direito ao pé direito.
Exemplos passo a passo:
Matriz de entrada:
[[ 1, 3, 5, 7],
[ 0, 8, 6, 4],
[ 1, 1, 1, 1], (a'th row in the explanation below)
[ 1,25, 0,75]]
Com a opção de dobrar de cima para baixo, produzimos o seguinte como resultado:
[[ 1,-7,-5,-3],
[ 0,22,-5,68]]
Por quê? Dobramos de cima para baixo. Como as dimensões da matriz são uniformes, não temos uma camada intermediária para preservar como está. A 'th fila [1, 1, 1, 1]
serão subtraídos pelo ' th fileira (teria sido 'th linha para matrizes de dimensão ímpares); assim [1-0, 1-8, 1-6, 1-4]
se torna [1, -7, -5, -3]
. A 'ª linha [1, 25, 0, 75]
será subtraída pela ' ª linha (teria sido 'ª linha para matrizes de dimensões ímpares); então[1-1, 25-3, 0-5, 75-7]
torna-se [0, 22, -5, 68]
.
Com a opção de dobrar de baixo para a direita para topleft (com a mesma matriz de entrada acima), produzimos o seguinte como resultado:
[[-74, 2, 1, 7],
[ 0, 7, 6],
[-24, 1],
[ 1]]
Com as seguintes subtrações dobráveis:
[[1-75, 3-1, 5-4, 7],
[ 0-0, 8-1, 6],
[1-25, 1],
[ 1]]
Regras do desafio:
- Você pode usar oito letras distintas
[A-Za-z]
ou números distintos no intervalo para as opções de dobra. Os números ou são provavelmente as opções mais comuns, mas se você quiser usar números diferentes dentro do intervalo para alguns cálculos inteligentes, fique à vontade para fazê-lo. Indique quais opções de dobragem você usou em sua resposta. - A matriz de entrada sempre será uma matriz NxN quadrada, portanto você não precisa manipular nenhuma matriz NxM retangular. também sempre será pelo menos 2, pois uma matriz vazia ou 1x1 não pode ser dobrada.
- A entrada da matriz sempre conterá números não negativos no intervalo (os números na saída estarão, portanto, no intervalo ).
- Com a dobra (anti) diagonal ou a dobra vertical / horizontal de dimensão ímpar, a 'camada' do meio permanecerá inalterada.
- A E / S é flexível. Pode ser uma matriz / lista 2D de números inteiros; pode ser retornado ou impresso como uma string delimitada por espaço e nova linha; você pode modificar a matriz de entrada e substituir os números que devem desaparecer
null
ou um número fora do[-999, 999]
intervalo para indicar que eles desapareceram; etc etc.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste:
Matriz de entrada 1:
Input-matrix (for the following eight test cases):
[[ 1, 3, 5, 7],
[ 0, 8, 6, 4],
[ 1, 1, 1, 1],
[ 1,25, 0,75]]
Input-folding option: left-to-right
Output: [[2,6],[-2,4],[0,0],[-25,74]]
Input-folding option: right-to-left
Output: [[-6,-2],[-4,2],[0,0],[-74,25]]
Input-folding option: top-to-bottom
Output: [[1,-7,-5,-3],[0,22,-5,68]]
Input-folding option: bottom-to-top
Output: [[0,-22,5,-68],[-1,7,5,3]]
Input-folding option: topleft-to-bottomright
Output: [[7],[6,-1],[1,-7,-2],[1,24,0,74]]
Input-folding option: topright-to-bottomleft
Output: [[1],[-3,8],[-4,-5,1],[-6,21,-1,75]]
Input-folding option: bottomleft-to-topright
Output: [[1,3,4,6],[8,5,-21],[1,1],[75]]
Input-folding option: bottomright-to-topleft
Output: [[-74,2,1,7],[0,7,6],[-24,1],[1]]
Matriz de entrada 2:
Input-matrix (for the following eight test cases):
[[17, 4, 3],
[ 8, 1,11],
[11, 9, 7]]
Input-folding option: left-to-right
Output: [[4,-14],[1,3],[9,-4]]
Input-folding option: right-to-left
Output: [[14,4],[-3,1],[4,9]]
Input-folding option: top-to-bottom
Output: [[8,1,11],[-6,5,4]]
Input-folding option: bottom-to-top
Output: [[6,-5,-4],[8,1,11]]
Input-folding option: topleft-to-bottomright
Output: [[3],[1,7],[11,1,-10]]
Input-folding option: topright-to-bottomleft
Output: [[17],[4,1],[8,-2,7]]
Input-folding option: bottomleft-to-topright
Output: [[17,-4,-8],[1,2],[7]]
Input-folding option: bottomright-to-topleft
Output: [[10,-7,3],[-1,1],[11]]
A-Za-z
ou número inteiro no intervalo[-999,999]
, portanto, a ordem não importa. E desculpe, mas você deve produzir a dobra correta com base na entrada, portanto, a saída das oito não é permitida.Respostas:
Octave ,
256248244248 bytesExperimente online!
-2 bytes (e um pouco de arrumação) graças a Luis Mendo
+2 bytes devido à correção para TB
Operações indexadas a 1 para valores de b de 1 a 8:
Isso me deu uma dor de cabeça, eu vou jogar golfe mais tarde
fonte
rows(a)
vez desize(a,2)
Geléia ,
3934 bytesÉ possível haver ainda mais golfe combinando algumas das duas "funções".
... sim: -5 graças a NickKennedy!
Experimente online!
Um link diádico que aceita um número inteiro (a instrução) e uma lista de listas de números (a matriz).
Quão?
O link cria o código Jelly, que é então avaliado usando M como uma entrada ...
Cada uma das oito opções é:
Cada um deles (exceto
0
e4
) aplica uma transformação aoM
uso de alguns deZ
(transposição),Ṛ
(reverso) eU
(reverso cada); então, uma das duas funções (veja abaixo), o inverso da transformação da instalação (se houver) implementada com o inverso do código.As duas funções internas são:
fonte
JavaScript (ES6),
149 ... 133128 bytes(matrix)(d)
NaN
Experimente online!
Comentado
fonte
Geléia ,
7134 bytesExperimente online!
Suíte de teste
Um programa completo. O argumento certo é a matriz. O argumento à esquerda é o tipo de dobra:
Reescrito para usar o binário bijetivo de 5 bits como entrada. Observe que o programa fornecido acima não funcionará repetidamente para várias dobras.
fonte
Oitava ,
482 bytes, 459 bytesAs entradas para decidir as direções de dobragem são:
1) da esquerda para a direita
2) de baixo para cima
3) da direita para a esquerda
4) de cima para baixo
5) tr para bl
6) br para tl
7) bl para tr
8) tl para br
Cada chamada gera apenas a dobra especificada, em vez de todas elas (o que provavelmente levaria menos bytes). O maior problema é que, neste caso, não consigo descobrir como colocar as dobras 1-4 e 5-8 no mesmo loop. Mas pelo menos a oitava tem matrizes bonitas.
Experimente online!
A supressão de saída custa bytes, então ignore tudo o que não é a instrução de retorno (ans =).
fonte
Carvão ,
7877 bytesExperimente online! Link é a versão detalhada do código. Usa as seguintes opções de dobra:
Os valores dobrados são substituídos por cadeias vazias. Explicação:
Gire a matriz quatro vezes.
Dobre a matriz horizontalmente quando apropriado.
Dobre a matriz na diagonal quando apropriado.
Saída da matriz, uma vez que é girada de volta à sua orientação original.
fonte