हास्केल (लैंबडॉट), 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को हर गोज़िंटा श्रृंखला से पहले रखा जाता है, क्योंकि (#)फ़ंक्शन कभी भी चेन में नहीं डालता है।