मेरे फ़ाइबोनेक्वाइड डिवाइडर को सम!


14

प्रसिद्ध फिबोनाची अनुक्रम है F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)(इस चुनौती के लिए हम 0 से शुरुआत कर रहे हैं)।

आपका चुनौती: यह देखते हुए n , उत्पादन के सभी योग वीं सब divisors के लिए फाइबोनैचि संख्या d की n वें फिबोनैकी संख्या। यदि आप अधिक औपचारिक संकेतन पसंद करते हैं,

योग

इनपुट : एक सकारात्मक पूर्णांक एन

आउटपुट : राशि

उदाहरण के लिए, विचार करें n=4F(4) = 33 के विभाजक 1 और 3 हैं, इसलिए आउटपुट होना चाहिए F(1) + F(3) = 1 + 2 = 3

के लिए n=6, F(6) = 8और 8 के भाजक 1, 2, 4, 8 हैं, इसलिए आउटपुट है F(1) + F(2) + F(4) + F(8) = 1 + 1 + 3 + 21 = 26

परीक्षण के मामलों:

1 => 1
2 => 1
3 => 2
4 => 3
5 => 6
6 => 26

यह , बाइट्स जीत में सबसे छोटा जवाब। मानक खामियां लागू होती हैं।

जवाबों:


2

दरअसल , 5 बाइट्स

F÷♂FΣ

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

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

       (implicit) Read n from STDIN.
F      Compute F(n).
 ÷     Get F(n)'s divisors.
  ♂F   Map F over the divisors.
    Σ  Take the sum.

भाषा का नाम इसे निष्क्रिय आक्रामक बनाता है, क्या यह इरादा है?
रोहन झुनझुनवाला २

1
मुझे शक है। इस टिप्पणी के कारण भाषा के पहले संस्करण को गंभीरता से कहा गया था । दूसरे संस्करण के लिए, लेखक ने विशेषणों का उपयोग करना जारी रखा।
डेनिस

6

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

ÆḞÆDÆḞS

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

स्पष्टीकरण:

ÆḞÆDÆḞS Main link (Arguments: z)
ÆḞ      zth Fibonacci number's
  ÆD                           divisors'
    ÆḞ                                   Fibonacci numbers'
      S                                                     sum

बिलकुल अपमानजनक! मैं इनमें से किसी भी विदेशी भाषा को नहीं जानता, लेकिन यह मेरे लिए अलौकिक है कि आप कुछ वर्णों के साथ एक संपूर्ण एल्गोरिथ्म कैसे लिख सकते हैं।
बोगदान अलेक्जेंड्रू

@BogdanAlexandru आप देख सकते हैं कि यहां बनाए गए अधिकांश भवन प्रत्येक 2 बाइट का उपभोग करते हैं, क्योंकि वे 1 बाइट में फिट नहीं थे। देखें डेनिस के वास्तव में बहुत कम वर्णों के लिए जवाब। इसके अलावा, जेली एक "गोल्फिंग भाषा" है, जो विशेष रूप से कोड-गोल्फ के लिए बनाई गई भाषा है , और यह यहां सबसे कुशल लोगों में से एक है (हालांकि एक "सबसे कुशल" भाषा नहीं है)।
एगेलर आउटरीक

क्या आप कह रहे हैं कि इन भाषाओं का प्रयोग नहीं किया जाता है और वे केवल चुनौतियों के लिए होती हैं?
बोगदान अलेक्जेंड्रू


4

गणितज्ञ सरलीकृत , 14 बाइट्स

Fi@#~Div9`~Fi&

ओह ठीक है, यह @ मार्टिनएंडर के समाधान के समान है ...


ठीक है ... उसी भाषा के एक छोटे संस्करण का उपयोग करना ... मुझे लगता है कि काम करता है।
नील ए।

