ফিবোনাচি প্যাটার্নগুলি সন্ধান করুন


16

আপনি সম্ভবত ফিবোনাচি অনুক্রমের সাথে পরিচিত যেখানে প্রথম দুটি পদ 0, 1(বা কখনও কখনও 1, 1) এবং তার পরে প্রতিটি শব্দই পূর্ববর্তী দুটিটির যোগফল। এটি এভাবে শুরু হয়:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

কখনও কখনও, অনুক্রমের এমন একটি সংখ্যা থাকে যা একটি নির্দিষ্ট প্যাটার্নযুক্ত থাকে যা আমি আকর্ষণীয় বলে মনে করি: সংলগ্ন অঙ্কগুলির যে কোনও জোড়াের মধ্যে পার্থক্য অন্য কোনও জোড়ার মতো। উদাহরণস্বরূপ, অনুক্রমের সাথে শুরু করে 0, 1, 18 তম শব্দটি 9879-8=1এবং 8-7=1। আমি হালকা সন্তুষ্ট।

চ্যালেঞ্জ

দুটি প্রাথমিক মান দেওয়া হয়েছে F(0)এবং F(1), প্রতিটি মানটিকে F(n) = F(n-1) + F(n-2)নিম্নলিখিত ক্রিয়াকলাপ অনুসারে উত্পন্ন অনুক্রমের আউটপুট দেয় :

  • সংলগ্ন অঙ্কগুলির যেকোন জুটির মধ্যে পার্থক্য অন্য কোনও জোড়ার মতো
  • এটি কমপক্ষে তিন অঙ্কের দীর্ঘ (1 এবং 2 সংখ্যার সংখ্যা এই ধরণের জন্য আকর্ষণীয় নয়)

ইনপুট

  • 10 ** 10 (10 বিলিয়ন) এর চেয়ে কম দুটি অ-নেতিবাচক পূর্ণসংখ্যা

আউটপুট

  • সমস্ত পূর্ণসংখ্যা যা 10 ** 10 এর চেয়ে কম এবং চ্যালেঞ্জ বিভাগের মানদণ্ডগুলি পূরণ করে
  • এটি 10 ​​** 10 এর চেয়ে বড় অঙ্কগুলিতে গ্রহণযোগ্য তবে এটি কোনও প্রয়োজন নয়
  • পুনরাবৃত্ত অঙ্কগুলি প্যাটার্নটি পূরণ করে এমনটি দেওয়া (উদাহরণস্বরূপ 777), এটি সম্ভব যে এমন অনেকগুলি সংখ্যা রয়েছে যা মানদণ্ডগুলি পূরণ করে তবে আপনার প্রোগ্রামকে চিরতরে আউটপুট দেওয়ার প্রয়োজন হয় না program
  • যদি এরকম কোনও পূর্ণসংখ্যার অস্তিত্ব না থাকে তবে আপনি এত দিন যা চান তা আউটপুট করুন এটি কোনও সংখ্যা নয় (কিছুই নয়, নাল, খালি অ্যারে, ত্রুটির বার্তা, দু: খিত মুখ ইত্যাদি)
  • প্যাটার্নের সাথে মিলে যাওয়া একটি নম্বর যদি ক্রমানুসারে একাধিকবার উপস্থিত হয়, আপনি একবারে বা একবারে যতবার এটি আউটপুট করতে পারেন
  • যদি কোনও ইনপুট মানদণ্ড পূরণ করে তবে এটি আউটপুটে অন্তর্ভুক্ত করা উচিত

বিধি

উদাহরণ / পরীক্ষার কেস

Input , Output   
[1,10] , []   

[0,1] , [987]   
[2,1] , [123]   
[2,3] , [987]   

[61,86] , [147]   
[75,90] , [420]   
[34,74] , [1234]   
[59,81] , [2468]   
[84,85] , [7531]   

[19,46] , [111]   
[60,81] , [222]   
[41,42] , [333]   
[13,81] , [444]   
[31,50] , [555]   
[15,42] , [666]   
[94,99] , [777]   
[72,66] , [888]  
[3189,826] , [888888888]    

[15,3] , [159,258]   
[22,51] , [321,1357]   
[74,85] , [159,4444]   
[27,31] , [147,11111]   

