W ramach algorytmu kompresji standard JPEG rozwija matrycę do wektora wzdłuż przeciwbieżnych zmiennych kierunków:
Twoim zadaniem jest pobranie matrycy (niekoniecznie kwadratowej) i zwrócenie jej w rozwiniętej formie. Jako przykład:
[1 2 3 4
5 6 7 8
9 1 2 3]
powinien ustąpić
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
Zasady
Możesz założyć, że elementy macierzy są dodatnimi liczbami całkowitymi mniejszymi niż 10
.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Matryca wejściowa może być podana w dowolnej wygodnej, jednoznacznej, zagnieżdżonej liście lub formacie łańcuchowym, lub jako płaska lista wraz z oboma wymiarami macierzy. (Lub, oczywiście, jako typ matrycy, jeśli Twój język je ma.)
Wektor wyjściowy może mieć dowolny dogodny, jednoznaczny, płaski format lub ciąg znaków.
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 3 4] [5 6 7 8] [9 1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 5 9 6 3 4 7 1 2 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Powiązane wyzwania
- Zrekonstruuj zygzakowatą matrycę (nieco trudniejszą odwrotną transformację)
- Obróć anty-przekątne
źródło
Odpowiedzi:
J,
3130141211 bajtówYch . Za duży.Pobiera macierz jako dane wejściowe.
Wyjaśnienie
J ma tutaj przewagę. Istnieje polecenie o nazwie oblique (
/.
), które pobiera kolejno linie ukośne i stosuje do nich czasownik. W tym przypadku używam gerunda do stosowania naprzemiennie dwóch czasowników:<
( pole ) i<@|.
( odwrotność i pole). To jest po prostu kwestia rozpakowania wszystkiego przy użyciu;
( Raze ).źródło
Pyth,
24232120191817 bajtówAlternatywna 17-bajtowa wersja:
ssuL_G=!T.T+LaYkQ
Dzięki @FryAmTheEggman za bajt, @Jakube za 2 bajty i @isaacg za bajt!
Wyjaśnienie „czarnej magii”, o której mowa powyżej:
m_W=!Td
zasadniczo odwraca każdą inną podtablicę. Odbywa się to poprzez mapowanie_W=!T
każdej podtablicy;W
jest aplikacją warunkową, więc_
s (odwraca) wszystkie podpowierzchnie, w których=!T
jest to prawda.T
jest zmienną wstępnie zainicjalizowaną na dziesięć (prawdę) i=!T
oznacza(T = !T)
. Przełącza więc wartość zmiennej, która zaczyna prawdę i zwraca nową wartość, co oznacza, że będzie naprzemiennie powracać do fałszu, prawdy, fałszu, prawdy ... (podziękowania dla Jakube za ten pomysł)Zestaw testowy tutaj .
źródło
Galaretka,
2419151311 bajtówPobiera liczbę wierszy, liczbę kolumn i płaską listę jako osobne argumenty wiersza polecenia.
Wypróbuj online!
Jak to działa
źródło
⍁
i⍂
? A może skandynawskiø
iǿ
?MATL ,
2827 bajtówNa podstawie mojej odpowiedzi tutaj . Ogólna idea polega na utworzeniu tablicy 2D o tym samym rozmiarze co dane wejściowe, wypełnionej wartościami, które rosną w tej samej kolejności co zygzakowata ścieżka. Następnie linearyzowana (spłaszczona) wersja tej tablicy jest sortowana, a wskaźniki tego sortowania są zachowywane. Są to wskaźniki, które należy zastosować do danych wejściowych, aby uzyskać ścieżkę zygzakowatą.
Dane wejściowe są w formie
Wyjaśnienie
Wypróbuj online!
źródło
Matlab, 134 bajty
Po prostu starałem się skrócić mój kod w Matlabie, jak telegrafowanie.
Uwagi:
M
jestm×n
matrycą.a
ib
obie macierze są tego samego rozmiaruM
, każdy wiersza
składa się z liczb równych jego numerowi wiersza, podczas gdy każda kolumnab
jest równa jego numerowi kolumny. Zatema
+b
jest macierzą, której element jest równy sumie jego numeru wiersza i kolumny, tjmatrix(p,q)=p+q
.A(p,q)=p+q-1
; aB(p,q)=p-q
.C
jest wyrażone matematycznie jako równanie poniżej. za pomocą równania można wykonać zygzakowato rosnącą matrycę, jak pokazano poniżej.C
wskazuje kolejność elementów M w zygzakowatych wynikach. Następnie[~,I]=sort(C(:));
zwraca kolejność, czyliI
w ten sposób,V=V(I)'
to wynik.źródło
JavaScript (SpiderMonkey 30+), 99 bajtów
Testowane w przeglądarce Firefox 44. Pobiera dane wejściowe jako tablicę 2D.
źródło
Python 2, 84 bajtów
Przeniesienie odpowiedzi na nich . Przyjmuje płaski układ o określonej szerokości i wysokości. xsot zapisał bajt.
88 bajtów:
Przyjmuje płaski układ o określonej szerokości i wysokości. Sortuje odpowiadające współrzędne 2D
(i/w,i%w)
w kolejności zygzakowatej, zwiększając sumę, aby uzyskać przekątne, przerwane przez zwiększenie lub zmniejszenie wartości wiersza, na podstawie tego, czy wiersz plus kolumna jest nieparzysty, czy parzysty.źródło
Haskell,
797873 bajtówDane wejściowe to płaska lista z liczbą wierszy i kolumn, np.
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
->[1,2,5,9,6,3,4,7,1,2,8,3]
.Jak to działa: przejdź przez współrzędne xiy matrycy (
h
wiersze,w
kolumny) w dwóch zagnieżdżonych pętlach:tj. od góry / prawo do dołu / lewo, pomijanie powiązanych indeksów (
y
ix
musi spełniaćy<h
ix-y<w
). Kiedyx
jest parzysty, kolejność pętli wewnętrznej jest odwrócona:y
przechodzi zx
na0
. Robię to, wybierając funkcję modyfikującą dla zakresu y,[0..x]
który jest tymx
elementem[reverse,id,reverse,id,...]
.Edycja: @xnor zmienił układ pętli i zapisał 5 bajtów. Dzięki!
źródło
g=id:reverse:g
.(y-x)*w
mogą być cięte przez transpozycję problem:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. Tłumaczenie na Python pozwala zaoszczędzić 3 znaki w porównaniu do tego, co miałem.Python 2 + NumPy, 122 bajty
Przyznaję. Pracowałem naprzód. Niestety tej samej metody nie można łatwo zmodyfikować, aby rozwiązać pozostałe 2 powiązane wyzwania ...
Pobiera na wejściu tablicę numpy. Wyświetla listę.
Wypróbuj online
Wyjaśnienie:
Lambda ma tę samą długość:
źródło
Python 3,
131118115107 bajtówOpierając się na tej samej Książęcej jako moją odpowiedź na wyzwanie Deusovi za
Zakładam, że nie możemy mieć zera w macierzy wejściowej
Wyjaśnienie
jak to działa :
Wyniki
źródło
reverse even line
byćreverse odd lines
zamiast tego?