हास्केल (लैंबडॉट), 92 85 बाइट्स
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)
आयात करने की guard
आवश्यकता के बाद से लैंबडबॉट हास्केल की आवश्यकता Control.Monad
है। मुख्य कार्य एक अनाम फ़ंक्शन है, जो मुझे बताया गया है कि इसकी अनुमति है और यह बाइट्स के एक जोड़े को बंद कर देता है।
सात बाइट बचाने के लिए लाइकोनी के लिए धन्यवाद।
स्पष्टीकरण:
मोनाड बहुत आसान हैं।
x # y
यह हमारा पुनरावर्ती कार्य है जो सभी वास्तविक कार्य करता है। x
वह संख्या है जिस पर हम जमा हो रहे हैं (विभाजकों का वह उत्पाद जो मूल्य में रहता है), और y
अगला नंबर है जिसे हमें उसमें विभाजित करने का प्रयास करना चाहिए।
| x == y = [[x]]
यदि x
बराबरी है y
तो हम पुनरावृत्ति कर रहे हैं। बस x
वर्तमान gozinta श्रृंखला के अंत के रूप में उपयोग करें और इसे वापस करें।
| 1 > 0 =
"ट्रू" के लिए हास्केल गोल्फ-इस्म। यही है, यह डिफ़ॉल्ट मामला है।
(guard (mod x y < 1) >>
अब हम सूची के अंदर काम कर रहे हैं। सूची के भीतर, हमारे पास एक ही समय में कई विकल्प बनाने की क्षमता है। थकावट द्वारा किसी चीज का "सभी संभव" खोजने पर यह बहुत मददगार होता है। guard
बयान "केवल निम्न विकल्प पर विचार करता है, तो एक शर्त सच है" कहते हैं। इस मामले में, केवल निम्न विकल्प पर विचार करें यदि y
विभाजित करता है x
।
(y:) . map (y *) <$> div x y#2)
यदि y
विभाजित होता है x
, तो हमारे पास y
गोज़िंटा श्रृंखला में जोड़ने का विकल्प है । इस मामले में, पुनरावर्ती कॉल (#)
, बराबर के y = 2
साथ शुरू हो रहा x
है x / y
, क्योंकि हम "फैक्टर आउट" करना चाहते हैं जो y
हमने सिर्फ श्रृंखला में जोड़ा है। फिर, इस पुनरावर्ती कॉल से जो भी परिणाम होता है, y
हम द्वारा इसके कई मूल्यों y
को वास्तव में सचित्र कर दिया जाता है और आधिकारिक रूप से gozinta श्रृंखला में जोड़ दिया जाता है।
++
निम्नलिखित विकल्प पर भी विचार करें। यह बस दो सूचियों को एक साथ जोड़ता है, लेकिन हम इसे "इस चीज को करने या इस अन्य चीज के बीच चयन करने" के रूप में कह सकते हैं।
x # (y + 1)
अन्य विकल्प केवल पुनरावृत्ति जारी रखना है और मूल्य का उपयोग नहीं करना है y
। अगर y
नहीं बंटता है x
तो यह एकमात्र विकल्प है। यदि y
विभाजित होता है x
तो इस विकल्प को अन्य विकल्प के रूप में भी लिया जाएगा, और परिणाम संयुक्त होंगे।
map (1 :) . (# 2)
यह मुख्य gozinta फ़ंक्शन है। यह (#)
अपने तर्क के साथ कॉल करके पुनरावृत्ति शुरू करता है। ए 1
को हर गोज़िंटा श्रृंखला से पहले रखा जाता है, क्योंकि (#)
फ़ंक्शन कभी भी चेन में नहीं डालता है।