[123,0] , [123,123,123,246,369]   
[111,0] , [111,111,111,222,333,555,888]
[111,222] , [111,222,333,555,888]      

[33345,692] , [987654321]   
[3894621507,5981921703] , [9876543210]
[765432099,111111111] , [111111111,876543210,987654321]   

[1976,123] , [123, 2222, 4321, 6543, 45678]   

1
প্রস্তাবিত পরীক্ষার বিষয়: [1976, 123] -> [123, 2222, 4321, 6543, 45678],[3189, 826] -> [888888888] ,[33345, 692] -> [987654321]
Arnauld

@ আরনাউল্ড গ্রেট সন্ধান করুন! আমি ভাবছি যে কোন প্রারম্ভিক জুটির সর্বাধিক আউটপুট মান 10 বি এর চেয়ে কম রয়েছে। উপরের যে কোনও কিছুই পুনরায় ডিজিট হবে এবং এটি বিরক্তিকর।
ইঞ্জিনিয়ার টোস্ট

@ আরনাউল্ড পরীক্ষার কেস সংশোধনের জন্য ধন্যবাদ আমার আসল জেনারেটরে, আমি ইনপুটগুলি অন্তর্ভুক্ত করিনি। আমি ফিরে গিয়ে তাদের যুক্ত করার সময় আমি দু'জনকে স্পষ্টভাবে মিস করেছি।
ইঞ্জিনিয়ার টোস্ট

উত্তর:


9

এমএটিএল , 14 বাইট

একটি ভুল নির্দেশ করার জন্য এমিগিনার ধন্যবাদ, এখন সংশোধন করা হয়েছে

`yVdd~?yD]wy+T

অসীম লুপ যা সংখ্যাগুলি খুঁজে পাওয়ার সাথে সাথে আউটপুট করে।

এটি অনলাইন চেষ্টা করুন! নোট করুন যে অনলাইন দোভাষীতে ফলাফল 1 মিনিটের সময়সীমা পরে প্রদর্শিত হয়।

ব্যাখ্যা

ফিবোনাচি সিক্যুয়েন্সের টানা দুটি জেনেরিক পদটি চলুন F(n)এবং F(n+1)চিহ্নিত করুন। লুপের প্রতিটি পুনরাবৃত্তি স্ট্যাকযুক্ত স্ট্যাক দিয়ে শুরু হয়F(n) , F(n+1)কিছু জন্য n

`         % Do...while
  y       %   Duplicate from below. Takes the two inputs F(0), F(1) (implicitly)
          %   in the first iteration
          %   STACK: F(n), F(n+1), F(n)
  V       %   Convert to string. Let the digits of F(n) be '3579' for example
          %   STACK: F(n), F(n+1), '3579'
  d       %   Consecutive differences (of ASCII codes)
          %   STACK: F(n), F(n+1), [2 2 2]
  d       %   Consecutive differences
          %   STACK: F(n), F(n+1),  [0 0]
  ~       %   Logical negate, element-wise
          %   STACK: F(n), F(n+1), [1 1]
  ?       %   If top of the stack is non-empty and only contains non-zero entries
          %   (this is the case for digits '3579', but not for '3578' or '33')
          %   STACK: F(n), F(n+1)
    y     %     Duplicate from below
          %     STACK: F(n), F(n+1), F(n)
    D     %     Display immediately. This prints the copy of F(n)
          %     STACK: F(n), F(n+1)
  ]       %   End
  w       %   Swap
          %   STACK: F(n+1), F(n)
  y       %   Duplicate from below
          %   STACK: F(n+1), F(n), F(n+1)
  +       %   Add. Note that F(n)+F(n+1) is F(n+2) 
          %   STACK: F(n+1), F(n+2)
  T       %   Push true. This will be used as loop condition
          %   STACK: F(n+1), F(n+2), true
          % End (implicit). The top of the stack is consumed as loop condition.
          % Since it is true, a new iteration will begin, with the stack
          % containing F(n+1), F(n+2)


5

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

f=(p,q,a=[])=>p|q?f(q,p+q,![...p+''].some(x=d=n=>r=d-(d=x-(x=n)))/r?[...a,p]:a):a

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

সংলগ্ন অঙ্কগুলি পরীক্ষা করা

