फाइबोनैचि अनुक्रम का रैखिक प्रक्षेप


20

आपका कार्य n वें फाइबोनैचि संख्या को ढूंढना है , लेकिन एन कोई पूर्णांक नहीं है।

फाइबोनैचि अनुक्रम, 0-अनुक्रमित, निम्नानुसार है:

0, 1, 2, 3, 4, 5,  6,  7, ...

1, 1, 2, 3, 5, 8, 13, 21, ...

हालाँकि, यदि हम 2 .4 वें नंबर चाहते हैं तो क्या होगा ?

2.4 वें नंबर 0.4 गुना 3 के बीच अंतर है वां और 2 nd फिबोनैकी संख्या प्लस 2 nd फिबोनैकी संख्या। तो, 2.4 वें फाइबोनैचि संख्या है 2 + 0.4 * (3 – 2) = 2.4

इसी तरह, 6.35 वें फाइबोनैचि संख्या है 13 + 0.35 * (21 – 13) = 15.8

आपका कार्य n वें फाइबोनैचि संख्या को खोजना है , जैसे कि n 0 से अधिक या उसके बराबर है।

आप यह शून्य या एक-अनुक्रमित कर सकते हैं, बस कृपया यह कहें कि आप किसका उपयोग कर रहे हैं।

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है!

कुछ और उदाहरण:

0        1
4.5    6.5
0.7      1
7       21

2
आप यहां जो ऑपरेशन कर रहे हैं उसे "रैखिक प्रक्षेप" कहा जाता है। (यदि आपको लगता है कि मैंने पोस्ट का शीर्षक बदल दिया है तो आपको बुरा लगेगा?) ऐसा लगता है कि फिबोनाची संपत्ति है कि f (n-2) + f (n-1) = f (n) है, इसलिए मुझे लगता है कि यह है फिबोनाची अनुक्रम का एक उचित सामान्यीकरण। (मुझे यकीन नहीं है कि अगर कोई मानक सामान्यीकरण है।)

@ ais523, अगर आपको लगता है कि इससे सवाल बेहतर होगा तो हाँ, आप पोस्ट का शीर्षक बदल सकते हैं।
डैनियल

मुझे लगता है कि अगर भविष्य में कोई ऐसा ही कुछ पूछता है, तो यह सवाल को आसान बना देगा, और यह भी स्पष्ट कर देगा कि यह "संबंधित" सूची क्या है। तो यह उत्तरदाताओं को सही जगह पर लाने में मदद करके प्रश्न को बेहतर बना देगा।

2
@ @ ऐसा लगता है कि बिनेट सूत्र का एक सामान्यीकरण है: mathworld.wolfram.com/FibnoteNumber.html
नील

1
यद्यपि कोड गोल्फ को अनुरोध का औचित्य साबित नहीं होता (मुझे लगता है), यह एक अजीब ऑपरेशन जैसा लगता है; यह के अनुसार, के बाद से F_0 = 0और F_2 = 1, हम होना चाहिए F_1 = (1/2)(F_0 + F_2) = 1/2
LSpice

जवाबों:


7

जेली , 5 बाइट्स

_Ḟ1+¡

यह बिल्ट-इन के बिना एक पुनरावृत्त समाधान है। यह चुनौती की कल्पना के रूप में एक ही अनुक्रमण का उपयोग करता है।

इसे ऑनलाइन आज़माएं!

पृष्ठभूमि

चलो समारोह चुनौती कल्पना और में परिभाषित किया जा एफ फाइबोनैचि समारोह सामान्य रूप में परिभाषित किया (यानी, के साथ एफ (0) = 0 )। एक गैर-नकारात्मक पूर्णांक n के लिए , हमारे पास f (n) = F (n + 1) है । जब 0 f x <1 , चुनौती युक्ति f (n + x) को f (n) + (f (n + 1) - f (n)) x के रूप में परिभाषित करती है ।

स्पष्ट रूप से, यह बस आधार के मामलों को प्रभावित करता है, लेकिन पुनरावर्ती सूत्र नहीं, अर्थात, f (n) = f (n - 1) + f (n - 2) को धारण करता है क्योंकि यह F के लिए होता है । इसका मतलब है कि हम गैर-पूर्णांक तर्कों के लिए परिभाषा को आसान f (n) = f (n) + f (n - 1) x के लिए सरल कर सकते हैं ।

जैसा कि अन्य लोगों ने अपने उत्तर में बताया है, पुनरावर्ती संबंध गैर-पूर्णांक तर्कों के लिए भी है। यह आसानी से सत्यापन योग्य है, जैसा कि

प्रमाण

चूँकि f (0) = f (1) = 1 , f लगातार अंतराल में [0, 1] और f (0 + x) = 1 सभी x के लिए । इसके अलावा, f (-1) = F (0) = 0 , इसलिए f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x । ये आधार मामले [-1, 1) में आते हैं , इसलिए पुनरावर्ती सूत्र के साथ मिलकर वे एफ की परिभाषा को पूरा करते हैं ।

