Haskell (Lambdabot), 92 85 bayt
x#y|x==y=[[x]]|1>0=(guard(mod x y<1)>>(y:).map(y*)<$>div x y#2)++x#(y+1)
map(1:).(#2)
İhtiyaç duyulması guard
gereken Lambdabot Haskell'e ihtiyacı var Control.Monad
. Ana işlev, bana izin verilen ve birkaç baytlık tıraş ettiğim anonim bir işlevdir.
Yedi byte tasarruf için Laikoni'ye teşekkürler.
Açıklama:
Monadlar çok kullanışlı.
x # y
Bu, asıl işi yapan özyinelemeli fonksiyonumuzdur. x
biriktirdiğimiz sayı (değerde kalan bölenlerin ürünü) ve y
buna ayırmayı denememiz gereken bir sonraki sayıdır.
| x == y = [[x]]
Eğer x
eşittir y
o zaman bitti recursing konum. Sadece x
mevcut gozinta zincirinin sonu olarak kullanın ve iade edin.
| 1 > 0 =
"True" için Haskell golf sahası. Yani, bu varsayılan durumdur.
(guard (mod x y < 1) >>
Şimdi liste monadında çalışıyoruz. Liste monad içinde, aynı anda birden fazla seçim yapma yeteneğine sahibiz. Bu, yorgunluktan bir şeyin "mümkün olan" hepsini bulurken çok yararlıdır. guard
İfadesi "bir koşul doğruysa yalnızca aşağıdaki seçim olarak" diyor. Bu durumda, yalnızca aşağıdaki seçim olarak y
böler x
.
(y:) . map (y *) <$> div x y#2)
Eğer y
bölünmeyi yapar x
, biz ekleme seçeneğine sahip y
gozinta zincirine. Bu durumda, tekrar tekrar çağırıp (#)
, eşittir y = 2
ile başlayarak , zincire yeni eklediğimiz "çarpanı" bulmak istedik. Daha sonra, bu özyinelemeli çağrının sonucu ne olursa olsun, bizim değerlerimizi sadece çarpanlara katlayın ve gozinta zincirine resmi olarak ekleyin .x
x / y
y
y
y
++
Aşağıdaki seçimi de göz önünde bulundurun. Bu sadece iki listeyi bir araya getirir, ancak tek taraflı olarak "bu şeyi yapmaktan başka bir şey arasında seçim yapmak" diyerek düşünebiliriz.
x # (y + 1)
Diğer seçenek ise sadece özyinelemeye devam etmek ve değeri kullanmamaktır y
. Eğer y
bölmek yok x
o zaman bu tek seçenektir. Eğer y
bölme yaparsa , x
bu seçenek diğer seçeneklerin yanı sıra alınacak ve sonuçlar birleştirilecektir.
map (1 :) . (# 2)
Bu ana gozinta işlevidir. (#)
Argümanını arayarak özyinelemeye başlar . A 1
, her gozinta zincirine hazırlanmıştır, çünkü (#)
fonksiyon hiçbir zaman zincirleri içine koyar.