Tornado matrycowe jest jak każde inne tornado: składa się z rzeczy obracających się wokół środka. W tym przypadku elementy macierzy zamiast powietrza.
Oto przykład tornada matrycowego:
Najpierw zaczynamy od podzielenia macierzy na kwadratowe pierścienie, każda sekcja składa się z elementów, które są dalej od granicy o tę samą odległość. Sekcje te zostaną obrócone zgodnie z ruchem wskazówek zegara wokół środka. W prawdziwych tornadach nasilenie zwiększa się w kierunku środka, podobnie jak krok rotacji w tornado matrycowym: najbardziej zewnętrzna sekcja (czerwona) jest obracana o 1 stopień, kolejna (żółta) jest obracana o 2, i tak na. Krok obrotu to obrót o 90 ° wokół środka.
Zadanie:
Twoim zadaniem, jeśli je zaakceptujesz, jest napisanie funkcji lub programu, który przyjmuje jako dane wejściowe macierz kwadratową, stosuje do niej efekt tornado, a następnie wypisuje wynikową macierz.
Wkład:
Dane wejściowe powinny być kwadratową macierzą rzędu n
gdzie n >= 1
. Nie należy zakładać, że elementy macierzy mogą być czymkolwiek.
Wydajność:
Matryca kwadratowa tego samego rzędu, która byłaby wynikiem zastosowania efektu tronado do matrycy wejściowej.
Przykłady:
Macierz porządku n = 1
:
[['Hello']] ===> [['Hello']]
Macierz porządku n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Macierz porządku n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Odpowiedzi:
Python 3 , 100 bajtów
Wypróbuj online!
źródło
a[1:-1,1:-1]=f(a[1:-1,1:-1])
jakby to była najbardziej normalna rzecz na świecie, aby bezpośrednio uzyskać i ustawić całe wnętrze dwuwymiarowej tablicynumpy
numpy.rot90(a,1,(1,0))
jest krótszy o 3 bajty i powinien również działać.if len(a):a=...
-1 bajt).Węgiel drzewny , 44 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Działa tylko na polach postaci, ponieważ domyślne we / wy Charcoala nie oddają normalnej tablicy tablic. Wyjaśnienie:
Przeczytaj kwadrat postaci.
Pętla, aż będzie pusta.
Obróć to.
Wydrukuj go, a następnie przesuń kursor o jeden kwadrat po przekątnej od oryginalnego rogu.
Przytnij zewnętrzną stronę z tablicy.
źródło
Galaretka , 27 bajtów
Wypróbuj online!
Myślę, że może to być znacznie krótsze.
źródło
µG
stopkę i twierdzić, że twoje zgłoszenie to 25.Perl 6 ,
78 7372 bajtówDzięki nwellnhof za -5 bajtów!
Wypróbuj online!
Rekurencyjny blok kodu, który pobiera spłaszczoną tablicę 2D i zwraca podobnie spłaszczoną tablicę.
Wyjaśnienie:
źródło
@a[*;*]
zamiastmap |*,@a
spłaszczać tablicę. (Byłoby miło, gdyby istniał sposób pracy z niepłaszczonymi tablicami i wielowymiarowymi indeksami dolnymi, ale nie mogę wymyślić żadnego z nich.)@a[1..*-2;1..@a-2].=$!
działa.Oktawa ,
8681 bajtówWypróbuj online!
Wiem, że rekurencyjne funkcje anonimowe nie są najkrótszą metodą do robienia rzeczy w Octave, ale zdecydowanie są najbardziej zabawną metodą. To najkrótsza anonimowa funkcja, jaką mogłem wymyślić, ale chciałbym być obezwładniony.
Wyjaśnienie
Funkcja rekurencyjna jest zdefiniowana zgodnie z tymi wskazówkami udzielonymi przez pułapkę kota.
q=f(f=@(g)@(M) ... g(g)(M) ...
jest podstawową strukturą takiej anonimowej funkcji zg(g)(M)
wywołaniem rekurencyjnym. Ponieważ byłoby to przeszukanie w nieskończoność, mamy zawinąć wywołanie rekurencyjne w warunkowej macierzy komórkowej:{@()g(g)(M),M}{condition}()
. Funkcja anonimowa z pustą listą argumentów opóźnia ocenę po wybraniu warunku (chociaż później widzimy, że możemy użyć tej listy argumentów do zdefiniowaniaz
). Do tej pory była to tylko podstawowa księgowość.Teraz właściwa praca. Chcemy, aby funkcja zwracała
rot90(P,-1)
z P macierz, na którejg(g)
rekurencyjnie wywołano środkową część M. Zaczynamy od ustawienia,z=2:end-1
które możemy ukryć w indeksowaniu M. W ten sposóbM(z,z)
wybiera się centralną część macierzy, która musi zostać rozdartym przez rekurencyjne wezwanie.,3
Część zapewnia, że obroty są do ruchu wskazówek zegara. Jeśli mieszkasz na półkuli południowej, możesz usunąć ten bit na -2 bajty.Następnie robimy
M(z,z)=g(g)M(z,z)
. Jednak wartością wynikową tej operacji jest tylko zmodyfikowana część centralna, a nie całaP
macierz. Stąd, mamy{M(z,z)=g(g)M(z,z),M}{2}
, która jest w zasadzie skradzione z tej wskazówki Odpowiedź Stewie Griffin.Wreszcie, po
condition
prostu rekursja kończy się, gdy dane wejściowe są puste.źródło
R , 87 bajtów
Wypróbuj online!
źródło
seq(0.5)
zwraca 1 zamiast pustego wektora)MATL ,
25 24 2322Wypróbuj online!
Indeksowanie w MATL nigdy nie jest łatwe, ale przy niektórych golfach faktycznie przewyższa obecną najlepszą odpowiedź na galaretki ...
* W przypadku
n x n
matrycy program wykonujen
iteracje, podczas gdy tak naprawdę potrzebujesz tylkon/2
rotacji. Indeksowanie w MATL (AB) jest jednak na tyle elastyczne, że indeksowanie niemożliwych zakresów jest po prostu niemożliwe. W ten sposób nie trzeba marnować bajtów, aby uzyskać odpowiednią liczbę iteracji.źródło
Python 2 , 98 bajtów
Wypróbuj online!
źródło
K (ngn / k) ,
413938 bajtówWypróbuj online!
{
}
funkcja z argumentemx
#x
długośćx
- wysokość matrycy2##x
dwie kopie - wysokość i szerokość (zakłada się, że są takie same)s:
przypisać dos
dla „kształtu”!s
wszystkie wskaźniki macierzy z kształtems
, np.!5 5
jestJest to macierz 2-rzędowa (lista list), a jej kolumny odpowiadają indeksom w macierzy 5x5.
&/
minimum w dwóch rzędach:i&|i:
przypisz doi
, reverse (|
) i weź minima (&
) za pomocąi
Oto spłaszczone numery pierścieni matrycy 5x5:
4!1+
dodaj 1 i weź pozostałe modulo 4(+|:)
jest funkcją, która obraca się przez odwrócenie (|
- potrzebujemy,:
aby zmusić ją do monadyczności), a następnie transpozycję (+
- ponieważ nie jest to najbardziej prawy czasownik w „pociągu”, nie potrzebujemy:
)4(+|:)\x
nakładaj 4 razyx
, zachowując wyniki pośrednie,/'
spłaszcz każdy+
transponować(
)@'
indeksuj każdą wartość po lewej stronie z każdą wartością po prawej stronies#
zmienić kształt nas
źródło
JavaScript (ES6), 99 bajtów
Wypróbuj online!
W jaki sposób?
Przykładowe dane wyjściowe dla macierzy 5x5 ( , ):tx,y W=5 m=2
Zaczynamy od wykonujemy obrót wszystkich komórek o 90 ° zgodnie z ruchem wskazówek zegara spełniając:k=m (x,y)
podczas gdy pozostałe pozostały niezmienione.
Jest to równoważne z stwierdzeniem, że komórka nie jest obracana, jeśli mamy:
który jest testem zastosowanym w kodzie:
Następnie zmniejszamy i rozpoczynamy od nowa, aż lub (w zależności od parzystości ). Tak czy inaczej, powoduje to nasz stan zatrzymania:k = - 1 K = - 3 / 2 Wk k=−1 k=−3/2 W
źródło
Galaretka , 24 bajty
Wypróbuj online!
- Lynn
źródło
ḷ""
wygląda dla mnie magicznie ^ ^ Chcesz dodać wyjaśnienie?ḷ""
jest magiczne. Jest tylkoḷ"
z dodatkową"
… och, istnieje niewielka możliwość, żeḷ"
jest to również coś, co „wymyśliłem”, które nie było tak często używane, ponieważ często można go zastąpić jednym atomem (nie w tym przypadku, ponieważ wejście może0
również zawierać ).Haskell , 108 bajtów
Wypróbuj online!
Kiedyś transpozycję Laikoni jest i to trochę zmodyfikowana i obrócić o 90 ° w tablicy:
Wyjaśnienie
r
obraca tablicę o 90 °.(!)
jest funkcją wyższego poziomu: „zastosuj do środka”.g![1,2,3,4,5]
jest[1] ++ g[2,3,4] ++ [5]
.f
jest funkcją tornada: przypadki podstawowe mają rozmiar 1 i 2 (jakoś 0 nie działa).W ostatnim wierszu dzieje się magia: nakładamy
r.r.r.(f!).r
na środkowe rzędy,x
a następnie obracamy wynik. Nazwijmy te środkowe rzędy M . Chcemy recurse na środkowych kolumnach z M , a dostać się do tych, możemy obracać M , a następnie użyć(f!)
. Następnie używamy,r.r.r
aby obrócić M z powrotem do jego pierwotnej orientacji.źródło
Java 10,
198192 bajtów-6 bajtów dzięki @ceilingcat .
Wypróbuj online.
Wyjaśnienie:
b
służy w zasadzie do wskazania, przy którym dzwonimy. I wtedy obróci ten pierścień, włączając wszystko w nim raz w prawo podczas każdej iteracji.Wymiana macierzy wejściowej jest wykonywana, ponieważ Java jest przekazywana przez odniesienie, więc po prostu ustawienie
r=m
oznaczałoby, że obie macierze zostałyby zmodyfikowane podczas kopiowania z komórek, powodując nieprawidłowe wyniki. Dlatego musimy utworzyć nowąObject
macierz (nowe odniesienie) i skopiować wartości w każdej komórce jeden po drugim.źródło
MATLAB, 93 bajty
Jestem pewien, że można w jakiś sposób zagrać w golfa.
Wyjaśnienie
źródło
C (gcc) ,
128118115 bajtów-15 bajtów od @ceilingcat
Wypróbuj online!
źródło
Haskell, 274 bajty
w
to główna funkcja, której[[a]] -> [[a]]
można się spodziewać.Jestem pewien, że bardziej doświadczony golfista Haskell mógłby to poprawić.
źródło