![...p + ''].some(x = d = n => r = d - (d = x - (x = n))) / r

এক্স এবং ডি উভয়ই একটি বেনাম ফাংশনে সূচনা করা হয়েছিল, যা NaNতারা জড়িত সমস্ত গাণিতিক ক্রিয়াকলাপের জন্য বাধ্য করে। some()সর্বদা প্রথম পুনরাবৃত্তি সর্বদা দেয় (d = [function] - n) === NaNএবং (r = [function] - d) === NaN(মিথ্যা)। দ্বিতীয় পুনরাবৃত্তিতে, আমাদের d = x - n(একটি পূর্ণসংখ্যা) এবং (r = NaN - d) === NaN(আবার মিথ্যা) রয়েছে। তৃতীয় পুনরাবৃত্তি থেকে শুরু করে, r একটি পূর্ণসংখ্যায় সেট করা হয়েছে যা অঙ্ক # 3 এবং অঙ্ক # 2 এর মধ্যে পার্থক্য সংখ্যা # 2 এবং অঙ্ক # 1 এর মধ্যে পার্থক্যের সমান না হলে শূন্য হয় না।

সংখ্যা পি প্রয়োজনীয় মানদণ্ড সাক্ষাৎ হয় যদি এবং কেবল যদি some()falsy (সব সংলগ্ন ডিজিটের একই পার্থক্য আছে) এবং চূড়ান্ত মান হয় 0 (সেখানে অন্তত 3 পুনরাবৃত্তিও ছিল)। এই দেয়!false / 0 === true / 0 === Infinity (সত্যবাদী)

আমাদের অন্যথায় থাকতে পারে:

  • !true / rসঙ্গে দ> 0 বা দ <0 , যা দেয় false / r === 0(falsy)
  • !false / NaN, যা দেয় true / NaN === NaN(মিথ্যা)

স্থগিতের অবস্থা

পুনরাবৃত্তির স্টপ যখন p | qমূল্যায়ণ 0 । এই ঘটতে নিশ্চিত হয় যখন উভয় পি এবং কুই নাগালের মান প্রায় 10 25 যা 84-বিট দীর্ঘ। জেএসের ম্যান্টিসার 52 বিট রয়েছে বলে শেষ 32 বিট শূন্য হয়েছে। সুতরাং, 32-বিট বিটওয়াইস বা 0 এ মূল্যায়ন করে ।

ক্রমটির দ্রুত বর্ধমান হারের কারণে এটি বরং দ্রুত ঘটে।


4

জাভা 8, 151 144 140 136 130 বাইট

(a,b)->{for(long n,m,d,p;;System.out.print(m>99&p==d?m+" ":""),m=a+b,a=b,b=m)for(m=n=a,d=p=10;n>9&d==p|p>9;d=n%10-(n/=10)%10)p=d;}

সংখ্যাগুলি খুঁজে পেলে এটি অসীম লুপ আউটপুট করে।
এটি অনলাইনে চেষ্টা করুন (60 সেকেন্ডের পরে সময় বেরিয়ে আসুন)।

136 বাইট সংস্করণ যোগ করা 10 10 সীমা ( a<1e10) সহ:

(a,b)->{for(long n,m,d,p;a<1e10;System.out.print(m>99&p==d?m+" ":""),m=a+b,a=b,b=m)for(m=n=a,d=p=10;n>9&d==p|p>9;d=n%10-(n/=10)%10)p=d;}

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

ব্যাখ্যা:

(a,b)->{         // Method with two long parameters and no return-type
  for(long n,m,  //  Temp numbers
           d,p;  //  Current and previous differences
      a<1e10;    //  Loop as long as `a` is still below 10^10
      ;          //    After every iteration:
       System.out.print(
                 //     Print:
        m>99     //      If the number has at least three digits,
        &p==d?   //      and the previous and current differences are still the same
         m+" "   //       Print the current number with a space delimiter
        :        //      Else:
         ""),    //       Print nothing
                 //     Go to the next Fibonacci iteration by:
       m=a+b,    //      Setting the temp-number `m` to `a+b`
       a=b,      //      Replacing `a` with `b`
       b=m)      //      And then setting `b` to the temp number `m`
    for(m=n=a,   //   Set both `m` and `n` to `a`
        d=p=10;  //   Set both `d` and `p` to 10
        n>9      //   Inner loop as long as `n` has at least two digits,
        &d==p    //   and `p` and `d` are still the same,
         |p>9    //   or `p` is still 10
        ;        //     After every iteration:
         d=n%10-(n/=10)%10)
                 //      Set `d` to the difference between the last two digits of `n`
                 //      And integer-divide `n` by 10 at the same time
      p=d;}      //    Set the previous difference `p` to `d`

