p
jest funkcją (polimorficzną klasy typu) przyjmującą permutację jako listę Int
s oraz zagnieżdżoną listę reprezentującą wielowymiarową tablicę Int
s.
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 p
moż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 a
deklaracji, w każdym przypadku p
przyjmuje 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 Int
obsługuje tablice wymiaru 1, który p
po 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 p
wymiaru n , aby zdefiniować je dla tablic wymiaru n + 1 .
p(x:r)m
pierwsze wywołuje p r
rekurencyjnie dla każdego elementu m
, dając tablicę wyników, n
w której wszystkie wymiary oprócz pierwszego zostały poprawnie permutowane względem siebie.
- Pozostałą permutację, którą należy wykonać,
n
podaje x:y:z = x:sort r
.
- Jeśli
x<y
wtedy pierwszy wymiar n
jest już poprawnie umieszczony i n
po prostu jest zwracany.
- Jeśli
x>y
, to pierwszy i drugi wymiar n
potrzeby muszą zostać zamienione, co odbywa się za pomocą transpose
funkcji. 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.