मैथेमेटिका में एक भी अक्षर फ़ंक्शन नाम नहीं हैं, है ना? क्या आप एक प्रमुख अपर केस लेटर और एक सिंगल बाइट से बनने वाले सभी दो कैरेक्टर स्ट्रिंग्स का मिलान नहीं कर सकते हैं? यदि ऐसा है तो आपके पास 26 * 256 = 6656 सरलीकृत 2-बाइट फ़ंक्शन नाम होंगे, 6356 11.1.1 नामों के लिए 300 अतिरिक्त छूट।
जोनाथन एलन

@JonathanAllan अच्छा विचार है। (लेकिन एकल नाम फ़ंक्शन हैं, जैसे N)
जंगहवान मिन


2

05AB1E , 11 बाइट्स

!ÅFDI<èÑ<èO

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

व्याख्या

!            # factorial of input
 ÅF          # get the list of fibonacci numbers (starting at 1)
             # smaller than or equal to this
   D         # duplicate list of fibonacci number
    I<è      # get the element at index (input-1)
       Ñ     # get the list of its divisors
        <    # decrement each
         è   # get the fibonacci numbers at those indices
          O  # sum


2

ऐलिस , 38 36 बाइट्स

2 बाइट बचाने के लिए लियो को धन्यवाद।

/ow;B1dt&w;31J
\i@/01dt,t&w.2,+k;d&+

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

लगभग निश्चित रूप से इष्टतम नहीं है। नियंत्रण प्रवाह काफी विस्तृत है और जब मैं पिछले संस्करणों में सहेजे गए कितने बाइट्स के साथ काफी खुश हूं, तो मुझे लगता है कि मैं उन चीजों को ओवरक्लॉक कर रहा हूं जो एक सरल और छोटा समाधान हो सकता है ।

व्याख्या

सबसे पहले, मुझे ऐलिस के रिटर्न एड्रेस स्टैक (आरएएस) पर थोड़ा विस्तार करने की आवश्यकता है। कई अन्य fungeoids की तरह, ऐलिस के पास कोड में चारों ओर कूदने की आज्ञा है। हालाँकि, इसमें यह भी आज्ञा है कि आप जहाँ से आए हैं, वहाँ लौटने में मदद करता है, जिससे आप सबरूटीन्स को बहुत आसानी से लागू कर सकते हैं। बेशक, यह एक 2 डी भाषा होने के नाते, सबरूटीन वास्तव में केवल सम्मेलन द्वारा मौजूद हैं। रिटर्न कमांड (या सबरूटीन में किसी भी बिंदु पर) के माध्यम से अन्य साधनों के माध्यम से एक सबरूटीन में प्रवेश करने या छोड़ने से आपको कोई रोक नहीं सकता है, और आप आरएएस का उपयोग कैसे करते हैं इसके आधार पर, वैसे भी एक साफ कूद / वापसी पदानुक्रम नहीं हो सकता है।

सामान्य तौर पर, यह कूदने jसे पहले आरएएस के लिए वर्तमान आईपी पते को जम्प कमांड के द्वारा कार्यान्वित किया जाता है । वापसी आदेश kतब RAS का एक पता पॉप करता है और वहां कूदता है। यदि RAS खाली है, kतो कुछ भी नहीं करता है।

आरएएस में हेरफेर करने के अन्य तरीके भी हैं। इस कार्यक्रम के लिए इनमें से दो प्रासंगिक हैं:

  • wआरएएस में कहीं भी कूदने के बिना वर्तमान आईपी पते को धक्का देता है । यदि आप इस आदेश को दोहराते हैं, तो आप सरल छोरों को बहुत आसानी से लिख सकते हैं &w...k, जो मैंने पिछले उत्तरों में पहले ही किया है।
  • Jकी तरह है, jलेकिन RAS पर वर्तमान IP पता याद नहीं है।

