ফিবোনাচি অরবিট গণনা করা হচ্ছে


13

যদি আমরা কোনও ফিজোনাকির মতো অনুক্রমকে f k (n) = (f k (n-1) + f k (n-2))% k হিসাবে সংজ্ঞায়িত করি , যেখানে কিছু সংখ্যক কে (যেখানে % হল মডুলো অপারেটর), অনুক্রম অগত্যা চক্রযুক্ত হবে, কারণ এখানে কেবলমাত্র কে 2 বিভিন্ন মান রয়েছে (এফ কে (এন -1), এফ কে (এন -2)) । তবে এই চক্রটি সাধারণত সমস্ত সম্ভাব্য জোড় মানকে অন্তর্ভুক্ত করে না , সুতরাং দুটি প্রারম্ভিক মান f কে (0) এবং f কে (1) এর উপর নির্ভর করে আমরা বিভিন্ন চক্র পেতে পারি। উদাহরণস্বরূপ, কে = 2 এর জন্য, প্রথম দুটি মানের উপর নির্ভর করে আমাদের নিম্নলিখিত চারটি সম্ভাবনা রয়েছে:

0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 0, 1, 1, 0, 1, 1, ...
1, 0, 1, 1, 0, 1, 1, 0, 1, ...
1, 1, 0, 1, 1, 0, 1, 1, 0, ...

সিকোয়েন্সগুলির চক্রবৃত্ত প্রকৃতির কারণে এখানে কক্ষপথ (0) এবং (0, 1, 1) সহ দুটি মাত্র মৌলিকভাবে পৃথক সিকোয়েন্স রয়েছে । আসুন কে = 3 এ দেখুন :

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, ...
1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, ...
1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, ...
1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, ...
2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, ...
2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, ...
2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, ...

আবার, কেবল দুটি পৃথক কক্ষপথ রয়েছে: (0) এবং (0, 1, 1, 2, 0, 2, 2, 1)

উচ্চতর কে এর জন্য আমরা আরও কক্ষপথ পেতে পারি তবে তারা এখনও তুলনামূলকভাবে অল্প সংখ্যক শ্রেণিতে পড়বে। উদাহরণস্বরূপ কে = 4 চারটি কক্ষপথ (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) এবং কে = 5 তিনটি কক্ষপথ (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 4, 1) এবং (1, 3, 4, 2)

এই চ্যালেঞ্জটিতে আপনার কাজটি কোনও প্রদত্ত কে এর জন্য সিক্যুয়েন্সটি কত কক্ষপথ তৈরি করে তা গণনা করা । এটি OEIS A015134 । এখানে প্রথম 100 টি মান রয়েছে ( কে = 1 থেকে শুরু ):

1, 2, 2, 4, 3, 4, 4, 8, 5, 6, 14, 10, 7, 8, 12, 16, 9, 16, 22, 16,
29, 28, 12, 30, 13, 14, 14, 22, 63, 24, 34, 32, 39, 34, 30, 58, 19,
86, 32, 52, 43, 58, 22, 78, 39, 46, 70, 102, 25, 26, 42, 40, 27, 52,
160, 74, 63, 126, 62, 70, 63, 134, 104, 64, 57, 78, 34, 132, 101, 60,
74, 222, 37, 38, 62, 328, 89, 64, 82, 124, 41, 86, 42, 172, 75, 44,
184, 178, 181, 132, 82, 180, 99, 140, 104, 246, 49, 50, 114, 76

কে = 11 যাচাই করা নিশ্চিত করুন , এটি প্রথম ইনপুট যা কে কক্ষপথের চেয়ে বেশি ফলন দেয় ।

বিধি

আপনাকে একটি ইতিবাচক পূর্ণসংখ্যা কে দেওয়া হয়েছে এবং এটি A015134 (কে) আউটপুট করা উচিত ।

আপনি কোনও প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং ইনপুট গ্রহণ এবং আউটপুট সরবরাহের মানক পদ্ধতির কোনও ব্যবহার করতে পারেন ।

আপনি যে কোনও প্রোগ্রামিং ভাষা ব্যবহার করতে পারেন তবে নোট করুন যে এই ফাঁকগুলি ডিফল্টরূপে নিষিদ্ধ করা হয়েছে।

এটি , তাই সংক্ষিপ্ততম বৈধ উত্তর - বাইটগুলিতে মাপা - জয় w