यह काम किस प्रकार करता है

पहले की तरह, n + x हमारे विवादास्पद कार्यक्रम का एकमात्र तर्क है।

¡एक त्वरित है , जिसका अर्थ है कि यह अपनी बाईं ओर कुछ लिंक का उपभोग करता है और उन्हें एक क्विकलिंक में बदल देता है¡विशेष रूप से या तो एक या दो लिंक का उपभोग करता है।

  • <F:monad|dyad><N:any>लिंक N को कॉल करता है , r को लौटाता है , और F को कुल r बार निष्पादित करता है ।

  • <nilad|missing><F:monad|dyad>अंतिम कमांड-लाइन तर्क (या उनकी अनुपस्थिति में एसटीडीआईएन से एक इनपुट) पर आर सेट करता है और एफ को कुल आर बार निष्पादित करता है ।

चूंकि 1एक निलाद (तर्कों के बिना एक कड़ी) है, दूसरा मामला लागू होता है, और n बार निष्पादित होगा (एक गैर-पूर्णांक तर्क नीचे गोल है)। प्रत्येक कॉल करने के बाद+ + , क्विकलिंक के बाएं तर्क को रिटर्न वैल्यू के साथ बदल दिया जाता है, और राइट तर्क को लेफ्ट के पिछले मूल्य के साथ।

पूरे कार्यक्रम के लिए, इनपुट फ़्लोरिंग, एन उपज ; फिर _इनपुट से परिणाम घटाएं, ** x, जो रिटर्न वैल्यू बन जाता है।

1+¡फिर कॉल - जैसा कि पहले वर्णित है - बाएं तर्क 1 = एफ (0 + x) और दाएं तर्क x = एफ (-1 + x) के साथ , जो वांछित आउटपुट की गणना करता है।


आह, फाइबोनैचि चुनौतियों के लिए कितना उपयोगी है। क्या यह उद्देश्यपूर्ण था कि ¡डायरियों के साथ काम करना कैसा है?
आउटगॉल्फ

ओह - %1+¡: के बीच रैखिक प्रक्षेप n × F (n) पर n और n × F (n-1) + F (n) में एन-ε , और के बीच कदम एन-ε और एन
जोनाथन एलन

@EriktheOutgolfer खैर, कम या ज्यादा। चूंकि जेली के पास चर नहीं हैं, इसलिए आप पिछले अनुक्रम सदस्यों तक पहुंच खो देंगे अन्यथा, इसलिए इसे इस तरह से लागू करना समझ में आता है।
डेनिस

@JonathanAllan मुझे यकीन नहीं है कि मैं समझ गया हूँ। क्या करना %1+¡चाहिए?
डेनिस

@ डेनिस, मतलब , अच्छी तरह से \ _o_ / ... लेकिन यह प्रयोग के साथ क्या करने के लिए प्रतीत होता है: डी
जोनाथन एलन

5

गणितज्ञ, 32 बाइट्स

