আমার Fibonaccified বিভাজক যোগফল!


14

বিখ্যাত ফিবোনাচি ক্রম হ'ল F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)(এই চ্যালেঞ্জের জন্য আমরা 0 দিয়ে শুরু করছি)।

তোমার চ্যালেঞ্জ: প্রদত্ত এন , আউটপুট সব সমষ্টি তম সব ভাজক জন্য ফিবানচি সংখ্যার এর এন ম ফিবানচি সংখ্যা। আপনি যদি আরও আনুষ্ঠানিক স্বরলিপি পছন্দ করেন,

যোগফল

ইনপুট : একটি ধনাত্মক পূর্ণসংখ্যা 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

একেবারে ক্ষোভ! আমি এই বহিরাগত ভাষাগুলির কোনওটিই জানি না, তবে আপনি কীভাবে কয়েকটি অক্ষর দিয়ে একটি সম্পূর্ণ অ্যালগরিদম লিখতে পারেন তা আমার কাছে অতিপ্রাকৃত মনে হয়।
বোগদান আলেকজান্দ্রু

@ বোগদান অ্যালেক্সান্দ্রু আপনি দেখতে পাবেন যে এখানে ব্যবহৃত বেশিরভাগ বিল্টইনগুলি 2 বাইট খায়, যেহেতু তারা 1 বাইটে ফিট করে না। আরও কম অক্ষরের জন্য ডেনিসের প্রকৃত উত্তর দেখুন। এছাড়াও, জেলি একটি "গল্ফিং ভাষা", কোড-গল্ফের জন্য বিশেষত তৈরি একটি ভাষা , এবং এটি এখানে সবচেয়ে দক্ষ ভাষাগুলির মধ্যে একটি (যদিও এখানে একটি "সবচেয়ে দক্ষ" ভাষা নেই)।
এরিক আউটগল্ফার

আপনি কি বলছেন যে এই ভাষাগুলি অনুশীলনে ব্যবহৃত হয় না এবং সেগুলি কেবল চ্যালেঞ্জের জন্যই?
বোগদান আলেকজান্দ্রু


4

গাণিতিক সরলীকৃত , 14 বাইট

Fi@#~Div9`~Fi&

ওহ ভাল, এটি শেষ হয়েছে @ মার্টিনইেন্ডারের সমাধানের মতো ...


ভাল ... একই ভাষার একটি সংক্ষিপ্ত সংস্করণ ব্যবহার করে ... আমার ধারণা এটি কার্যকর হয়।
নিল এ।

ম্যাথমেটিকায় কোনও একক অক্ষরের ফাংশনের নাম নেই, তাই না? শীর্ষস্থানীয় বড় অক্ষর এবং একটি একক বাইট থেকে গঠিত দুটি চরিত্রের স্ট্রিং আপনি কী মেলে না? যদি আপনার 26 + 256 = 6656 2-বাইট ফাংশন সরলিকৃত থাকে তবে 300 টি ছাড়াই 6356 11.1.1 নামের জন্য যথেষ্ট।
জোনাথন অ্যালান

@ জোনাথান অ্যালান ভাল ধারণা। (তবে একক নাম ফাংশন রয়েছে, যেমন N)
JungHwan Min




2

অ্যালিস , 38 36 বাইট

2 বাইট সংরক্ষণের জন্য লিওকে ধন্যবাদ

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

এটি অনলাইন চেষ্টা করুন!

প্রায় অবশ্যই অনুকূল নয়। নিয়ন্ত্রণ প্রবাহটি মোটামুটি বিস্তৃত এবং আমি পূর্ববর্তী সংস্করণগুলির তুলনায় যে কতগুলি বাইট সংরক্ষণ করেছি তা নিয়ে আমি বেশ খুশি, আমার এমন অনুভূতি রয়েছে যে আমি এমন কিছুগুলিকে জটিল করে তুলছি যা একটি সহজ এবং খাটো সমাধান হতে পারে ।

ব্যাখ্যা

প্রথমত, আমাকে অ্যালিসের ফেরত ঠিকানা স্ট্যাক (আরএএস) এর কিছুটা বিস্তৃত করতে হবে। অন্যান্য অনেক ছত্রাকজনিতের মতো অ্যালিসেরও কোডে চারপাশে লাফানোর একটি কমান্ড রয়েছে। তবে, আপনি যেখানে থেকে এসেছেন সেখানে ফিরে যাওয়ার কমান্ডও রয়েছে, যা আপনাকে সাব্রুটাইনগুলি বেশ সুবিধাজনকভাবে প্রয়োগ করতে দেয়। অবশ্যই, এটি একটি 2 ডি ভাষা হওয়ায় সাবরুটাইনগুলি কেবলমাত্র কনভেনশন দ্বারা বিদ্যমান। আপনাকে রিটার্ন কমান্ড (বা সাবরুটিনের যে কোনও মুহুর্তে) ছাড়া অন্য উপায়ে সাব্রুটিন প্রবেশ করা বা ছেড়ে দেওয়া থেকে বিরত কিছু নেই, এবং আপনি আরএএস কীভাবে ব্যবহার করেন তার উপর নির্ভর করে আর কোনওভাবেই পরিষ্কার জাম্প / রিটার্নের স্তরক্রম নাও থাকতে পারে।

