Обертайте кожен рядок і стовпець у матриці


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 Поверніть перший стовпчик вниз на 2
                   3 4

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

-1 2 3 Поверніть другий стовпчик вгору на 1
                   4 1

Правила

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

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

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

[[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 (Діялог розширений) , 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)? Також ОП може дозволити вам робити зворотний вклад.
Adám

Так виходить, що dfns ', atщо знаходиться за розширеним @, не є сумісним розширенням. Однак ви можете використовувати нативну, за @допомогою `@1якої зберігається байт @1 1.
Adám

чи обертається робота по-різному в apl vs J? Я намагаюся перекласти це на J, і знаходжу це набагато більш багатослівним ...
Jonah

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.