यह भी ध्यान रखना महत्वपूर्ण है कि आरएएस आईपी की दिशा के बारे में कोई जानकारी नहीं रखता है । इसलिए एक पते पर लौटने से kहमेशा वर्तमान आईपी ​​दिशा (और इसलिए भी कि क्या हम कार्डिनल या साधारण मोड में हैं) की रक्षा करेंगे, भले ही हम पहले से कैसे गुजरे jया wउस आईपी पते को धक्का दिया हो।

उस रास्ते के साथ, चलो उपर्युक्त कार्यक्रम में सबरूटीन को देखकर शुरू करें:

01dt,t&w.2,+k

यह सबरूटीन स्टैक के निचले तत्व को खींचता है, n , शीर्ष पर और फिर फाइबोनैचि संख्या F (n) और F (n + 1) की गणना करता है (उन्हें स्टैक के शीर्ष पर छोड़ता है)। हमें कभी भी एफ (एन + 1) की आवश्यकता नहीं होती है , लेकिन &w...kआरएएस के साथ बातचीत कैसे करते हैं (जो इन छोरों को एक सबरूटीन के अंत में होने की आवश्यकता है) के कारण यह सबरूटीन के बाहर छोड़ दिया जाएगा । हम शीर्ष के बजाय नीचे से तत्व ले रहे हैं इसका कारण यह है कि इससे हम स्टैक को एक कतार की तरह अधिक व्यवहार कर सकते हैं, जिसका अर्थ है कि हम सभी फाइबोनैचि संख्याओं की गणना एक ही बार में कर सकते हैं, उन्हें कहीं और स्टोर किए बिना।

यहां बताया गया है कि यह सबरूटीन कैसे काम करता है:

                                                          Stack
01    Push 0 and 1, to initialise Fibonacci sequence.     [n ... 0 1]
dt,   Pull bottom element n to top.                       [... 0 1 n]
t&w   Run this loop n times...                            [... F(i-2) F(i-1)]

  .     Duplicate F(i-1).                                 [... F(i-2) F(i-1) F(i-1)]
  2,    Pull up F(i-2).                                   [... F(i-1) F(i-1) F(i-2)]
  +     Add them together to get F(i).                    [... F(i-1) F(i)]

k     End of loop.

लूप का अंत थोड़ा मुश्किल है। जब तक स्टैक पर 'डब्ल्यू' पते की एक प्रति है, तब तक यह अगला चलना शुरू करता है। एक बार जब वे समाप्त हो जाते हैं, तो परिणाम इस बात पर निर्भर करता है कि सबरूटीन कैसे लागू किया गया था। यदि सबरूटिन को 'जे' के साथ बुलाया जाता है, तो अंतिम 'के' वहां लौटता है, इसलिए लूप एंड सबरूटीन की वापसी के रूप में दोगुना हो जाता है। यदि सबरूटीन को 'जे' के साथ बुलाया गया था, और स्टैक पर पहले से एक पता अभी भी है, तो हम वहां कूदते हैं। इसका मतलब है कि अगर सबरूटीन को बाहरी लूप में बुलाया जाता है, तो यह 'k' उस बाहरी लूप की शुरुआत में लौटता है । यदि सबरूटिन को 'J' के साथ बुलाया गया था, लेकिन RAS अभी खाली है, तो यह 'k' कुछ नहीं करता है और IP केवल लूप के बाद आगे बढ़ता रहता है। हम प्रोग्राम में इन तीनों मामलों का उपयोग करेंगे।

अंत में, कार्यक्रम पर ही।

/o....
\i@...

दशमलव पूर्णांकों को पढ़ने और मुद्रित करने के लिए ये साधारण रूप से साधारण यात्रा में केवल दो त्वरित हैं।

इसके बाद i, wदूसरा होने के कारण, जो सबरूटीन में जाने से पहले वर्तमान स्थिति को याद करता है /। यह सबरूटीन गणना F(n)और F(n+1)इनपुट पर पहला आह्वान है n। बाद में हम यहां वापस आ गए, लेकिन हम अब पूर्व की ओर बढ़ रहे हैं, इसलिए कार्डिनल मोड में कार्यक्रम के शेष ऑपरेटर। मुख्य कार्यक्रम इस तरह दिखता है:

