Gire cada bloco 2x2 em uma matriz

11

O desafio

Dada uma n x mmatriz com n > 1e m > 1 preenchida com números inteiros

1 2 3
4 5 6

e uma lista de números inteiros com exatamente quantos valores quantos 2x2blocos na matriz ( (n-1)*(m-1)se você precisar do número exato)

[1, 2]

Emita a matriz com cada 2x2bloco rotacionado pelo valor atual na lista na ordem especificada. O exemplo acima renderia

4 6 2
5 3 1

O primeiro bloco é girado uma vez para a direita e o segundo bloco é girado duas para a direita.

Notas

  • Um número inteiro positivo significa que você gira para a direita em muitas etapas.
  • Um número inteiro negativo significa que você gira para a esquerda em muitas etapas.
  • Um zero significa que você não gira.
  • Você gira os blocos em linhas. Isso significa que você começa na primeira linha e vai para a direita. Depois de girar cada bloco nessa linha, você passa para o próximo. No final, cada bloco era girado exatamente uma vez.
  • Lembre-se de que os blocos se sobrepõem. A primeira matriz acima possui os blocos [[1,2],[4,5]]e, [[2,3],[5,6]]por exemplo.
  • Cada rotação de um bloco afeta a rotação nos blocos adjacentes. É por isso que você precisa fazer as rotações no padrão descrito acima.

Regras

  • Você pode pegar a entrada no formato mais conveniente. Especifique na sua resposta qual você usa. Isso não permite que você leia a matriz em blocos.
  • Função ou programa completo permitido.
  • Regras padrão para entrada / saída.
  • Aplicam-se brechas padrão .
  • Isso é , e a menor contagem de bytes vence. O desempatador é uma inscrição anterior.

Casos de teste

O formato de entrada aqui é uma lista de listas para a matriz e uma lista normal para os valores.

[[1,2], [3,4]], [-3] -> [[4,1], [3,2]]
[[1,1,1], [1,1,1]], [-333, 666] -> [[1,1,1], [1,1,1]]
[[1,2,3], [4,5,6]], [1,2] -> [[4,6,2], [5,3,1]]
[[1,2,3], [4,5,6], [7,8,9]], [4,0,12, -20] -> [[1,2,3], [4, 5,6], [7,8,9]]
[[1,2,3,4,5], [5,4,3,2,1], [1,2,3,4,5]], [2, -3,4,1,6, 24,21, -5] -> [[4,1,5,2,4], [2,1,3,5,5], [3,2,4,3,1]]

Feliz codificação!

Denker
fonte

Respostas:

4

CJam ( 42 40 bytes)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

Demonstração online

Basicamente, isso aplica a mesma técnica duas vezes para dobrar o bloco

{4,={+2/zW%~}*}

que opera em uma matriz 2x2 e várias vezes para girar.

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

pode ser processado com

.{block}

e tem o efeito de

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

porque .(como %no CJam) não reúne os resultados em uma matriz até que seja concluído.

Peter Taylor
fonte
Você pode salvar um byte usando 4,=o módulo correto (a menos que seu bloco precise executar pelo menos uma vez?).
Martin Ender
E quanto zW%à rotação?
Martin Ender
@ MartinBüttner, pensei que a rotação parecia muito longa, mas não conseguia me lembrar da menor. Bom truque no módulo.
Peter Taylor
2

CJam, 65 63 60 55 bytes

Não deve haver uma maneira melhor de fazer isso ...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

Essa é uma função sem nome que espera as instruções e a matriz (nessa ordem) na pilha e deixa a matriz resultante em seu lugar.

Teste aqui.

Explicação

Não estou com vontade de escrever a descrição completa do código agora, então aqui está uma visão geral:

  • Manipulação de matriz 2D é um problema no CJam, então estou desenrolando a matriz, calcule cada rotação como uma permutação dos elementos em posições específicas e depois divida a matriz em linhas novamente no final. A largura da matriz é armazenada em N.
  • Uma rotação na posição kna matriz desenrolado muda quatro índices: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Para cada índice kao longo da lista de instruções, eu calculo uma permutação correspondente a isso e a aplico à matriz de entrada não enrolada.
  • Isso deixa o problema: na matriz linear, algumas rotações serão posicionadas com seu canto superior esquerdo na última coluna da entrada. Para pular esses, eu zero os zeros na lista de instruções, de modo que esses sub-blocos 2x2 inválidos sejam tecnicamente processados, mas com um no-op.
Martin Ender
fonte
1

Python 2 , 166 159 bytes

A,R=input();m=~-len(A[0])
for j,r in enumerate(R):exec r%4*"a,b,c,d=A[j/m][j%m:][:2]+A[j/m+1][j%m:][:2];A[j/m][j%m:j%m+2]=c,a;A[j/m+1][j%m:j%m+2]=b,d;"
print A

Experimente online!

Jonathan Frech
fonte