Obracaj każdy blok 2x2 w matrycy

11

Wyzwanie

Biorąc pod uwagę n x mmacierz n > 1i m > 1 liczby całkowite

1 2 3
4 5 6

oraz lista liczb całkowitych o dokładnie takiej 2x2samej wartości, jak liczba bloków w macierzy ( (n-1)*(m-1)jeśli potrzebujesz dokładnej liczby)

[1, 2]

Wyjście macierzy z każdym 2x2blokiem obróconym o bieżącą wartość z listy w podanej kolejności. Powyższy przykład przyniesie

4 6 2
5 3 1

Pierwszy blok zostaje obrócony raz w prawo, a drugi blok zostaje obrócony dwa w prawo.

Notatki

  • Dodatnia liczba całkowita oznacza, że ​​obracasz się w prawo o tyle kroków.
  • Ujemna liczba całkowita oznacza, że ​​obracasz się w lewo o tyle kroków.
  • Zero oznacza, że ​​się nie obracasz.
  • Obracasz bloki wierszami. Oznacza to, że zaczynasz w pierwszym rzędzie i idziesz w prawo. Po obróceniu każdego bloku w tym rzędzie przechodzisz do następnego. Na koniec każdy blok został obrócony dokładnie raz.
  • Pamiętaj, że bloki zachodzą na siebie. Pierwsza matryca powyżej zawiera bloki [[1,2],[4,5]]i [[2,3],[5,6]]na przykład.
  • Każdy obrót bloku wpływa na obrót sąsiednich bloków. Dlatego musisz wykonywać obroty zgodnie z powyższym wzorem.

Zasady

  • Możesz wziąć dane wejściowe w najwygodniejszym formacie. Podaj w swojej odpowiedzi, którego używasz. To ma nie dopuszczać do zapoznania się z macierzy blokowej chociaż.
  • Dozwolona funkcja lub pełny program.
  • Domyślne reguły wejścia / wyjścia.
  • Obowiązują standardowe luki .
  • To jest , więc wygrywa najmniej bajtów. Tiebreaker to wcześniejsze zgłoszenie.

Przypadki testowe

Format wejściowy tutaj to lista list macierzy i normalna lista wartości.

[[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]]

Happy Coding!

Denker
źródło

Odpowiedzi:

4

CJam ( 42 40 bajtów)

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

Demo online

Zasadniczo stosuje się tę samą technikę dwa razy, aby złożyć blok

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

który działa na matrycy 2x2 i wiele razy się obraca.

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

można przetwarzać za pomocą

.{block}

i ma efekt

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

ponieważ .(jak %w CJam) nie zbiera wyników do tablicy, dopóki nie zostanie zakończona.

Peter Taylor
źródło
Możesz zapisać bajt używając 4,=poprawnego modulo (chyba że twój blok musi uruchomić się przynajmniej raz?).
Martin Ender,
A co zW%z rotacją?
Martin Ender
@ MartinBüttner, myślałem, że rotacja wydaje się zbyt długa, ale nie pamiętam krótszej. Niezła sztuczka na modulo.
Peter Taylor
2

CJam, 65 63 60 55 bajtów

Tam musi być lepszy sposób to zrobić ...

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

Jest to nienazwana funkcja, która oczekuje instrukcji i macierzy (w tej kolejności) na stosie i pozostawia wynikową macierz na swoim miejscu.

Sprawdź to tutaj.

Wyjaśnienie

Nie mam teraz ochoty pisać pełnego podziału kodu, więc oto ogólny przegląd:

  • Manipulowanie tablicą 2D jest uciążliwe w CJam, więc zamiast tego rozwijam macierz, obliczam każdy obrót jako permutację elementów w określonych pozycjach, a następnie dzielę tablicę na rzędy na końcu. Szerokość matrycy jest przechowywana w N.
  • Obrót w pozycji kdo rozwiniętej tablicy zmienia cztery wskaźniki: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Dla każdego indeksu kwzdłuż listy instrukcji obliczam odpowiadającą temu permutację i stosuję ją do rozwijanej tablicy wejściowej.
  • Pozostawia to problem polegający na tym, że w szyku liniowym niektóre obroty zostaną ustawione z lewym górnym rogiem w ostatniej kolumnie danych wejściowych. Aby je pominąć, przestawiam zera na listę instrukcji, tak że te niepoprawne podbloki 2x2 technicznie przetwarzane, ale bez operacji.
Martin Ender
źródło
1

Python 2 , 166 159 bajtów

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

Wypróbuj online!

Jonathan Frech
źródło