এই নম্বরটি কি গোপনে ফিবোনাচি?


23

পটভূমি

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

উদাহরণ স্বরূপ:

139 = 89 + 34 + 13 + 3
This is a total of 4 integers. Since 4 is not a Fibonacci number, 139 is not secretly Fibonacci

140 = 89 + 34 + 13 + 3 + 1
This is a total of 5 integers. Since 5 is a Fibonacci number, 140 is secretly Fibonacci

নোট

  • অনুকূল জেকেন্ডারফের প্রতিনিধিত্ব একটি লোভী অ্যালগরিদম ব্যবহার করে পাওয়া যাবে। কেবলমাত্র বৃহত্তম ফিবোনাচি নাম্বার <= n নিন এবং আপনার 0 তে পৌঁছা পর্যন্ত এটিকে n থেকে বিয়োগ করুন
  • সমস্ত ফিবোনাচি সংখ্যা 1 টি ফিবোনাচি সংখ্যা (নিজেই) যোগফল হিসাবে উপস্থাপিত হতে পারে। যেহেতু 1 একটি ফিবোনাচি নম্বর, সমস্ত ফিবোনাচি সংখ্যাগুলিও গোপনে ফিবোনাচি are

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও পূর্ণসংখ্যার লাগে এবং ফিরে আসে যে সেই পূর্ণসংখ্যাটি গোপনে ফিবোনাচি কিনা।

ইনপুট

আপনি কোনও যুক্তিসঙ্গত বিন্যাসে ইনপুট নিতে পারেন। আপনি ধরে নিতে পারেন ইনপুটটি একক ধনাত্মক পূর্ণসংখ্যা হবে।

আউটপুট

ইনপুটটি গোপনে ফিবোনাচি কিনা এটির জন্য দুটি স্বতন্ত্র ফলাফলের একটি আউটপুট। উদাহরণগুলির মধ্যে রয়েছে True/ False, 1/ 0ইত্যাদি include

স্কোরিং

এটি , তাই বাইট জেতে সংক্ষিপ্ত উত্তর! স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।

পরীক্ষার মামলা

Truthy (secretly Fibonacci)
1
2
4
50
140
300099

Falsey (NOT secretly Fibonacci)
33
53
54
139
118808

6
এর অর্থ কি তারা উত্সাহী?
কেভিন

2
এটি কারওর ব্যবহারের ক্ষেত্রে: সর্বোত্তম যোগটি অনন্য সমাধান যা পরপর দুটি ফাইওনাচি সংখ্যা ব্যবহার করে না।
ক্যাস্পার্ড

2
@ ক্যাস্পার্ড আপনি সঠিক, আপনি যদি এটির বিষয়ে চিন্তা করেন তবে তা বোধগম্য। যদি সমাধানটিতে পরপর দুটি ফিবোনাচি নম্বর থাকে তবে সেগুলি একত্রে যুক্ত করা যেতে পারে এবং পরবর্তীটি তৈরি করতে পারে। যদি আপনার সমাধানটিতে 5 এবং 8 টি থাকে তবে এটি একটি একক 13 হওয়ার চেয়ে কম অনুকূল হবে
কাউয়াবাংহোল

@ কাউয়াবাংহোল একটি পূর্ণ প্রমাণ তার চেয়ে কিছুটা জটিল। যদি সমাধানটিতে ইতিমধ্যে 5, 8 এবং 13 থাকে তবে আপনি 8 + 13 যোগ করবেন না 5 + 8। এবং অন্য দিকটিও প্রমাণিত হওয়া দরকার।
ক্যাস্পার্ড

উত্তর:



8

পাইথন 2 , 77 বাইট

def f(n):z=[bin(x).count('1')for x in range(n*n+1)if x&2*x<1];print z[z[n]]<2

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

এটি OEIS A003714 এর দুটি বিবরণ সমান যে উপপাদ্যটি ব্যবহার করে :

n=F(i1)+F(i2)++F(ik)nna(n)=2i1+2i2++2ik1'S।

zn

তারপরে এটি z[n]কোনও ফিবোনাকির সংখ্যা, কিনা তা যাচাই করা অবশেষ z[z[n]] == 1

এন2+ +1