If[#<2,1~Max~#,#0[#-1]+#0[#-2]]&

शुद्ध फ़ंक्शन इनपुट के रूप में एक गैर-वास्तविक संख्या ले रहा है और एक वास्तविक संख्या वापस कर रहा है। यदि 1~Max~#इसे बदल दिया गया था 1, तो यह पूर्णांक तर्कों के लिए 0-अनुक्रमित फाइबोनैचि संख्याओं की मानक पुनरावर्ती परिभाषा होगी। लेकिन 1~Max~#0 और 2 के बीच वास्तविक आदानों के लिए सही टुकड़ावार रैखिक कार्य है, और पुनरावृत्ति बाकी की देखभाल करता है। (सामान्य ज्ञान): इसे 1-अनुक्रमित फाइबोनैचि संख्या में बदलने से केवल Maxए को बदलकर पूरा किया जा सकता हैMin !)

सबसे कम मैं बिलिन के साथ मिल सकता है 37 बाइट है (b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&



3

जावास्क्रिप्ट (ईएस 6), 30 बाइट्स

f=x=>x<1?1:x<2?x:f(x-1)+f(x-2)
<input type=number value=2.4 oninput="O.value=f(value)"> <input id=O value=2.4 disabled>

शून्य-अनुक्रमित पुनरावर्ती फाइबोनैचि अनुक्रम परिभाषा का तुच्छ संशोधन। कुछ इनपुट्स के लिए थोड़ी राउंडिंग एरर दे सकते हैं।


यह चतुर है। मैंने सोचा कि यह काम नहीं किया।
लीक नून

1

जेली , 17 12 बाइट्स

’Ñ+Ñ
’»0‘ÇỊ?

इसे ऑनलाइन आज़माएं!

गैर-निर्मित समाधान।

व्याख्या

हेल्पर फ़ंक्शन 1Ŀ

’Ñ+Ñ
 Ñ    Call the main program on
’       {the input} - 1;
   Ñ  Call the main program on {the input};
  +   Add those results{and return the result}

मुख्य कार्यक्रम

’»0‘ÇỊ?
’        Subtract 1
 »0      but replace negative results with 0
     Ị?  If the result is less than or equal to 1
   ‘     Return the result plus 1
    Ç    else return the result

0 से 1 की श्रेणी में इनपुट इसलिए संतृप्त-घटाकर 0 हो जाएगा, इस प्रकार हम F (0) = F (1) = 1 प्राप्त करने के लिए 1 जोड़ते हैं। 1 से 2 की सीमा में एक इनपुट स्वयं वापस आ जाएगा। वे आधार मामले एक विशिष्ट फाइबोनैचि पुनरावृत्ति करने के लिए पर्याप्त हैं और वहां से अन्य मूल्यों की गणना करते हैं।


1

एक्सेल, 137 124 119 113 102 97 बाइट्स

गैर-पुनरावर्ती / पुनरावृत्ति दृष्टिकोण। (सीधे nth शब्दों की गणना करें) यह एक-अनुक्रमित विधि का उपयोग करता है । जोड़ने +1के लिए =TRUNC(B1)अनुक्रमित शून्य करने के लिए बदल जाता है।

=A7+(A8-A7)*MOD(B1,1)
=5^.5
=(1+A2)/2
=TRUNC(B1)
=A4+1
=-1/A3
=(A3^A4-A6^A4)/A2
=(A3^A5-A6^A5)/A2

कोड स्निपेट को सेल A1 में शुरू करने का इरादा है ।

इनपुट सेल B1 है । आउटपुट सेल A1 है


1

जावास्क्रिप्ट (ईएस 6), 67 64 बाइट्स

गोलाई के साथ कुछ मुद्दे हैं

n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)

कोशिश करो

f=
n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)
console.log(f(2.4))
console.log(f(6.35))
console.log(f(42.42))



0

जेली , 13 9 बाइट्स

,‘ḞÆḞḅ%1$

यह चुनौती सूचकांक के रूप में एक ही अनुक्रमण का उपयोग करता है।

इसे ऑनलाइन आज़माएं!

पृष्ठभूमि

कल्पना के अनुसार, हमारे पास प्राकृतिक n और 0 <x <1 के लिए F (n + x) = F (n) + (F (n + 1) - F (n)) x है । चूंकि F (n + 1) = F (n) + F (n - 1) , इसे F (n + x) = F (n) + F (n - 1) x के रूप में फिर से लिखा जा सकता है ।

इसके अलावा, चुनौती युक्ति में प्रयुक्त अनुक्रमण एक फ़ंक्शन को परिभाषित करता है f (n) = F (n + 1) (जहां F सामान्य फ़ाइबोनैचि फ़ंक्शन है, अर्थात, F (0) = 0 ), इसलिए हमें सूत्र f (n ) मिलता है + x) = F (n + 1) + F (n) x

यह काम किस प्रकार करता है

,‘ḞÆḞḅ%1$  Main link. Argument: n + x

 ‘         Increment; yield n + 1 + x.
,          Pair; yield [n + x, n + 1 + x].
  Ḟ        Floor; yield [n, n + 1].
   ÆḞ      Fibonacci; yield [F(n), F(n + 1)].
      %1$  Modulus 1; yield (n + x) % 1 = x.
     ḅ     Unbase; yield F(n)x + F(n + 1).

0

पर्ल 6 ,  48  38 बाइट्स

48

{$/=(1,1,*+*...*)[$_,$_+1];$0+($_-.Int)*($1-$0)}

कोशिश करो

38

sub f(\n){3>n??max 1,n!!f(n-1)+f(n-2)}

कोशिश करो

विस्तारित:

48

{
  $/ =          # store here so we can use $0 and $1
  (
    1,1,*+*...* # Fibonacci sequence
  )[
    $_,         # get the value by using floor of the input
    $_ + 1      # and get the next value
  ];

    $0            # the first value from above
  +
    ( $_ - .Int ) # the fractional part of the input
  *
    ( $1 - $0 )   # the difference between the two values in the sequence
}

( $0और के $1लिए छोटा है $/[0]और$/[1] )

38

sub f (\n) {
    3 > n           # if n is below 3
  ??
    max 1, n        # return it if it is above 1, or return 1
                    # if it was below 1, the answer would be 1
                    # the result for numbers between 1 and 3
                    # would be the same as the input anyway
  !!
    f(n-1) + f(n-2) # the recursive way to get a fibonacci number
}

यह अन्य पायथन , और जावास्क्रिप्ट समाधानों से प्रेरित था


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.