4

জেলি , 20 19 18 বাইট

>ȷ2ȧDIEƊ
+ƝḢ;Ɗȷ¡ÇƇ

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

+ƝḢ;Ɗȷ¡ȷসিরিজে প্রথম হাজার ( ) পদ তৈরি করে যা সর্বদা যথেষ্ট হবে। আমি মনে করি এটি করার সম্ভবত আরও একটি ছোট উপায় আছে। +ȷ¡কাছে গেলে তবে প্রথম শব্দটি শূন্য হলে কেবল কাজ করে।

আমি ধরে নিচ্ছি যে আমরা দুটি সংখ্যা বিপরীতে নিতে পারি যা একটি বাইট করতে দেয় DIE

আমাদের যদি কোনও ইনপুট আউটপুট দেওয়ার প্রয়োজন না হয়:

জেলি , 15 বাইট

>ȷ2ȧDIEƊ
+ṄÇ¡ß@

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


5
DIEƊগল্ফ প্রক্রিয়া চলাকালীন সমস্ত নির্ভীক বাইটদের কাছে আমাদের চিন্তাভাবনা ।
আর্নল্ড

4

অষ্টাভে , 91 90 83 বাইট

লুইস মেন্ডোকে ধন্যবাদ 7 বাইট সংরক্ষণ করা!

@(t)eval"for i=3:99,if~diff(diff(+num2str(t(1))))disp(t(1))end,t=[t(2) sum(t)];end"

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

ঠিক আছে, এটি কাজ করে!

evalভিতরে কয়েক লাইট সংরক্ষণ করতে লুপ জন্য । কিছু সঞ্চয় করতে কলোন এবং সেমিকোলন এড়িয়ে চলেছে । এই সত্যটি ব্যবহার করুন যে কোনও ভেক্টর সত্যবাদী হিসাবে বিবেচিত হয় যদি সমস্ত উপাদানগুলি সংরক্ষণ করতে শূন্য হয় না anyবা all

তা ছাড়া, এটি ফিবোনাচ্চির সরাসরি বাস্তবায়ন



2

হাস্কেল , 105 বাইট

u%v|let s=u:scanl(+)v s=[n|n<-s,d<-[f(-).map fromEnum.show$n],length d>1,and$f(==)d]
f g=zipWith g=<<tail

অপারেটরকে সংজ্ঞায়িত করে (%)যা সমস্ত সমাধান সহ একটি অসীম তালিকা প্রদান করে। স্টাডাউটের ফলাফলটি দেখতে আমাদের অবশ্যই বাফারিং অক্ষম করতে হবে (বা এটি ghciচালিয়ে যেতে বা এটি চালিয়ে যেতে runhaskell), এটি অনলাইনে চেষ্টা করে দেখুন!

ব্যাখ্যা / Ungolfed

ফাংশনটি fকেবলমাত্র একটি সহায়ক ফাংশন যা বাইনারি ফাংশন এবং একটি তালিকা প্রত্যাশা করে, এটি gসমস্ত সংযুক্ত জোড়াগুলিতে ফাংশনটি প্রয়োগ করে । এটি মূলত:

adjacent g xs = zipWith (tail xs) xs

অপারেটরটি (%)কেবলমাত্র একটি তালিকা বোঝার যা কিছু ফিল্টারিং করে (এটি নিশ্চিত করে যে সেখানে কমপক্ষে 3 টি সংখ্যা রয়েছে এবং সংলগ্ন অঙ্কগুলির একই দূরত্ব রয়েছে):

u % v
  -- recursively define s as the "Fibonacci sequence" with f(0) = u and f(1) = v
  | let sequence = u : scanl (+) v sequence
  -- take all numbers from that sequence using the filters below
  = [ number | number <- sequence
  -- convert to string, get the ASCII codepoints and build a list of the adjacent differences
        , let differences = adjacent (-) . map fromEnum . show $ number
  -- numbers with > 3 digits have >= 2 adjacent digits (or rather differences of digits)
        , length differences > 1
  -- make sure all of these are equal by comparing them and reducing with logical and
        , and $ adjacent (==) differences
    ]