চারপাশের ব্যাকটিকগুলি সরিয়ে আপনি দুটি বাইট কাটতে পারেন bin(x)। এছাড়াও আপনি পরিবর্তন করে এক অপসারণ করতে পারেন range(n*n+1)থেকে range(n<<n)। (ধরে নেওয়া 0 টি অবৈধ)
nedla2004

আমি আশেপাশে ব্যাকটিকস নিয়ে কী ভাবছিলাম bin(x), হাহাহা। এবং, এইচএম, 1<<nইতিমধ্যে উপায়, পর্যাপ্ত পরিমাণের চেয়েও বেশি, তবে আমি রানটাইমটিকে অ-জ্যোতির্বিজ্ঞানের সাথে রাখতে চাই
লিন

ফেয়ার পয়েন্ট, আমার ধারণা কোডটি চালাতে সক্ষম হওয়া একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হতে পারে। :)
nedla2004

6

জেলি , 15 বাইট

‘ÆḞ€fRṪạµƬL’Ɗ⁺Ị

একটি মোনাডিক লিঙ্ক একটি অ-নেতিবাচক পূর্ণসংখ্যাকে গ্রহণ করে যা 1"গোপনে ফিবোনাচি" এবং 0অন্যথায় যদি ফল দেয়।

এটি অনলাইন চেষ্টা করুন! (বৃহত্তর পরীক্ষার মামলার জন্য খুব অদক্ষ)

কিভাবে?

‘ÆḞ€fRṪạµƬL’Ɗ⁺Ị - Link: integer, I
        µƬ      - perform the monadic link to the left as a function of the current I,
                - collecting up all the inputs until the results are no longer unique:
‘               -   increment I -> I+1
 ÆḞ€            -   nth Fibonacci number for €ach n in [1,I+1]
     R          -   range from 1 to I
    f           -   filter discard (discard Fibonacci numbers not in the range, i.e. > I)
      Ṫ         -   tail (get the largest)
       ạ        -   absolute difference with I
                - This gives us a list from I decreasing by Fibonacci numbers to 0
                - e.g. for 88 we get [88,33,12,4,1,0]
                -      because (88-33)+(33-12)+(12-4)+(4-1)+(1-0)=55+21+8+3+1=88 
          L     - length (the number of Fibonacci numbers required plus one)
           ’    - decrement (the number of Fibonacci numbers required)
            Ɗ   - treat the last three links (which is everything to the left) as a monad:
             ⁺  - ...and repeat it
                - i.e. get the number of Fibonacci numbers required for the number of
                -      Fibonacci numbers required to represent I.
                -      This is 1 if I is Secretly Fibonacci, and greater if not)
              Ị - insignificant? (is the absolute value of that <= 1?)


5

সি # (.নেট কোর) , 124 115 98 বাইট

a=>{int n=0,b,c;for(;a>0;a-=b,n++)for(b=c=1;c<=a;b=c-b)c+=b;for(b=c=1;c<n;c+=b)b=c-b;return c==n;}

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

-৩ বাইট: লুপের সময় পরিবর্তিত হয়েছে ( অলিভিয়ার গ্রাগোয়ারকে ধন্যবাদ )
-6 বাইট: লুপের বাইরে পরিবর্তনশীল, আরম্ভীকৃত বি এবং সি ব্যবহারের জন্য রিটার্ন স্যুইচ করা হয়েছে ( কেভিন ক্রুইজসেনকে ধন্যবাদ )
-17 বাইট: দ্বিতীয় লুপে পরিবর্তিত অবস্থার পরিবর্তন হলে লুপের বাইরে এবং রিটার্নের সাথে একত্রিত, শেষ লুপের পুনরায় ব্যবহৃত বি এবং সি ভেরিয়েবলগুলি ( রাজনাগুলকে ধন্যবাদ )

Ungolfed:

a => {
    int n = 0, b, c;                        // initialize variables

    for(; a > 0; a -= b, n++)               // increase n until a is 0
        for(b = c = 1; c <= a; b = c - b)   // set b and c to 1 for each a; set second largest Fibonacci number until largest Fibonacci number reaches a
            c += b;                         // set largest Fibonacci number of current sequence

    for(b = c = 1; c < n; c += b)           // while e is less than or equal to n, continue incrementing largest (e) Fibonacci number in the sequence
        b = c - b;                          // increment second-largest (d) Fibonacci number

    return c == n;                          // if c equals n, a is a secret Fibonacci number
}