3
এটি কোডগল্ফ.স্ট্যাকেক্সেঞ্জারএইচএইচ / 26578/194 এর যথেষ্ট কাছে যে আমি এটি একতরফাভাবে বন্ধ করব না তবে আমি 5 তম ভোটটি ডুপ হিসাবে বন্ধ করব।
পিটার টেলর

উত্তর:


3

হুশ , 17 16 বাইট

Lüȯ€U¡ȯ↔m%⁰∫π2ŀ⁰

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

ব্যাখ্যা

Lüȯ€U¡ȯ↔m%⁰∫π2ŀ⁰  Implicit input, say n=4.
              ŀ⁰  Lowered range: [0,1,2,3]
            π2    Cartesian second power: [[0,0],[0,1],[1,0],[0,2]..
 üȯ                Deduplicate with respect to this function:
   €U¡ȯ↔m%⁰∫       Arguments are two pairs, say a=[0,2], b=[1,1]
     ¡ȯ            Iterate on a:
           ∫       Cumulative sum,
        m%⁰        take modulo n of each,
       ↔           then reverse: [[0,2],[2,0],[2,2],[0,2],[2,0]..
    U              Cut at first repeated element: [[0,2],[2,0],[2,2]]
   €               Is b in this list? No, so they are distinct in ü.
L                 Number of remaining pairs.


1

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 76 70 বাইট

Tr[EdgeCycleMatrix[#->{#[[2]],Tr@#~Mod~n}&/@Tuples[Range[n=#]-1,2]]!]&

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

কিভাবে এটা কাজ করে

আমরা নিয়মাবলী দ্বারা প্রদত্ত গ্রাফটি তৈরি করি যা {{0,0}->{0,0}, {1,0}->{1,1}, ...}একটি সাধারণীকরণকৃত ফিবোনাচি অনুক্রমের দুটি উপাদান দেওয়া হয়, পরবর্তী একটি মডিউলটি সন্ধান করে nEdgeCycleMatrixএই গ্রাফে প্রান্ত চক্র থেকে ঘটনা ম্যাট্রিক্স দেয়; আমরা এর সারিগুলি গণনা করতে চাই।

(এখানে অনেকগুলি বিল্ট-ইন রয়েছে যা একই ধরণের কাজ করে তবে ConnectedComponentsএটি দীর্ঘ FindCycleহয় এবং এটি কাজ করতে আরও অনেক অতিরিক্ত ইনপুট প্রয়োজন Besides এছাড়াও, EdgeCycleMatrixএটি একটি আয়তক্ষেত্রাকার অ্যারে, অন্যান্য দুটি মত মজাদার আকারের নয় যা পরে সাহায্য করে। )

ম্যাট্রিক্সের সারিগুলি গণনা করার জন্য, আমরা এন্ট্রিগুলির ফ্যাক্টরিয়ালটি এটিকে সকলের ম্যাট্রিক্সে পরিণত করতে, তারপরে ট্রেসটি গ্রহণ করি। (প্রতিটি চক্রের কমপক্ষে একটি প্রান্ত থাকে এবং সুতরাং সারি হিসাবে কমপক্ষে কম বেশি কলাম রয়েছে - সুতরাং এটি সারিগুলি গণনা করে কলামগুলি নয়))


1

এমএটিএল , 38 36 বাইট

:qt!J*+le"@GU:"t&Zjwy+G\J*+hu]S]Xhun

এটি অনলাইন চেষ্টা করুন! অনলাইন সংকলকটি ইনপুট অতিক্রম করার জন্য এটি বার হয়ে যায়7

ব্যাখ্যা

কোডটি জটিল সংখ্যার ক্ষেত্রে কক্ষপথকে সংজ্ঞায়িত করে, যেখানে কাল্পনিক অংশটি নতুন শব্দ এবং আসল অংশটি ফিবোনাচি অনুক্রমের পূর্ববর্তী শব্দ । প্রতিটি জটিল মান অনুক্রমের রাজ্যে এনকোড করে । যথা, a+jbপরবর্তী মান হিসাবে গণনা করা হয় b+j(a+b)

সম্ভব শুরুর মান a+jbসঙ্গে a, bমধ্যে [0, 1, ..., k-1]। প্রতিটি শুরুর মানের জন্য, কোডটি k^2বারবার পুনরাবৃত্তি করে । প্রকৃতপক্ষে, কোডটি ছোট করার জন্য, প্রতিটি পুনরাবৃত্তি এতক্ষণের সমস্ত জমা হওয়া মানগুলিতে প্রয়োগ করা হয় , এবং ফলাফলগুলি অনুলিপি করা হয় (যা যাইহোক শেষে প্রয়োজনীয় হবে)। শেষ পুনরাবৃত্তির পরে, সদৃশ জটিল মানগুলির ভেক্টর বাছাই করা হয় (পরম মানের দ্বারা, তারপরে কোণ দ্বারা)। এটি প্রতিটি কক্ষপথের জন্য একটি "স্বাক্ষর" দেয়।

প্রোগ্রামের শেষে, স্বাক্ষরগুলি একটি সেল অ্যারেতে সংগ্রহ করা হয়। অনন্য স্বাক্ষরের সংখ্যা হ'ল কাঙ্ক্ষিত আউটপুট।

:q          % Implicit input: k. Push row vector [0, 1, ..., k-1]
t!          % Duplicate, transpose: gives column vector [0; 1; ...; k-1]
J*+         % Multiply by 1j, add with broadcast. Gives a k × k matrix of
            % values a+jb with a, b in [0, 1, ..., k-1]
le          % Linearize into a row vector
"           % For each c in that vector
  @         %   Push c
  GU:"      %   Do the following k^2 times
    t&Zj    %     Duplicate and split into real and imaginary parts: a, b
    wy+     %     Swap, duplicate, from below, add: transforms a, b into
            %     b, a+b. This is the basic step in the Fibonacci sequence
            %     In subsequent iterations a and b may be vectors instead
            %     of numbers, as they include all values obtained so far
    G\      %     Modulo k, element-wise
    J*+     %     Times 1j, add. Gives the next complex number for each of
            %     the complex numbers so far
    hu      %     Append to values so far and deduplicate. This may extend
            %     the vector of complex numbers
  ]         %   End
  S         %   Sort
]           % End
Xh          % Collect entire stack into a cell array
u           % Deduplicate
n           % Number of entries. Implicit display

