Drehe jeden 2x2 Block in einer Matrix

11

Die Herausforderung

Gegeben eine n x mMatrix mit n > 1und m > 1 mit ganzen Zahlen gefüllt

1 2 3
4 5 6

und eine Liste von ganzen Zahlen mit genau so vielen Werten wie 2x2Blöcke in der Matrix ( (n-1)*(m-1)wenn Sie die genaue Zahl benötigen)

[1, 2]

Geben Sie die Matrix mit jedem 2x2Block aus, der um den aktuellen Wert in der Liste in der angegebenen Reihenfolge gedreht wird. Das obige Beispiel würde ergeben

4 6 2
5 3 1

Der erste Block wird einmal nach rechts und der zweite Block zwei Mal nach rechts gedreht.

Anmerkungen

  • Eine positive Ganzzahl bedeutet, dass Sie sich um so viele Schritte nach rechts drehen.
  • Eine negative Ganzzahl bedeutet, dass Sie sich um so viele Schritte nach links drehen.
  • Eine Null bedeutet, dass Sie nicht drehen.
  • Sie drehen die Blöcke zeilenweise. Das heißt, Sie beginnen in der ersten Reihe und gehen nach rechts. Sobald Sie jeden Block in dieser Reihe gedreht haben, fahren Sie mit dem nächsten fort. Am Ende wurde jeder Block genau einmal gedreht.
  • Beachten Sie, dass sich die Blöcke überlappen. Die erste Matrix oben hat die Blöcke [[1,2],[4,5]]und [[2,3],[5,6]]zum Beispiel.
  • Jede Drehung eines Blocks wirkt sich auf die Drehung der benachbarten Blöcke aus. Aus diesem Grund müssen Sie die Rotationen in dem oben beschriebenen Muster ausführen.

Regeln

  • Sie können die Eingabe im bequemsten Format vornehmen. Bitte geben Sie in Ihrer Antwort an, welche Sie verwenden. Dies erlaubt Ihnen jedoch nicht , die Matrix blockweise zu lesen.
  • Funktion oder volles Programm erlaubt.
  • Standardregeln für die Eingabe / Ausgabe.
  • Es gelten Standardlücken .
  • Dies ist , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Einreichung.

Testfälle

Das Eingabeformat ist hier eine Liste von Listen für die Matrix und eine normale Liste für die Werte.

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

Viel Spaß beim Codieren!

Denker
quelle

Antworten:

4

CJam ( 42 40 Bytes)

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

Online-Demo

Grundsätzlich wird dieselbe Technik zweimal angewendet, um den Block zu falten

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

das arbeitet auf einer 2x2 Matrix und mehrmals zu drehen.

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

kann mit verarbeitet werden

.{block}

und hat die Wirkung von

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

weil .(wie %in CJam) die Ergebnisse erst dann in einem Array gesammelt werden, wenn es fertig ist.

Peter Taylor
quelle
Sie können ein Byte speichern, indem Sie das 4,=richtige Modulo verwenden (es sei denn, Ihr Block muss mindestens einmal ausgeführt werden?).
Martin Ender
Was ist auch mit zW%der Rotation?
Martin Ender
@ MartinBüttner, ich fand die Rotation zu lang, konnte mich aber nicht an die kürzere erinnern. Schöner Trick auf dem Modulo.
Peter Taylor
2

CJam, 65 63 60 55 Bytes

Es muss einen besseren Weg geben, dies zu tun ...

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

Dies ist eine unbenannte Funktion, die die Anweisungen und die Matrix (in dieser Reihenfolge) auf dem Stapel erwartet und die resultierende Matrix an ihrer Stelle belässt.

Testen Sie es hier.

Erläuterung

Ich habe momentan keine Lust, die vollständige Aufschlüsselung für den Code zu schreiben. Hier ist eine grobe Übersicht:

  • Die Manipulation von 2D-Arrays ist in CJam ein Problem. Stattdessen rolle ich die Matrix ab, berechne jede Drehung als Permutation der Elemente an bestimmten Positionen und teile das Array am Ende erneut in Zeilen auf. Die Breite der Matrix wird in gespeichert N.
  • Eine Drehung in der Position kin dem Array abgerollt ändert vier Indizes: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Für jeden Index kentlang der Anweisungsliste berechne ich eine entsprechende Permutation und wende sie auf das nicht gerollte Eingabearray an.
  • Dies führt zu dem Problem, dass im linearen Array einige Rotationen mit der oberen linken Ecke in der letzten Spalte der Eingabe positioniert werden. Überspringen diese, im Riffelteiler I Nullen in die Befehlsliste, so dass diese ungültigen 2x2 - Unterblocks sind technisch bearbeitet, jedoch mit einem No-op.
Martin Ender
quelle
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

Probieren Sie es online aus!

Jonathan Frech
quelle