1
for(;c<=a;b=c-b)c+=b;আপনাকে 3 বাইট সাশ্রয় করবে
অলিভিয়ার গ্রাগোয়ার

1
115 বাইট । আমি {}আপনার লুপগুলির সমস্ত ব্র্যাকেটগুলি সরিয়েছি এবং সমস্ত কিছুই forলুপগুলিতে রেখেছি। উপরন্তু, আমি একটি পরিবর্তনশীল যোগ rযা আমরা সেট 1আপনার if(e==n), শেষে এবং বিনিময়ে যাতে আপনি শুধুমাত্র এক আছে return
কেভিন ক্রুইজসেন

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

1
দ্বিতীয় লুপের শর্তটি পরিবর্তন করে e<nআপনি ifলুপের পরে টুটি সরিয়ে নিতে পারেন এবং ফলস্বরূপ 101 টি বাইটেরreturn জন্য এটি একত্রিত করতে পারেন ।
রাজনগুল

1
আপনি পুনরায় ব্যবহার করে bএবং cশেষ লুপে এবং অপসারণ করে dএবং আরও 3 বাইট সংরক্ষণ করতে পারেন e
রাজনগুল

4

পার্ল 6 , 58 বাইট

{(1,&[+]...*>$_)∋($_,{$^n-(1,&[+]...^*>$n).tail}...0)-1}

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

1, &[+] ... * > $_ এটি কেবল ফিবোনাচি ক্রম, একটি সুবিধাজনক অ-অসীম স্থানে (ইনপুট নম্বর) বন্ধ হয়ে যায়।

$_, { $^n - (1, &[+] ...^ * > $n).tail } ... 0ইনপুট সংখ্যার সাথে শুরু করে প্রতিটি ক্রমান্বিত উপাদানটি পূর্ববর্তী উপাদান থেকে পূর্বের উপাদানটির চেয়ে কম বা সমান বৃহত্তম ফিবোনাচি সংখ্যা বিয়োগ করে প্রাপ্ত প্রতিটি ক্রমিক উপাদান। ক্রমটি 0পৌঁছে গেলে সমাপ্ত হয়। উদাহরণস্বরূপ, যদি $_হয় 140তবে এই ক্রমটি 140, 51, 17, 4, 1, 0

এই ক্রমটি থেকে একটিকে বিয়োগ করা এটি একটি সংখ্যা, তার দৈর্ঘ্য এবং পার্থক্য হিসাবে বিবেচনা করে ফিবোনাচি সংখ্যার সংখ্যা যা একসাথে যুক্ত হয়ে ইনপুট নম্বর দেয়। তারপরে এই নম্বরটি প্রথম ফিবোনাচি সিকোয়েন্সে সদস্যতার জন্য পরীক্ষা করা হয়।


এর আগে আমি সেই কৌশলটি দেখিনি &[+]! দুটি প্রাথমিক
জো কিং

1
একটি ফাংশনে ফিবোনাচি ক্রম এবং অন্যান্য কয়েকটি পরিবর্তনকে অর্পণ করে 51 বাইট
জো কিং

L4m2 এর জাভাস্ক্রিপ্ট উত্তরের পোর্ট, 50 বাইট
নয়েলহোফ

@ ননহ্নহোফ হা, আমার সামান্য পার্থক্য
জো কিং

3

পার্ল 6 , 48 বাইট

{4>($_,{$_,{$_-(1,&[+]...*>$_)[*-2]}...^0}...1)}

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

ইনপুটটিকে একক সংখ্যায় না পৌঁছানো পর্যন্ত বার বার জেকেন্ডারফের প্রতিনিধিত্বের তালিকায় রূপান্তর করে এবং তারপর ক্রমের দৈর্ঘ্য 4 এর চেয়ে কম ছিল কিনা তা পরীক্ষা করে দেখুন।

মাঝখানে জেনকান্ডার্ফের কাজটি বেশিরভাগ উন্নতির সাথে শানের উত্তর থেকে শুরু করে is

ব্যাখ্যা:

