p
Int
s'nin bir permütasyonu ve çok boyutlu bir Int
s dizisini temsil eden iç içe bir liste alan bir (tip sınıf polimorfik) fonksiyonudur .
Olarak Çağrı p [2,1] [[10,20,30],[40,50,60]]
başarılı olmazsa varsaymak tipi, şöyle bir tür not eklemek gerekebilir ancak eğer :: [[Int]]
sonuç türünü veren (uygun şekilde iç içe).
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]
Çevrimiçi deneyin!
Haskell'de iç içe yerleştirilmiş keyfi derinlikli dizilerle yapılan golf zorlukları Haskell'de biraz gariptir, çünkü statik yazım yoluna girme eğilimindedir. Haskell listeleri (meydan okuma açıklamasındakiyle aynı sözdizimiyle) iyi yuvalanmış olsa da, farklı yuvalama derinliğindeki listeler uyumsuz türdedir. Ayrıca, standart Haskell ayrıştırma işlevleri, ayrıştırmaya çalıştığınız değerin türünü bilmenizi gerektirir.
Sonuç olarak, programın nispeten ayrıntılı olan türle ilgili bildirimleri içermesi kaçınılmaz görünmektedir. Golf edilmiş kısım için, bir dizi sınıfı tanımlamaya karar verdim P
, öyle ki p
dizi türü üzerinde polimorfik olabilir.
Bu arada, TIO'nun test donanımı, ayrıştırma sorununu çözmenin bir yolunu gösterir.
Nasıl çalışır
Bu algoritmanın özünü özetlemek için: Permütasyon listesinde bir kabarcık sıralaması yapar ve karşılık gelen permütasyon endeksleri değiştiğinde komşu boyutları aktarır.
Tarafından verildiği gibi class P a
beyan, herhangi bir durumda, p
iki bağımsız (her zaman tipte bir permütasyon alır [Int]
) ve bir dizi.
- Permütasyon, meydan okuma açıklamasındaki formda verilebilir, ancak algoritmanın çalışma şekli, endekslerin seçimi, göreceli sıraları hariç, isteğe bağlıdır. (Yani hem 0- hem de 1- tabanlı çalışma.)
- Taban , tek boyut yalnızca kendisine eşleştirilebildiğinden, basitçe değişmeden dönen
instance P Int
boyut 1 dizilerini işler p
.
- Diğeri
instance P a => P [a]
özyinelemeli olarak tanımlanır p
ve n + 1 dizileri için tanımlamak amacıyla n boyut alt dizileriyle çağrılır.
p(x:r)m
ilkinin p r
tüm öğelerinde özyinelemeli olarak arama yapar , ilkinin dışındaki tüm boyutların birbirine göreceli olarak doğru şekilde izin m
verildiği bir sonuç dizisi verir n
.
- Gerçekleştirilmesi gereken kalan permütasyon
n
tarafından verilir x:y:z = x:sort r
.
- Eğer
x<y
öyleyse, ilk boyutu n
zaten doğru yerleştirilmiş ve n
sadece döndürülür.
- Eğer
x>y
, o zaman fonksiyon ile yapılan birinci ve ikinci boyutun n
değiştirilmesi gerekir transpose
. Son olarak p(x:z)
, orijinal birinci boyutun doğru konuma aktarılmasını sağlayarak, sonucun her öğesine tekrar tekrar uygulanır.
exec
(iki bayt kaydetme) çağırmak için parantezlere ihtiyacınız yoktur