2

সিজেম , 55 বাইট

q~{1$_99>"_`2\ew{{-}*}%""3,"?~_(+="0$p"*~;_@+_11_#<}g;;

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

আমার প্রথম সিজেএম জমা, খুব ছোট নয় অনেক মজাদার। কোন পরামর্শ স্বাগত!


এটি জেনে রাখা ভাল, টিপের জন্য ধন্যবাদ! আমি জমাটি আপডেট করেছি।
সর্বোচ্চ

2

স্ট্যাক্স , 26 24 বাইট

Ç╕SôεPN^:·░ßⁿ {@ÿ}Ü╫╣1╣X

এটি চালান এবং এটি ডিবাগ করুন

ব্যাখ্যা

E{b+}99*L{E%2>|cd_E:-u%1=!C_Qf    # Full program, unpacked, implicit input
E                                 # Push all elements from array onto stack.
 {b+}99*L                         # Generate the first 99 numbers of the  Fibonacci sequence given the input
         {                   f    # Loop through all Fibonacci elements
          E                       # Array of decimal digit
           %2>                    # Does the array have at least 3 digits
              |c                  # Assume Truthy past this point
                d                 # discard top of stack
                 _E               # Copy the current element of the Fibonacci sequence and Digitize it
                  :-              # Pairwise difference of array.
                    :u            # Is there exactly 1 unique number
                        !C        # Flip the comparison, if truthy proceed
                          _Q      # Copy the current element of the Fibonacci sequence and Peek and print with a newline.

আমার এটির মতো সংক্ষিপ্ত নয় এবং সম্ভবত আরও কিছুটা গল্ফ করা যেতে পারে তবে এটি কার্যকর।



1

জুলিয়া 0.6 , 86 81 বাইট

a<b=b>=0&&((n->n>99&&2>endof(∪(diff(digits(n))))&&println(n)).([a,b]);a+b<a+2b)

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

বেশ সোজা - যা ইনপুটটিতে কমপক্ষে 3 টি সংখ্যা ( n>99) রয়েছে কিনা তা পরীক্ষা করে দেখুন , তারপরে ( ) সংখ্যায় প্রতিটি অঙ্কের জোড়ার মধ্যে পার্থক্যটি ধরুন, ( ) এর এই পার্থক্যের diff(digits(n))( endof) একটি অনন্য সেটের দৈর্ঘ্য 1 (অর্থাৎ সমস্ত পার্থক্য) পরীক্ষা করুন একই) এবং যদি নম্বরটি মুদ্রণ করে তবে। প্রদত্ত উভয় সংখ্যার জন্য এটি করুন, তারপরে পুনরাবৃত্তভাবে পরবর্তী দুটি সংখ্যা সহ ফাংশনটি কল করুন।

(দুর্ভাগ্যবশত, এটা দেখে মনে হচ্ছে ±বেশী প্রাধান্য রয়েছে +, অথবা অন্য চূড়ান্ত কল হয়ে থাকতে পারে a+b±a+2b, 3 বাইট সংরক্ষণ।) এখন overloads <অপারেটর, এইভাবে উভয় অপারেটর বাইট এবং প্রাধান্য বন্ধনী উপর সংরক্ষণ। (ব্যবহার করা যাবে না <আমাদের কোডে যদিও, তাই শুধু পুনর্বিন্যাস endof(...)<2করার 2>endof(...))।

কিছু বিদেশী আউটপুট অনুমতি দেওয়া হয়, তাহলে আমরা ব্যবহার 2 বাইট সংরক্ষণ করতে পারবেন @showপরিবর্তে println, প্রিন্টিং n = 987মাত্র পরিবর্তে 987। এমনকি আমরা এর dumpচেয়ে কম 1 বাইট ব্যবহার করতে পারি, তবে dumpমান সহ প্রকারের তথ্যগুলি প্রিন্ট করি, সুতরাং আউটপুটটি কেবলমাত্র Int64 987পরিবর্তে হবে 987

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