{4>($_,{$_,{$_-(1,&[+]...*>$_)[*-2]}...^0}...1)}
{                                              } # Anonymous code block
                                          ...     # Define a sequence:
    $_  # That starts at the input
      ,{                                 }  # Each element is defined by:
                                   ... # Another sequence that:
        $_,   # Starts at the previous element
            $_-   # The previous element minus
                1,&[+]...*     # The Fibonacci sequence
                          >$_  # Ending when it is larger than the previous element
               (             )[*-2]  # The second from last element
          {                        }...^0  # Run until 0, discarding the last element
         # This returns the length of the Zeckendorf Representation
                                         ...1  # Run this until it is length 1
 4>(                                         )  # Return true if the length of the sequence is smaller than 4

উদাহরণস্বরূপ, জন্য ক্রম 2হয় 2 1যেহেতু 2ইতিমধ্যে একটি ফিবানচি সংখ্যা। এর ক্রমটি 140হ'ল 140 5 1এবং যেহেতু 5 হ'ল একটি ফিবোনাচি নম্বর এটি সত্য। এর ক্রমটি 33হ'ল 33 4 2 1এবং যেহেতু 4কোনও ফিবোনাচি সংখ্যাটি নয় তবে ক্রমটি দৈর্ঘ্য 4 4


3

05 এ বি 1 ই , 14 বাইট

ΔDÅFθ-¼}¾ÅF¾<å

এটি অনলাইনে চেষ্টা করুন । সমস্ত পরীক্ষার ক্ষেত্রে কোনও পরীক্ষার স্যুট নেই, কারণ counter_variable0 তে পুনরায় সেট করা যায় না I যদিও আমি হাতে হাত দিয়ে যাচাই করেছি, এবং সেগুলি সঠিক।

ব্যাখ্যা:

Δ      }          # Loop until the top of the stack no longer changes
 D                #  Duplicate the top of the stack
                  #  (implicitly the input in the first iteration)
  ÅF              #  Get a list of all Fibonacci numbers lower than this number
    θ             #  Get the last item (largest one)
     -            #  Subtract it from the number
      ¼           #  Increase the counter_variable by 1 every iteration
        ¾         # After the loop, push the counter_variable
         ÅF       # Get all Fibonacci numbers below this counter_variable
           ¾<     # Push the counter_variable again, and subtract 1
             å    # Check if this value is in the list of Fibonacci numbers
                  # (and output implicitly)

উল্লেখ্য: counter_variableহবে 5ইনপুট জন্য 139এবং 6ইনপুট জন্য 140কারণ জন্য জন্য, Δ-loop স্ট্যাক চেক করতে একই রয়ে, এটা অবশ্যই একটি অতিরিক্ত পুনরাবৃত্তির আছে।



2

রেটিনা 0.8.2 , 61 বাইট

.+
$*
M`((?>\2?)(\1|\G.))*..|.
.+
$*
^(((?>\3?)(\2|^.))*.)?.$

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা:

.+
$*

অ্যানারিতে রূপান্তর করুন।

M`((?>\2?)(\1|\G.))*..|.

প্রয়োজনীয় ফিবোনাচি সংখ্যাগুলি গণনা করুন।

ফিবানচি সংখ্যার মতো কমপক্ষে 2. হয় প্রথম পাস উপর প্রথম আবর্তনে পুলিশ \2এখনো বিদ্যমান নয়, কিন্তু ভাগ্যক্রমে এটা ঐচ্ছিক, তাই আমরা তা মেলে না। \1উভয়ই অস্তিত্ব নেই, তবে ভাগ্যক্রমে \G.ম্যাচের শুরুতে আমাদের একটি বিকল্প রয়েছে যা একটি চরিত্রের সাথে মেলে। উভয় \2এবং \1তাই মান 1 গ্রহণ।

পরবর্তী পাসগুলিতে, \2উপস্থিত থাকে, তাই আমরা এটির সাথে মিলিয়ে দেখার চেষ্টা করি। এই সময় যদি এটি তারপর ব্যর্থ হয় \1এছাড়াও ব্যর্থ (যেহেতু চেয়ে বড় \2), কিন্তু যদি এটা সফল, (?>)বাধা দেয়, backtracking তাই যদি \2ম্যাচ কিন্তু \1আমরা শুধু চেষ্টা করবেন না নেই \1। ( \G1প্যাচ শুরুর আগে আমরা অগ্রসর হয়েছি বলে সর্বদা ব্যর্থ হয়)) অবশেষে \2এর পূর্বের মানটি গ্রহণ করে\1 যখন \1দুইটি মানের সমষ্টি নেভিগেশন লাগে।