সাধারণভাবে, লাফানোর আগে জাম্প কমান্ডটি jবর্তমান আইপি ঠিকানাটি আরএএসের দিকে ঠেলে দিয়ে প্রয়োগ করা হয়। রিটার্ন কমান্ডটি kতখন আরএএসের একটি ঠিকানা পপ করে এবং সেখানে লাফ দেয়। আরএএস ফাঁকা থাকলে, kকিছুতেই না করে।

আরএএসকে চালিত করার অন্যান্য উপায়ও রয়েছে। এর মধ্যে দুটি এই প্রোগ্রামের জন্য প্রাসঙ্গিক:

  • wআর কোথাও না লাফিয়ে বর্তমান আইপি ঠিকানাটি আরএএসের দিকে ঠেলে দেয় । আপনি যদি এই আদেশটি পুনরাবৃত্তি করেন তবে আপনি সহজ লুপগুলি সহজেই সুবিধার্থে লিখতে পারেন &w...kযা আমি ইতিমধ্যে পূর্ববর্তী উত্তরে করেছি done
  • Jএর মতো jতবে আরএএস-এর বর্তমান আইপি ঠিকানাটি মনে নেই

এটিও গুরুত্বপূর্ণ যে, আরএএস আইপিটির দিকনির্দেশ সম্পর্কে কোনও তথ্য সংরক্ষণ করে না । সুতরাং কোনও ঠিকানায় ফিরে আসা kসর্বদা বর্তমান আইপি দিকটি (এবং তাই আমরা কার্ডিনাল বা অর্ডিনাল মোডে থাকুক না কেন) সংরক্ষণ করব এবং নির্বিশেষে আমরা কীভাবে পাস করেছি jবা wযে আইপি ঠিকানাটিকে প্রথম স্থানে ফেলেছে তা নির্বিশেষে ।

সেই উপায়টির সাথে, আসুন উপরের প্রোগ্রামটির সাবরোটাইনটি অনুসন্ধান করে শুরু করা যাক:

01dt,t&w.2,+k

এই সাবরুটাইন স্ট্যাকের নীচের উপাদানটিকে টানিয়ে দেয়, এন এবং তারপরে ফিবোনাচি সংখ্যা 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.

লুপটির শেষটি কিছুটা জটিল। স্ট্যাকের 'ডাব্লু' ঠিকানার একটি অনুলিপি থাকে না কেন, এটি পরবর্তী পুনরাবৃত্তি শুরু করে। এগুলি হ্রাস হয়ে গেলে, ফলাফল কীভাবে সাবরোটাইন ডাকা হয়েছিল তার উপর নির্ভর করে। যদি সাবরুটিনকে 'জে' দিয়ে ডাকা হয়, সর্বশেষ 'কে' সেখানে ফিরে আসে, সুতরাং লুপ শেষটি সাব্রোটিনের প্রত্যাবর্তনের হিসাবে দ্বিগুণ হয়। যদি সাবরুটিনকে 'জে' দিয়ে ডাকা হত, এবং স্ট্যাকের পূর্ব থেকে কোনও ঠিকানা এখনও রয়েছে, আমরা সেখানে লাফিয়ে যাব। এর অর্থ যদি সাব্রোটিনকে একটি বাহ্যিক লুপে নিজেই ডাকা হত, এই 'কে' তার শুরুতে ফিরে আসে বাহ্যিক লুপের । যদি সাব্রোটিনকে 'জে' দিয়ে ডাকা হত তবে আরএএস এখন খালি থাকে, তবে এই 'কে' কিছুই করে না এবং আইপি কেবল লুপের পরে চলতে থাকে। আমরা প্রোগ্রামটিতে এই তিনটি কেসই ব্যবহার করব।

পরিশেষে, প্রোগ্রাম নিজেই।

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

দশমিক পূর্ণসংখ্যা পড়তে এবং মুদ্রণের জন্য এগুলি কেবল দুটি দ্রুত ভ্রমণ Ord

এর পরে 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

অ্যাক্সিয়াম, 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)

'জিএমপি' লাইব্রেরিটি ব্যবহার করে। এটিতে বিল্টিন ফিবোনাচি ফাংশন রয়েছে এবং এটি প্রচুর পরিমাণে করার ক্ষমতা সরবরাহ করে। এটি সেকস এবং প্রয়োগগুলির সাথে কয়েকটি সমস্যা সৃষ্টি করেছে, যদিও এটি আমার নিজের ফিবোনাচি ফাংশন তৈরির চেয়ে এখনও ছোট।

ব্যাখ্যা

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))

৮৮ বাইট , বিনেটের সূত্রটি বৃহত্তর সংখ্যার সাথে যুক্তিসঙ্গতভাবে ভালভাবে কাজ করবে তবে এখনও পূর্ণসংখ্যার সীমাটি বেশ দ্রুত হিট করে

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 এবং 0 এর সাথে একটি অ্যারের সাথে এটি বিন্দুর সাথে তৈরি করে।

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

জাভাস্ক্রিপ্ট (ES6), 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

জাভাস্ক্রিপ্ট (ES6), 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এটি একটি পূর্ণসংখ্যা।
ETH প্রোডাকশনগুলি

@ ইথ প্রডাকশনস, এটি একটি ওভারফ্লো তৈরি করে যা পরিবর্তিত g(z)হয়ে সমাধান করা যেতে পারে g(z|0)তবে একই বাইট গণনাতে আমাদের ফিরিয়ে আনে।
শেগি



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.