pjest funkcją (polimorficzną klasy typu) przyjmującą permutację jako listę Ints oraz zagnieżdżoną listę reprezentującą wielowymiarową tablicę Ints.
Wywołaj jako p [2,1] [[10,20,30],[40,50,60]], jednak jeśli domyślne ustawienie typu się nie powiedzie, może być konieczne dodanie adnotacji typu, takiej jak :: [[Int]](odpowiednio zagnieżdżona), podającej typ wyniku.
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
Wypróbuj online!
Wyzwania w golfa z zagnieżdżonymi tablicami o dowolnej głębokości są w Haskell nieco niezręczne, ponieważ typowe pisanie staje się przeszkodą. Podczas gdy listy Haskell (z dokładnie taką samą składnią jak w opisie wyzwania) mogą być dobrze zagnieżdżone, listy o różnej głębokości zagnieżdżenia są niezgodnych typów. Ponadto standardowe funkcje parsowania Haskella wymagają znajomości typu wartości, którą próbujesz przeanalizować.
W rezultacie wydaje się nieuniknione, że program musi zawierać deklaracje związane z typem, które są stosunkowo szczegółowe. W części golfowej postanowiłem zdefiniować klasę typów P, która pmoże być polimorficzna w stosunku do typu tablicy.
Tymczasem uprząż testowa TIO pokazuje sposób na obejście problemu z analizą.
Jak to działa
Podsumowując istotę tego algorytmu: wykonuje sortowanie bąbelkowe na liście permutacji, transponując sąsiednie wymiary, gdy odpowiednie wskaźniki permutacji zostaną zamienione.
Jak podano w class P adeklaracji, w każdym przypadku pprzyjmuje dwa argumenty, permutację (zawsze typu [Int]) i tablicę.
- Permutacja może być podana w formie w opisie wyzwania, chociaż sposób działania algorytmu, wybór wskaźników jest dowolny, z wyjątkiem ich względnej kolejności. (Więc działa zarówno na 0, jak i na 1).
- Baza
instance P Intobsługuje tablice wymiaru 1, który ppo prostu zwraca niezmieniony, ponieważ jeden wymiar można odwzorować tylko na siebie.
- Drugi
instance P a => P [a]jest definiowany rekurencyjnie, wywołując podarunki pwymiaru n , aby zdefiniować je dla tablic wymiaru n + 1 .
p(x:r)mpierwsze wywołuje p rrekurencyjnie dla każdego elementu m, dając tablicę wyników, nw której wszystkie wymiary oprócz pierwszego zostały poprawnie permutowane względem siebie.
- Pozostałą permutację, którą należy wykonać,
npodaje x:y:z = x:sort r.
- Jeśli
x<ywtedy pierwszy wymiar njest już poprawnie umieszczony i npo prostu jest zwracany.
- Jeśli
x>y, to pierwszy i drugi wymiar npotrzeby muszą zostać zamienione, co odbywa się za pomocą transposefunkcji. Na koniec p(x:z)stosuje się rekurencyjnie do każdego elementu wyniku, zapewniając przeniesienie pierwotnego pierwszego wymiaru do właściwej pozycji.
exec(oszczędzając dwa bajty) , ponieważ jest to instrukcja w Pythonie 2.