Obróć każdy wiersz i kolumnę w matrycy

15

Wyzwanie

Biorąc pod uwagę n x nmacierz liczb całkowitych zn >= 2

1 2
3 4

oraz lista liczb całkowitych z dokładnie takimi 2nelementami

[1,2, -3, -1]

wyprowadza obróconą matrycę. Ta matryca jest konstruowana w następujący sposób:

  • Weź pierwszą liczbę całkowitą z listy i obróć pierwszy rząd w prawo o tę wartość.
  • Weź następną liczbę całkowitą i obróć pierwszą kolumnę o tę wartość w dół.
  • Weź następną liczbę całkowitą i obróć drugi rząd w prawo o tę wartość itp., Aż obrócisz każdy wiersz i kolumnę macierzy jeden raz.

Lista może zawierać ujemne liczby całkowite, co oznacza, że ​​przesuwasz wiersz / kolumnę w lewo / w górę zamiast w prawo / w dół. Jeśli liczba całkowita wynosi zero, nie obracaj wiersza / kolumny.

Przykład z wykorzystaniem powyższego wejścia

Element listy Matryca Objaśnienie
-------------------------------------------------- ----------
1 2 1 Obróć 1. rząd w prawo o 1
                   3 4

2 2 1 Obróć 1. kolumnę w dół o 2
                   3 4

-3 2 1 Obróć 2. rząd w lewo o 3
                   4 3

-1 2 3 Obróć 2. kolumnę w górę o 1
                   4 1

Zasady

  • Możesz wybrać najbardziej spójny format wejściowy. Po prostu wyjaśnij, którego używasz.
  • Dozwolona funkcja lub pełny program.
  • Domyślne reguły wejścia / wyjścia.
  • Obowiązują standardowe luki .
  • To jest , więc wygrywa najmniej bajtów. Tiebreaker to wcześniejsze zgłoszenie.

Przypadki testowe

Format wejściowy tutaj to lista list dla macierzy i normalna lista dla liczb całkowitych.

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

Happy Coding!

Denker
źródło
mapcar powinien pomóc…
msh210

Odpowiedzi:

6

CJam, 13 bajtów

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

Nienazwany blok (funkcja), który przenosi macierz i listę na stos (w tej kolejności) i pozostawia nową macierz na swoim miejscu.

Uruchom wszystkie przypadki testowe.

Ten sam pomysł, ta sama liczba bajtów, różne implementacje:

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

Wyjaśnienie

Idealnie chcielibyśmy traktować każdą instrukcję na liście w ten sam sposób i po prostu użyć jej do obrócenia pierwszego rzędu macierzy. Można to zrobić dość łatwo, transformując matrycę po każdej instrukcji i upewniając się, że wszystkie te dodatkowe transformacje zostaną ostatecznie anulowane. Więc po przetworzeniu każdej instrukcji obracamy wszystkie wiersze o jeden w górę (tak, że następna instrukcja wzdłuż tego samego wymiaru przetwarza następny wiersz), a następnie transponujemy macierz, tak że przetwarzamy kolumny w następnej kolejności. Te dodatkowe przekształcenia są prostopadłe do instrukcji na liście i mają dokładnie taki okres 2n, jakiego potrzebujemy.

Co do kodu:

{      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.
}/
Martin Ender
źródło
4

APL (Dyalog Extended) , 17 15 14 13 bajtów

-3 bajty autorstwa Adáma

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

Wypróbuj online!

Pobiera dane wejściowe jako listę, w której pierwszym elementem jest macierz, a pozostałe elementy są wielkościami obrotu. Gdyby ⌽ obrócił się w prawo zamiast w lewo, pokonałoby to 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.
lirtosiast
źródło
{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)ale czy możesz mi wyjaśnić, dlaczego @1nie będzie działać zamiast @(⍳1)lub @(,1)? Ponadto OP może umożliwiać wprowadzanie danych w odwrotnej kolejności.
Adám
Okazuje się, że dfns, atktóry stoi za rozszerzeniem, @nie jest kompatybilnym rozszerzeniem. Można jednak użyć elementu macierzystego, @z `@1którym zapisuje się bajt @1 1.
Adám
czy rotacja działa inaczej w apl w porównaniu do J? Próbuję przetłumaczyć to na J i znajduję to o wiele bardziej szczegółowe ...
Jonah
2

Python 2, 96 bajtów

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

Testy

fzwraca listę krotek. Każda linia w treści funkcji jest wcięta 1 znakiem tabulacji.

sklepienie
źródło
Czy prosty nie return zip(*m)oszczędziłby ci 5 bajtów?
Denker,
@DenkerAffe: czy sugerujesz zamianę na m=zip(*m);return mjust return zip(*m)? Nie mogę tego zrobić, ponieważm=zip(*m) jest częścią forpętli
vaultah
Tak, to była moja sprawa. Nie widziałem, że jest w pętli, moje złe.
Denker,