;B1dt&w;31J;d&+
        ^^^

यहाँ, 31Jसबरूटीन को एक और कॉल है और इसलिए एक फाइबोनैचि संख्या की गणना करता है।

                                              Stack
                                              [F(n) F(n+1)]
;     Discard F(n+1).                         [F(n)]
B     Push all divisors of F(n).              [d_1 d_2 ... d_p]
1     Push 1. This value is arbitrary.        [d_1 d_2 ... d_p 1]
      The reason we need it is due to
      the fact that we don't want to run
      any code after our nested loops, so
      the upcoming outer loop over all
      divisors will *start* with ';' to
      discard F(d+1). But on the first
      iteration we haven't called the
      subroutine yet, so we need some 
      dummy value we can discard.
dt&w  Run this loop once for each element     [d_1 d_2 ... d_p 1]
      in the stack. Note that this is once    OR
      more than we have divisors. But since   [d_i d_(i+1) ... F(d_(i-1)) F(d_(i-1)+1)] 
      we're treating the stack as a queue,
      the last iteration will process the 
      first divisor for a second time. 
      Luckily, the first divisor is always 
      1 and F(1) = 1, so it doesn't matter 
      how often we process this one.

  ;     Discard the dummy value on the        [d_1 d_2 ... d_p]
        first iteration and F(d+1) of         OR
        the previous divisor on subsequent    [d_i d_(i+1) ... F(d_(i-1))]
        iterations.
  31J   Call the subroutine without pushing   [d_(i+1) ... F(d_i) F(d_i+1)]
        the current address on the RAS.
        Thereby, this doubles as our outer
        loop end. As long as there's an
        address left from the 'w', the end
        of the subroutine will jump there
        and start another iteration for the
        next divisor. Once that's done, the
        'k' at the end of the subroutine will
        simply do nothing and we'll continue
        after it.

;     Discard the final F(d_i+1).
d&+   Get the stack depth D and add the top   [final result]
      D+2 values. Of course that's two more
      than we have divisors, but the stack is
      implicitly padded with zeros, so that
      doesn't matter.

1

Axiom, 68 बाइट्स

g==>fibonacci;f(x:NNI):NNI==(x<3=>1;reduce(+,map(g,divisors(g(x)))))

कुछ परीक्षण

(46) -> [[i,f(i)] for i in [0,1,2,3,4,5,6,10,15] ]
   (46)
   [[0,1], [1,1], [2,1], [3,2], [4,3], [5,6], [6,26], [10,139583862540],
     [15,
      135823697912782666169062844948067355657769395021071830756126284114988028_
       12823029319917411196081011510136735503204397274473084444
     ]
   ]
                                       Type: List List NonNegativeInteger



1

आर, 77 बाइट्स

F=gmp::fibnum;N=F(scan());i=n=N-N;while(i<N)if(N%%(i=i+1)<1)n=n+F(i);print(n)

'Gmp' लाइब्रेरी का उपयोग करता है। इसमें बिलिन फाइबोनैचि फ़ंक्शन है और बड़ी संख्या में कार्य करने की क्षमता प्रदान करता है। इसने seqs और applys के साथ कुछ मुद्दों को जन्म दिया, हालाँकि यह अभी भी मेरे अपने फिबोनाची फ़ंक्शन को बनाने से छोटा है।

व्याख्या

F=gmp::fibnum;               # Set F as fibnum function
N=F(scan());                 # get input and set N to the fibonacci number of that index
i=n=N-N;                     # set i and n to 0 with data type bigz
while(i<N)                   # loop while i < N
   if(N%%(i=i+1)<1)          # if incremented i is divisor of N 
       n=n+F(i);             # add F(i) to rolling sum
