गणितज्ञ, 70 69 बाइट्स
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
एक अनाम फ़ंक्शन जो पूर्णांक लेता है और लौटाता है। यह इनपुट पर एक त्रुटि फेंकता है 1
लेकिन फिर भी सही परिणाम की गणना करता है।
व्याख्या
हमेशा की तरह, सभी वाक्यात्मक चीनी के कारण, पढ़ने का क्रम थोड़ा अजीब है। एक &
सही परिभाषित करता है एक अनाम समारोह और अपने तर्कों पर से जाने जाते हैं #
, #2
, #3
, आदि
...FactorInteger@#...
हम इनपुट फैक्टरिंग द्वारा शुरू करते हैं। यह जोड़े की सूची देता है {prime, exponent}
जैसे इनपुट 12
देता है {{2, 2}, {3, 1}}
। थोड़ा असुविधाजनक, 1
देता है {{1, 1}}
।
(...&)@@@...
यह स्तर 1 पर पूर्णांकों की सूची में बाईं ओर फ़ंक्शन को लागू करता है, यह फ़ंक्शन प्रत्येक जोड़ी के लिए कहा जाता है, प्राइम और घातांक को अलग-अलग तर्कों के रूप में पारित करता है, और फिर परिणामों की एक सूची देता है। (यह सूची पर फ़ंक्शन को मैप करने के समान है, लेकिन एक जोड़ी प्राप्त करने की तुलना में दो अलग-अलग तर्क प्राप्त करना अधिक सुविधाजनक है।)
...PrimePi@#...
हम बिल्ट-इन का उपयोग करके (प्राइम) इनपुट तक और (सहित) प्राइम की संख्या की गणना करते हैं PrimePi
। यह हमें प्रमुख का सूचकांक देता है।
...BitXor[...+1,1]-1...
परिणाम बढ़ा हुआ है, XOR'ed के साथ 1
और फिर से घटाया गया है। यह स्वैप 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, यानी सभी 1-आधारित सूचकांक। ध्यान दें कि इस प्रक्रिया के लिए इनपुट 1
मिलेगा 0
, PrimePi
जिसके बाद मैप किया -1
जाएगा। हम बाद में उससे निपटेंगे।
...Prime[...]^#2...
अब हम n वें अभाज्य को प्राप्त करते हैं (जहाँ n पिछली संगणना से परिणाम है), जो कि सही ढंग से अदला-बदली का अभाज्य है, और इसे इनपुट के गुणन में मूल अभाज्य की शक्ति तक बढ़ाते हैं। इस बिंदु पर Prime[-1]
एक त्रुटि फेंक देंगे, लेकिन खुद को निर्विवाद रूप से वापस कर देंगे। इस मामले में शक्ति 1
इतनी है कि पूरी प्रक्रिया अब तक {Prime[-1]}
इनपुट के लिए पैदावार 1
और अन्य सभी इनपुट के लिए सही प्रधान शक्तियों की एक सूची है।
1##&@@...
अगला, हम सिर्फ सभी प्रमुख शक्तियों को गुणा करते हैं। समारोह के 1##&
लिए एक मानक गोल्फ चाल है Times
। देखें इस टिप यह कैसे काम करता लिए (अनुभाग "बहस के दृश्यों")।
अंत में, हमें इनपुट का ध्यान रखना होगा 1
जिसके लिए उपरोक्त सभी का परिणाम है Prime[-1]
। हम एक सरल प्रतिस्थापन नियम के साथ इसे आसानी से ठीक कर सकते हैं। याद रखें कि इसके f@x
लिए कम है f[x]
। हम बस उस फॉर्म की किसी भी अभिव्यक्ति से मेल खाना चाहते हैं (क्योंकि अन्य सभी परिणाम पूर्णांक होंगे, अर्थात परमाणु अभिव्यक्ति), और इसे इसके साथ बदलें 1
:
.../._@_->1
यहाँ, इसके /.
लिए संक्षिप्त है ReplaceAll
, _@_
फॉर्म की f[x]
किसी भी चीज के लिए एक पैटर्न है (अर्थात किसी एकल बच्चे के साथ कोई भी मिश्रित अभिव्यक्ति) और ->1
कहता है कि "इसके साथ बदलें 1
"।