1

হাস্কেল , 196 191 বাইট

import Data.List
o(a:b)=1+o[x|x<-b,not$(0<$a)==(0<$x)&&isInfixOf a(x++x)]
o _=0
k#(a,b)=(b,mod(a+b)k)
p!(a:b)|elem a p=fst<$>p|r<-p++[a]=r!b
f k=o[[]!iterate(k#)(a,b)|a<-[0..k-1],b<-[0..k-1]]

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

এটি সম্ভবত উন্নত করা যেতে পারে। বিশেষত যদি কেউ isInfixOfআমদানি এড়াতে এবং সরানোর কোনও উপায় খুঁজে পায় ।

প্রাথমিক ধারণাটি কখন "চক্র" শুরু হয় তা দেখতে "স্টেটস" (দুটি পূর্ববর্তী মানের দুটি টিপলস) একটি তালিকা তৈরি করা। তারপরে আমরা যাচাই করি যে প্রতিটি কক্ষপথ তার পূর্বসূরীদের থেকে আলাদা কিনা (সত্যই অন্যভাবে কাজ করে তবে কথায় কথায় বলা শক্ত)। কক্ষপথ একই হয় কিনা তা পরীক্ষা করতে আমরা পরীক্ষা করে দেখি যে দৈর্ঘ্য একই কিনা এবং একটি নিজেই অন্যের সাথে খাঁটি হয়ে যায় কিনা। উদাহরণ হিসেবে বলা যায় [0,2,2], [2,2,0]: উভয়ের দৈর্ঘ্য 3 এবং [0,2,2,0,2,2]ধারণ করে[2,2,0] একটি ক্রমাগত subsequence হিসাবে। আমি এটি নির্বোধ কিনা তা নিশ্চিত নই তবে এটি কার্যকর বলে মনে হচ্ছে।

সম্পাদনা: লাইকোনি 5 বাইট নেওয়ার জন্য ধন্যবাদ! আমি এই টিপস আরও পড়া উচিত ছিল।


1
দেখে মনে হচ্ছে আপনি এড়াতে এই টিপটি ব্যবহার করতে পারেন length। আরেকটি বাইটে সংরক্ষণ করা যাবে !সঙ্গে |r<-p++[a]=r!b
লাইকনি

0

জাভাস্ক্রিপ্ট (ES6), 337 335 বাইট

Ω (কে ^ 3) ব্রুট-ফোর্স অ্যালগরিদমের জন্য দুঃখিত।

(k,x=o=0,u=[],s=(q,w,v,j=d=0)=>{while(j++<v)d|=q.reduce((a,b,i)=>a&=b==w[(i+j)%v],1);return d})=>{for(;x<k;x++)for(y=0;y<k;y++){l=2;r=[x,y];do{r.push((c=(d=r[(l+=2)-3])+r[l-4])%k,(c+d)%k)}while(!(t=r.slice(0,h=l/2)).reduce((a,b,i)=>a&=b==r[i+h],1));if(!u.reduce((q,z)=>q|=(t.length-(a=z.length)?0:s(t,z,a)),0)){o++;u.push(t)}}return o}

পারফরম্যান্স ... যখন আমি A015134 গণনা করছিলাম (কে = 50 এর বাইরে কিছু) এটি টিআইও-তে 60 এর সীমা অতিক্রম করেছে।

var g=(k,x=o=0,u=[],s=(q,w,v,j=d=0)=>{while(j++<v)d|=q.reduce((a,b,i)=>a&=b==w[(i+j)%v],1);return d})=>{for(;x<k;x++)for(y=0;y<k;y++){l=2;r=[x,y];do{r.push((c=(d=r[(l+=2)-3])+r[l-4])%k,(c+d)%k)}while(!(t=r.slice(0,h=l/2)).reduce((a,b,i)=>a&=b==r[i+h],1));if(!u.reduce((q,z)=>q|=(t.length-(a=z.length)?0:s(t,z,a)),0)){o++;u.push(t)}}return o}

for (var ix = 1; ix <= 15; ix++)
 console.log(`A015134(${ix}) = ${g(ix)}`);

ব্যাখ্যা (Ungolfed)

function CheckIfSameOrbit(Array_1, Array_2, Length) { // Checks if the orbits are equal
  var d = false, j = 0;                               // Assume both have same length
  while (j < v) {                                     // Checks for different startings
    j++;                                                
    d |= Array_1.reduce(function(Acc, Item, Index) {  // Element-by-element comparison
      Acc &= Item == w[(Index + j) % v], 1);                     
    });                                               // Return true if any starting
  }                                                   // point makes two orbits identical
}

function A015134(k) {                                 // Main Program
  var o = 0, u = [];                                    
  for (var x = 0; x < k; x++) {                       // Checks different pairs of (x, y)
    for (var y = 0; y < k; y++) {
      var l = 2, r = [x, y], h = 1, t;
      do {                                            // Find until a complete orbit is
        l += 2;                                       // found (except for (0, 0) case)
        h = l / 2;
        var d = r[l - 3], c = r[l - 3] + r[l - 4];
        r.push(c % k, (c + d) % k);
        t = r.slice(0, h);
      }                                                 
      while (!t.reduce(function(Acc, Item, Index) {   // Which is, if 2 identical copies
        Acc &= Item == r[Index + h];                  // of the orbit are calculated
      }, 1));

      if (!u.reduce(function(Acc, Item) {             // If the orbit is a new one
        var a = Item.length;
        Acc |= (t.length - a ? 0 : s(t, Item, a));
      }, 0)) {
        o++;                                          // Increment the counter, and
        u.push(t);                                    // record it to the list
      }
    }
  }
  return o;                                           // Ultimately return the counter;
}



0

জাভাস্ক্রিপ্ট (ES6), 102 বাইট

k=>F=(a=0,b=0,C=0,q)=>q?F[q=[a,b%=k]]?0:1|F(b,a+b,C,F[q]=1):b<k?F(a,b+1,C+F(a,b,C,1)):++a<k?F(a,0,C):C

একটি ফাংশন দেয় যা ফলাফল দেয় returns আরও 3 বাইটের জন্য আমরা এটি সরাসরি ফলাফলটি ফিরিয়ে আনতে পারি:

k=>(F=(a,b,C,q)=>q?F[q=[a,b%=k]]?0:1|F(b,a+b,C,F[q]=1):b<k?F(a,b+1,C+F(a,b,C,1)):++a<k?F(a,0,C):C)(0,0,0)

উভয়ের সময় জটিলতা রয়েছে ও (এন 2 )।


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