Como parte de seu algoritmo de compactação, o padrão JPEG desenrola uma matriz em um vetor ao longo de antidiagonais de direção alternada:
Sua tarefa é pegar uma matriz (não necessariamente quadrada) e devolvê-la na forma desenrolada. Como um exemplo:
[1 2 3 4
5 6 7 8
9 1 2 3]
deve render
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
Regras
Você pode assumir que os elementos da matriz são números inteiros positivos menores que 10
.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
A matriz de entrada pode ser fornecida em qualquer formato conveniente de lista ou string aninhada, inequívoca, ou como uma lista simples, juntamente com as duas dimensões da matriz. (Ou, é claro, como um tipo de matriz, se o seu idioma tiver esse.)
O vetor de saída pode estar em qualquer formato conveniente, inequívoco, de lista simples ou de sequência.
Aplicam-se as regras padrão de código de golfe .
Casos de teste
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 3 4] [5 6 7 8] [9 1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 5 9 6 3 4 7 1 2 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Desafios relacionados
- Reconstruir uma matriz zigzagificada (a transformação inversa um pouco mais complicada)
- Gire as antiagonais
fonte
Respostas:
J,
3130141211 bytesYch . Muito grande.Toma uma matriz como entrada.
Explicação
J tem uma vantagem aqui. Existe um comando chamado oblique (
/.
) que pega as linhas oblíquas e aplica um verbo a elas. Neste caso, estou usando um gerúndio para aplicar dois verbos alternadamente:<
( caixa ) e<@|.
( reverso e caixa). Então é apenas uma questão de desembalar tudo usando;
( raze ).fonte
Pitão,
24232120191817 bytesVersão alternativa de 17 bytes:
ssuL_G=!T.T+LaYkQ
Graças a @FryAmTheEggman por um byte, @Jakube por 2 bytes e @isaacg por um byte!
A explicação da "magia negra" mencionada acima:
m_W=!Td
essencialmente inverte todos os outros subarrays. Faz isso mapeando_W=!T
sobre cada sub-matriz;W
é aplicação condicional, portanto,_
s (inverte) todos os sub-arranjos onde=!T
é verdadeiro.T
é uma variável pré-inicializada para dez (verdade) e=!T
média(T = !T)
. Portanto, alterna o valor de uma variável que começa com verdade e retorna o novo valor, o que significa que alternará entre retornar falsy, truthy, falsy, truthy ... (agradece a Jakube por essa ideia)Conjunto de teste aqui .
fonte
Geléia,
2419151311 bytesLeva o número de linhas, o número de colunas e uma lista simples como argumentos separados da linha de comando.
Experimente online!
Como funciona
fonte
⍁
e⍂
? Ou talvez escandinavoø
eǿ
?MATL ,
2827 bytesAdaptado da minha resposta aqui . A idéia geral é criar uma matriz 2D do mesmo tamanho da entrada, preenchida com valores que aumentam na mesma ordem que o caminho em zig-zag. Em seguida, a versão linearizada (achatada) dessa matriz é classificada e os índices dessa classificação são mantidos. Esses são os índices que precisam ser aplicados à entrada para produzir o caminho em zig-zag.
A entrada está no formato
Explicação
Experimente online!
fonte
Matlab, 134 bytes
Eu apenas tentei encurtar meu código no Matlab, como telegrafá-lo.
Notas:
M
é umam×n
matriz.a
eb
ambas são matrizes do mesmo tamanhoM
, cada linhaa
consiste em números iguais ao número da linha, enquanto cada coluna deb
é igual ao número da coluna. Assim,a
+b
é uma matriz cujo elemento é igual à soma do seu número de linha e coluna, ou sejamatrix(p,q)=p+q
,.A(p,q)=p+q-1
,; eB(p,q)=p-q
.C
é matematicamente indicado como equação abaixo. com a equação, uma matriz que aumenta em ziguezague pode ser feita como mostrado abaixo.C
indica a ordem dos elementos de M nos resultados em ziguezague. Então,[~,I]=sort(C(:));
retorna a ordem, ou sejaI
,V=V(I)'
é o resultado.fonte
JavaScript (SpiderMonkey 30+), 99 bytes
Testado no Firefox 44. Recebe entrada como uma matriz 2D.
fonte
Python 2, 84 bytes
Portando a resposta de nimi . Toma uma matriz plana com largura e altura especificadas. O xsot salvou um byte.
88 bytes:
Toma uma matriz plana com largura e altura especificadas. Classifica as coordenadas 2D correspondentes
(i/w,i%w)
em ordem em zigue-zague de soma crescente para obter diagonais, quebradas pelo valor da linha, aumentando ou diminuindo, com base no fato de a coluna de linha mais ser ímpar ou par.fonte
Haskell,
797873 bytesA entrada é uma lista simples com o número de linhas e colunas, por exemplo
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
- ->[1,2,5,9,6,3,4,7,1,2,8,3]
.Como funciona: percorra as coordenadas xey da matriz (
h
linhas,w
colunas) em dois loops aninhados:ou seja, de cima / direita para baixo / esquerda, pulando fora dos índices vinculados (
y
ex
deve satisfazery<h
ex-y<w
). Quandox
é par, a ordem do loop interno é invertida:y
passa dex
para0
. Eu faço isso escolhendo uma função de modificação para o intervalo y,[0..x]
que é ox
th elemento de[reverse,id,reverse,id,...]
.Edit: @xnor reorganizou os loops e salvou 5 bytes. Obrigado!
fonte
g=id:reverse:g
.(y-x)*w
pode ser cortado, transpondo o problema:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. A tradução para Python economiza três caracteres sobre o que eu tinha.Python 2 + NumPy, 122 bytes
Eu admito. Eu trabalhei à frente. Infelizmente, esse mesmo método não pode ser facilmente modificado para resolver os outros 2 desafios relacionados ...
Toma uma matriz numpy como entrada. Mostra uma lista.
Experimente online
Explicação:
Um lambda tem o mesmo comprimento:
fonte
Python 3,
131118115107 107 bytesBaseado no mesmo princípio da minha resposta ao desafio de Deusovi
Presumo que não podemos ter zero na matriz de entrada
Explicação
como funciona :
Resultados
fonte
reverse even line
serreverse odd lines
?