Pomysł
Robiliśmy już spirale macierzy, pełne obroty, a nawet obroty po przekątnej , ale nie, o ile potrafię, rotacje węża !
Co to jest obrót węża?
Wyobraź sobie rzędy matrycy wężące się w przód iw tył, z dzielnikami między nimi jak dzielniki długiej kolejki:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Teraz wyobraź sobie, że obracasz te elementy o 2. Każdy przedmiot przesuwa się, podobnie jak ludzie poruszający się w linii, a przedmioty na końcu wysypują się i wracają do początku:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
Jeśli liczba wierszy jest nieparzysta, wyjdzie ona z prawej strony, ale nadal będzie zawijać się na początek. Na przykład, oto 3 obrót:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
Negatywny obrót zabierze Cię do tyłu. Oto obrót -2:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
Wyzwanie
Twoja funkcja lub program przyjmie 2 dane wejściowe, w dowolnym dogodnym formacie:
- Matryca
- Liczba całkowita (dodatnia lub ujemna) wskazująca, ile miejsc ją obrócić.
Zwróci:
- Obrócona matryca
Uwagi:
- Kod golfa. Wygrywa najmniej bajtów.
- Matryce nie muszą być kwadratowe, ale będą zawierać co najmniej 2 wiersze i 2 kolumny
- Dodatnie liczby całkowite będą obracać wiersz 1 w prawo
- Ujemne liczby całkowite będą obracać wiersz 1 w lewo
- W razie potrzeby możesz odwrócić znaczenie dodatnich / ujemnych liczb rotacji
- Liczba rotacji może być większa niż liczba elementów. W takim przypadku zostanie zawinięty. Oznacza to, że będzie to równoważne liczbie modułów.
- Macierz będzie zawierać tylko liczby całkowite, ale może zawierać dowolne liczby całkowite, w tym powtórzenia
Przypadki testowe
Format:
- Matryca
- Numer obrotu
- Oczekiwana wartość zwrotu
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
code-golf
array-manipulation
matrix
Jonasz
źródło
źródło
Odpowiedzi:
Galaretka , 10 bajtów
Dyadyczny link akceptujący znak po lewej stronie i liczbę całkowitą obrotu po prawej stronie (używa odwrotnego znaczenia dodatniego / ujemnego)
Wypróbuj online!
W jaki sposób?
źródło
R ,
121110101 bajtówWypróbuj online!
Przewodnik
źródło
Python 3.8 (wersja wstępnaSSSse) , 119 bajtów
Akceptacja nienazwanej funkcji,
matrix, rotation
która daje nową macierz.Używa przeciwnego znaku obrotu.
Wypróbuj online!
W jaki sposób?
Ustawiamy
n=-1
z góry, aby zaoszczędzić na nawiasach później i przyjmujemy macierz jakom
a obrót jakor
.Nowa matryca ma takie same wymiary jak
m
- o szerokościw
(w:=len(m[0])
) i wysokościh
(h:=len(m)
).Każdy inny wiersz tej macierzy jest odwrócony (
[::n**j]
).Wartości są wyszukiwane poprzez obliczenie ich wiersza i kolumny w oryginale,
m
przy użyciu bieżącego wiersza elementówi
i kolumny,j
...Ustawiliśmy
s
nar+i
ik
do(j+s//w)%h
.k
to wiersz oryginału, do którego dostęp ma nasz obecny element.Aby łatwo uzyskać dostęp do nieparzystych indeksowanych wierszy z prawej strony, odwracamy takie wiersze przed uzyskaniem dostępu do ich elementów (z
[:n**k]
), oznacza to, że element zainteresowania znajduje się ws%w
.źródło
J ,
413021 bajtów-11 bajtów dzięki Jonaszowi!
-9 bajtów dzięki FrownyFrog & ngn!
Wypróbuj online!
Wywrócony
+/-
źródło
$@]t@$(|.,@(t=.#\,`(|.@,)/.]))
( Wypróbuj online! )&.
cały czas traciłem lewy argument, dlatego się poddałem.JavaScript (Node.js) , 102 bajty
Pobiera dane wejściowe jako
(matrix)(integer)
. Znaczenie znaku liczby całkowitej jest odwrócone.Wypróbuj online!
Funkcja pomocnika
Główna funkcja
źródło
05AB1E , 16 bajtów
Wypróbuj online!
Dzięki Emigna za -5. Niestety nie widzę, jak grać w golfa w zbędną część. :(
źródło
Węgiel drzewny , 36 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Odwróć alternatywne rzędy danych wejściowych.
Spłaszcz macierz.
Obróć spłaszczony układ.
Podziel tablicę z powrotem na rzędy.
Odwróć alternatywne rzędy.
Konwertuj każdy wpis na ciąg i dane wyjściowe w domyślnym formacie wyjściowym, który jest jedną liczbą w wierszu z wierszami podwójnie rozmieszczonymi. (Formatowanie za pomocą separatora kosztowałoby długość separatora).
źródło
Pyth, 20 bajtów
Wypróbuj online tutaj .
źródło
Japt , 28 bajtów
Spróbuj
Odpowiedź Portu Arnaulda . Największym wyzwaniem było stworzenie funkcji wielokrotnego użytku. W szczególności istnieje funkcja pomocnicza do odwracania co drugi wiersz. Podejście, które podejmuję, polega na wykonaniu połączenia rekurencyjnego i zależy od tego, czy zmienna jest ustawiona.
Transpiled JS:
źródło
Python 3 , 94 bajty
Wypróbuj online!
Wykorzystałem odwrócenie nieparzystego rzędu z odpowiedzi Jonathana Allana .
źródło
APL (Dyalog Classic) , 20 bajtów
Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 141 bajtów
Wypróbuj online!
Łącznie -5 bajtów dzięki @someone!
Anonimowa funkcja, która dokonuje modyfikacji w miejscu macierzy wejściowej.
Pojedyncza pętla przechodzi przez komórki. Możesz skanować od góry do dołu i od lewej do prawej za pomocą następujących wzorów:
row=i/w
col=i%w
Gdzie
i
jest licznikiem pętli iw
liczbą kolumn. Różni się to nieznacznie podczas skanowania we wzór węża.row=i/w
col=i%w
(0, 2, 4 itd. Rząd)col=w-i%w-1
(1., 3., 5. itd.)Inną rzeczą wartą uwagi jest to, że
%
w C # nie konwertuje się na wartość dodatnią, tak jak w niektórych innych językach. Potrzebne jest kilka dodatkowych bajtów, aby to uwzględnić.źródło
dynamic
; komentarz też l. Wypróbuj online!var
do gry w golfa, co nie pozwala zadeklarować listy zmiennych. Prawdopodobnie dlatego mi tego brakowało. Dobry chwyt!y
całkowicie, aby zaoszczędzić 2 bajty: Wypróbuj online!