অতএব আমরা যতগুলি ফিবোনাচি সংখ্যায় মেলে তার সাথে যোগ করে আমরা যাই। যেহেতু ক্রম আংশিক অঙ্কের 1, 2, 3, 5...হয় 0, 1, 3, 6, 11...অর্থাত 2 ফিবানচি সংখ্যার আমরা শেষে ম্যাচিং 2 দ্বারা শেষ কম।

এটি স্পষ্টতই 1 টির সাথে মেলে যাতে একটি বিকল্প যে কেস পরিচালনা করে।

.+
$*

অ্যানারিতে রূপান্তর করুন।

^(((?>\3?)(\2|^.))*.)?.$

এটি একটি ফিবোনাকি নম্বর কিনা পরীক্ষা করুন। এটি প্রথম পরীক্ষার মতো একই ধারণা ব্যবহার করে তবে এটি ব্যবহার করে^ পরিবর্তে করে \Gএবং আমাদেরও ঠিক মিলতে হবে, সুতরাং এটি বিকল্প হিসাবে পরিবর্তিত বিকল্প বিকল্পটি গল্ফায়ার হিসাবে ব্যবহার করে (তবে এটি ক্যাপচার সংখ্যাটি 1 দ্বারা বৃদ্ধি করে)।

রেটিনা , 35 বাইট

.+
*
2}C`((?>\2?)(\1|\G.))*..|.
^1$

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা:

.+
*

অ্যানারিতে রূপান্তর করুন।

C`((?>\2?)(\1|\G.))*..|.

প্রয়োজনীয় ফিবোনাচি সংখ্যাগুলি গণনা করুন। (রূপান্তরকরণ এবং গণনা উভয়ই লুপ করা গণনাটিকে প্রথম স্থানে আনারীতে পাওয়ার পরে পুরো বাইট সংরক্ষণ করে))

2}

মোট দুটি বার আগের পদক্ষেপগুলি সম্পাদন করুন। এটি ফিবোনাকির সংখ্যা গণনার জন্য প্রয়োজনীয় ফিবোনাচি সংখ্যা গণনা করে।

^1$

যদি নম্বরটি গোপনে ফিবোনাচি হত তবে ফলাফল 1।


1

পাইথন 2 , 146 137 বাইট

lambda a:len(g(len(g(a))))<2
f=lambda n:n<3or f(n-2)+f(n-1)
def g(a,n=1):j=f(n-1);return[j]if a-j<1else[j]+g(a-j)if a-f(n)<0else g(a,n+1)

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

f () একটি পুনরাবৃত্ত ফাংশন যা নবম ফিবোনাচি সংখ্যার মান প্রদান করে। এই উত্তর থেকে নেওয়া ।

g () হ'ল একটি পুনরাবৃত্ত ফাংশন যা প্রদত্ত সংখ্যার জেকেন্ডার্ফের প্রতিনিধিত্বকে পূর্ণসংখ্যার তালিকা হিসাবে প্রদান করে।

যেহেতু সমস্ত ফিবোনাচি নম্বরের g (), h () থেকে এক আইটেমের রিটার্ন দৈর্ঘ্য হবে জি (এন) এর = (দৈর্ঘ্য) == 1 কিনা তা যাচাই করে।

সম্পাদনা: 9 বাইট সংরক্ষিত হয়েছে nedla2004 ধন্যবাদ । আমি ভুলে যেতে থাকি যে ল্যাম্বডাস সর্বদা সেরা সমাধান নয় ...


1
138 বাইট । আমি বেশিরভাগই সবেমাত্র gএকটি ফাংশন তৈরি করেছিলাম যাতে আমি f(n-1)একটি ভেরিয়েবলের সংজ্ঞা দিতে পারি । থেকে দম্পতি অন্যান্য পরিবর্তন ==করতে <যেখানে তারা একই।
nedla2004
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.