Поворот каждой строки и столбца в матрице


15

Соревнование

Дана n x nматрица целых чисел сn >= 2

1 2
3 4

и список целых чисел с точно 2nэлементами

[1,2, -3, -1]

вывести повернутую матрицу. Эта матрица строится следующим образом:

  • Возьмите первое целое число в списке и поверните первую строку вправо на это значение.
  • Возьмите следующее целое число и поверните первый столбец вниз на это значение.
  • Возьмите следующее целое число и поверните вторую строку вправо на это значение и т. Д., Пока не повернете каждую строку и столбец матрицы один раз.

Список может содержать отрицательные целые числа, что означает, что вы перемещаете строку / столбец влево / вверх вместо вправо / вниз. Если целое число равно нулю, не вращайте строку / столбец.

Пример использования ввода выше

Элемент списка Матрица Объяснение
-------------------------------------------------- ----------
1 2 1 Поверните 1-й ряд вправо на 1
                   3 4

2 2 1 Поверните 1-ую колонку вниз на 2
                   3 4

-3 2 1 Повернуть 2-й ряд влево на 3
                   4 3

-1 2 3 Повернуть 2-ую колонку вверх на 1
                   4 1

правила

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

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

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

[[1,2], [3,4]], [1,2, -3, -1] -> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1] -> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0] -> [[1,2], [3,4]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [1, -2,0, -1,3,4] -> [[7, 5,0], [- 3, -8,2], [- 4,1,6]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3] -> [[1 , 2, -3], [- 4,5,6], [7, -8,0]]

Удачного кодирования!


mapcar должен помочь ...
msh210

Ответы:


6

CJam, 13 байтов

{{a.m>1m<z}/}

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

Запустите все тестовые случаи.

Та же идея, то же количество байтов, разные реализации:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

объяснение

В идеале мы хотим обрабатывать каждую инструкцию в списке одинаково и просто использовать ее для поворота первой строки матрицы. Это можно сделать довольно легко, преобразовав матрицу после каждой инструкции и убедившись, что все эти дополнительные преобразования отменяются в конце. Поэтому после обработки каждой инструкции мы поворачиваем все строки на одну строку вверх (так, чтобы следующая инструкция вдоль того же измерения обрабатывала следующую строку), а затем транспонируем матрицу, так что мы фактически обрабатываем столбцы в следующем. Эти дополнительные преобразования ортогональны инструкциям в списке и имеют период точно 2n, то, что нам нужно.

Что касается кода:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/

4

APL (Dyalog Extended) , 17 15 14 13 байт

-3 байта от Адама

(⍉1⊖⌽`@1⍢⌽)/⌽

Попробуйте онлайн!

Принимает входные данные в виде списка, где первый элемент является матрицей, а остальные элементы являются величинами поворота. Если ⌽ повернуть вправо, а не влево, это побьет CJam.

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.

{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)но можете ли вы объяснить мне, почему @1не будет работать вместо @(⍳1)или @(,1)? Кроме того, OP может позволить вам принять ввод в обратном порядке.
Адам

Таким образом, оказывается, что dfns ', atстоящий за расширением @, не является совместимым расширением. Тем не менее, вы можете использовать ту, @с `@1которой сохраняется байт @1 1.
Адам

вращается по-другому в apl против J? я пытаюсь перевести это на J и нахожу это более многословным ...
Иона

2

Python 2, 96 байт

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

тесты

fвозвращает список кортежей. Каждая строка в теле функции имеет отступ от 1 символа табуляции.


Разве прямая не return zip(*m)спасет вас 5 байтов?
Денкер

@ DenkerAffe: вы предлагаете заменить m=zip(*m);return mпросто return zip(*m)? Я не могу этого сделать, потому что m=zip(*m)это часть forцикла
vaultah

Да, это было мое, хотя. Не видел, что это в цикле, мой плохой.
Денкер

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.