Поворот каждого блока 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]], например.
  • Каждое вращение блока влияет на вращение соседних блоков. Вот почему вы должны делать повороты по схеме, описанной выше.

правила

  • Вы можете принять вход в наиболее удобном формате. Пожалуйста, укажите в своем ответе, какой вы используете. Это не позволяет вам читать матрицу по блокам, хотя.
  • Функция или полная программа разрешены.
  • Правила по умолчанию для ввода / вывода.
  • Применяются стандартные лазейки .
  • Это , поэтому выигрывает меньшее количество байт. Tiebreaker является более ранним представлением.

Контрольные примеры

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

[[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/}

Это безымянная функция, которая ожидает инструкции и матрицу (в этом порядке) в стеке и оставляет полученную матрицу на своем месте.

Проверьте это здесь.

объяснение

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

  • Манипулирование двумерным массивом является проблемой в 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.