print(n)                     # output final result

परीक्षा

> F=gmp::fibnum;N=F(scan());i=n=N-N;while(i<N)if(N%%(i=i+1)<1)n=n+F(i);print(n)
1: 6
2: 
Read 1 item
Big Integer ('bigz') :
[1] 26
> F=gmp::fibnum;N=F(scan());i=n=N-N;while(i<N)if(N%%(i=i+1)<1)n=n+F(i);print(n)
1: 10
2: 
Read 1 item
Big Integer ('bigz') :
[1] 139583862540
> F=gmp::fibnum;N=F(scan());i=n=N-N;while(i<N)if(N%%(i=i+1)<1)n=n+F(i);print(n)
1: 15
2: 
Read 1 item
Big Integer ('bigz') :
[1] 13582369791278266616906284494806735565776939502107183075612628411498802812823029319917411196081011510136735503204397274473084444

बिना जीएम का उपयोग किए

81 बाइट्स , रिकर्सिव फ़ंक्शन जो कि बड़ी (9+) संख्याओं को चुनने पर निराशाजनक रूप से धीमा होता है

F=function(n)`if`(n<2,n,F(n-1)+F(n-2));sum(sapply(which((N=F(scan()))%%1:N<1),F))

88 बाइट्स , बिनेट का फॉर्मूला जो बड़ी संख्या के साथ यथोचित काम करेगा, लेकिन फिर भी पूर्ण रूप से पूर्णांक सीमा को हिट करता है

F=function(n)round(((5+5^.5)/10)*((1+5^.5)/2)^(n-1));sum(F(which(F(N<-scan())%%1:N<1)))


0

सीजेएम , 26 बाइट्स

qi_[XY@{_2$+}*]_@\f%:!.*:+

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

मुझे यकीन है कि यह बेहतर किया जा सकता है। स्पष्टीकरण:

विचार यह है कि फाइबोनैचि संख्याओं का एक सरणी है और इसे 1s और 0s के साथ एक सरणी के साथ डॉट उत्पाद है यदि वह संख्या इनपुट का विभाजक नहीं है या नहीं है।

qi                                 Read the input (n)
   [XY        ]                    Array starting with [1,2,...]
  _   @{_2$+}*                     Append n times the sum of the previous two
               _                   Duplicate the array
                @\f%               Modulo each item with n (0 if divisor, a number otherwise)
                    :!             Logical NOT everything (1 if divisor, 0 otherwise) 
                      .*:+         Dot product those two arrays

0

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

f=(n,i=k=(F=n=>n>1?F(n-1)+F(n-2):n)(n))=>i&&(k%i?0:F(i))+f(n,i-1)

परीक्षण के मामलों


0

जावास्क्रिप्ट (ईएस 6), 105 104 103 101 97 बाइट्स

i=>[...Array((g=(n,x=0,y=1)=>n--?g(n,y,x+y):x)(i)+1)].map((_,y)=>s+=g((z=g(i)/y)%1?0:z|0),s=0)&&s

कोशिश करो

f=
i=>[...Array((g=(n,x=0,y=1)=>n--?g(n,y,x+y):x)(i)+1)].map((_,y)=>s+=g((z=g(i)/y)%1?0:z|0),s=0)&&s
o.innerText=f(j.value=4)
oninput=_=>o.innerText=f(+j.value)
<input id=j type=number><pre id=o>


मैं लगता है कि आप बदल सकते हैं (z=g(i)/y)>~~zकरने के लिए (z=g(i)/y)%1अगर आप सिर्फ जाँच कर रहे हैं कि, zएक पूर्णांक है।
ETHproductions

@ETHproductions, कि एक अतिप्रवाह कि बदलकर हल किया जा सकता बनाता g(z)करने के लिए g(z|0), लेकिन हमें एक ही बाइट गिनती के लिए बैकअप लेने के लिए लाता है।
झबरा



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