Обертати кожен блок 2x2 у матриці


11

Змагання

Дано n x mматрицю з n > 1і m > 1 заповнене цілими числами

1 2 3
4 5 6

і список цілих чисел з точно стільки ж значень, скільки 2x2блоків у матриці ( (n-1)*(m-1)якщо вам потрібно точне число)

[1, 2]

Виведіть матрицю з кожним 2x2блоком, повернутим на поточне значення у списку в заданому порядку. Наведений вище приклад дасть результат

4 6 2
5 3 1

Перший блок обертається один раз праворуч, а другий блок обертається два праворуч.

Примітки

  • Позитивне ціле число означає, що ви обертаєтесь правильно на стільки кроків.
  • Від’ємне ціле число означає, що ви повертаєте ліворуч на стільки кроків.
  • Нуль означає, що ви не обертаєтесь.
  • Ви обертаєте блоки рядково. Це означає, що ви починаєте з першого ряду і рухаєтесь праворуч. Після повернення кожного блоку в цьому ряду ви переходите до наступного. Наприкінці кожен блок був повернутий рівно один раз.
  • Майте на увазі, що блоки перекриваються один з одним. Перша матриця вище має блоки [[1,2],[4,5]]і, [[2,3],[5,6]]наприклад.
  • Кожне обертання блоку впливає на обертання сусідніх блоків. Ось чому ви повинні робити обертання за описаною вище схемою.

Правила

  • Ви можете взяти вхід у найбільш зручному форматі. Вкажіть, будь ласка, у відповіді, який саме ви використовуєте. Це не дозволяє вам читати матрицю блочно.
  • Функція або повна програма дозволена.
  • Правила вводу / виводу за замовчуванням .
  • Застосовуються стандартні лазівки .
  • Це , тому виграє найменший байт. Tiereaker є більш раннім поданням.

Тестові справи

Формат введення тут - це список списків для матриці та нормальний список значень.

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

Щасливе кодування!

Відповіді:


4

CJam ( 42 40 байт)

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

Демонстрація в Інтернеті

В основному це застосовується одна і та ж методика двічі для того, щоб скласти блок

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

який працює на матриці 2x2 і кілька разів обертається.

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

можна обробити с

.{block}

і має ефект

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

тому що .(як %у CJam) не збирає результати в масив, поки не буде закінчено.


Ви можете зберегти байт, скориставшись 4,=правильним модулем (хіба що блоку потрібно запустити хоч раз?).
Мартін Ендер

А як щодо zW%ротації?
Мартін Ендер

@ MartinBüttner, я вважав, що обертання здається занадто довгим, але коротший не міг згадати. Хороший трюк на модулі.
Пітер Тейлор

2

CJam, 65 63 60 55 байт

Там повинен бути кращий спосіб зробити це ...

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

Це неназвана функція, яка очікує вказівки та матрицю (у тому порядку) на стеку та залишає отриману матрицю на їх місці.

Тестуйте це тут.

Пояснення

Мені зараз не хочеться писати повну розбивку для коду, тому ось приблизний огляд:

  • 2D маніпуляція з масивом - це біль у CJam, тому я замість цього розгортаю матрицю, обчислюю кожне обертання як перестановку елементів у певних положеннях, а потім знову розбиваю масив на рядки в кінці. Ширина матриці зберігається в N.
  • Обертання в положенні kв розгорнутому масиві змінює чотири індекси: k <- k+1, k+1 <- k+1+N, k+N <- k, k+1+N <- k+1. Для кожного індексу kвздовж списку інструкцій я обчислюю перестановку, відповідну цьому, і застосовую його до незакрученого вхідного масиву.
  • Це залишає проблему в тому, що в лінійному масиві деякі обертання будуть розміщуватися з його лівим лівим кутом в останньому стовпці вводу. Для того, щоб пропустити їх, я пороги нулів в список команд, так що ці недійсне 2х2 субблоки є технічно оброблені, але з не-криком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.