क्यू, 47 बाइट्स
m:{*/1_-':|(0<){y-x x bin y}[*+60(|+\)\1 0]\x}
परीक्षा
+(i;m'i:1 2 3 4 5 6 7 8 9 42 1000 12345)
इसे जोड़े के रूप में पढ़ें (i, map (m, i)), जहाँ m गणना कार्य है और i अलग-अलग आर्ग्स है
लेखन
1 1
2 2
3 3
4 3
5 5
6 5
7 10
8 8
9 8
42 272
1000 12831
12345 138481852236
व्याख्या
n funtion\arg
फ़ंक्शन (फ़ंक्शन (फ़ंक्शन (... फ़ंक्शन (args))) n बार (आंतरिक रूप से ताल पुनर्संयोजन का उपयोग करता है) लागू करता है, और परिणामों के अनुक्रम को लौटाता है। हम फाइबोनैसी श्रृंखला के 60 पहले आइटम की गणना करते हैं *+60(|+\)\1 0
। उस स्थिति में फ़ंक्शन होता है। | +): + \ _ एक अनुक्रम पर लागू आंशिक रकम की गणना करता है (उदा + 2 2 3 1 3 6 है), और | seq को उलट देता है। इसलिए प्रत्येक 'पुनरावृत्ति' हम दो पिछली पिछली संख्याओं के आंशिक योगों की गणना करते हैं और आंशिक वापस करते हैं। रकम उलट जाती है। 60(|+\)\1 0
1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ... *+
उत्पन्न करता है, इस परिणाम पर लागू होता है (इसे पूर्ववत करें) इसे पहले ले जाता है और परिणाम अनुक्रम 1 होता है। 1 2 3 5 8 13 21 34 55 ।।
(cond)function\args
फ़ंक्शन को लागू करता है (फ़ंक्शन (.. फंक्शन (args))) जबकि सही है, और आंशिक परिणामों के अनुक्रम को लौटाता है
function[arg]
एक से अधिक वादों के एक समारोह पर लागू एक प्रक्षेपण (आंशिक अनुप्रयोग) बनाता है
हम args को नाम दे सकते हैं, लेकिन निहित नाम x, y, z हैं
{y-x x bin y}[*+60(|+\)\1 0]
घोषित करता है कि लैम्बडा आर्ग्स x, y के साथ आंशिक प्रक्षेपण (arg x फंक्शंस श्रृंखला है, * + 60 (! +) \ 1 0 के रूप में गणना करता है। x, दशमलव मानों का प्रतिनिधित्व करते हैं, और प्रक्रिया करने के लिए संख्या y। द्विआधारी खोज (बिन) का उपयोग अधिक से अधिक रिट्रेसमेंट नंबर <= y ( x bin y
) के सूचकांक का पता लगाने के लिए किया जाता है , और x के संबंधित मूल्य को प्रतिस्थापित करता है।
आंशिक रेज़ल से उत्पाद की गणना करने के लिए हम उन्हें उल्टा करते हैं और प्रत्येक जोड़े के अंतर की गणना करते हैं ( -':|
), पहले ड्रॉप करें ( 1_
क्योंकि 0 है) और गुणा करें ( */
)।
यदि हम संचित राशि में रुचि रखते हैं तो कोड समान है, लेकिन +/
इसके बजाय */
। हम + या * के बजाय किसी अन्य डायैडिक ऑपरेटर का भी उपयोग कर सकते हैं
निष्पादन क्षमता के बारे में
मुझे पता है कि इस प्रतियोगिता में दक्षता कोई मुद्दा नहीं है। लेकिन इस समस्या में हम अस्तर लागत से लेकर घातीय लागत तक हो सकते हैं, इसलिए मैं इसके बारे में उत्सुक हूं।
मैंने दूसरा संस्करण विकसित किया (टिप्पणी को छोड़कर 48 बाइट्स लंबाई) और दोनों संस्करणों पर बार-बार परीक्षण मामलों की बैटरी 1000 बार।
f:*+60(|+\)\1 0;m:{*/1_-':|(0<){x-f f bin x}\x} /new version
निष्पादन समय है: मूल संस्करण 0'212 सेग, नया संस्करण 0'037 सेग
मूल संस्करण फंक्शनबोन सीरी की गणना एक बार फंक्शन एप्लिकेशन के अनुसार करता है; नया संस्करण केवल एक के लिए गणना करता है।
दोनों ही मामलों में रिटरीज श्रृंखला की गणना पूंछ पुनरावृत्ति का उपयोग करती है
2
कि विघटित किया जा सकता है-1 + 3
। Zeckendorf के प्रमेय का सही कथन यह है कि एक सकारात्मक फाइबोनैचि संख्या को गैर-निरंतर फाइबोनैचि संख्याओं के योग के रूप में विशिष्ट रूप से विघटित किया जा सकता है।