私は特別なNボナッチ数ですか?


11

もともとこの質問で@DJMcMayhemによって発明されたNボナッチ数列は、整数0と1で始まり、前のN数を追加して次の数を生成することによって生成された数列です。特別なN-ボナッチ数列は、0と1以外の数字のペアで始まるN-ボナッチ数列です。XとYという名前になります。Nが既に数列にある用語の数よりも大きい場合は、使用可能なすべてを追加します条項。

たとえば、通常のフィボナッチ数列のNは2(前の2つの項目を取ります)、XとYは0と1、または1と1になります。

あなたのタスク:

入力された整数(A)が次の3つの整数によって生成される特別なNボナッチシーケンスの一部であるかどうかをチェックするプログラムまたは関数を作成します(2番目の入力をN、3番目と4番目をXおよびYとして使用) 。N = 1の特殊なケースを処理するようにしてください。

入力:

4つの非負整数、A、N、X、およびY。

出力:

AがN、X、およびY入力によって生成されたNボナッチ数列の一部であるかどうかを示す真偽値。

テストケース:

Input:    Output:
13,2,0,1->truthy
12,3,1,4->falsy
4,5,0,1-->truthy
8,1,8,9-->truthy
9,1,8,9-->truthy

12,5,0,1->falsy  [0,1]>[0,1,1]>[0,1,1,2]>[0,1,1,2,4]>[0,1,1,2,4,8]>[0,1,1,2,4,8,16]>etc.  

得点:

これはであるため、バイト単位の最低スコアが優先されます。


1
N==1そのような奇妙なケースです。
魔法のタコUr

うん、でも奇妙なケースがこれを面白くしている:)
グリフォン

実際に回答をケースに処理したい場合N=1は、質問でそれを呼び出すことができます。なぜなら、多くの回答(現在のすべての回答を含む)は、厳密に増加するシリーズを前提とする失敗条件を持っているからです。また、負の可能性はXありYますか?また、既存のすべての回答が無効になる可能性があります。
-apsillers

1
XとYの両方がゼロである非増加の場合、既存の回答はすべて処理できないと思います。その場合も処理する必要がありますか?
アプシラーズ

1
真実のケース8,1,8,9を追加し、ケース処理で値だけでなく非反復値も検出さ9,1,8,9れるようにする必要があると思います。(ケースを処理する場合は、それも追加する必要があります。)N=1XY0,0
apsillers

回答:


5

ゼリー、12 バイト

ḣ⁴S;µṀ<⁵µ¿⁵e

フルプログラム撮影[X,Y]NA

オンラインでお試しください!

どうやって?

ḣ⁴S;µṀ<⁵µ¿⁵e - Main link (monadic): [X,Y]
    µ   µ¿   - while:
     Ṁ       -   maximum value of the list
       ⁵     -   5th command line argument (3rd input) = A
      <      -   less than?
             - ...do:
 ⁴           -   4th command line argument (2nd input) = N
ḣ            -   head (get the first N (or less) items from the list)
  S          -   sum
   ;         -   concatenate (add the result to the front of the list)
          ⁵  - 5th command line argument (3rd input) = A
           e - exists in the resulting list?

優秀な。とにかく、私のために働くようです。+1
グリフォン

代わりに、A以上の値まで逆Nボナッチシーケンスを表示するには⁵e、最後からを削除します。それが機能することを伝えるのがはるかに簡単です(最初の2つの用語の順序は重要ではないことに注意してください)。
ジョナサンアラン

たくさんのテストケースを試したので、誰かがそれを見つけない限り失敗します。
グリフォン

5

05AB1E、18バイト

[DR²£O©‚˜³®>‹#]³QZ

オンラインでお試しください!


用途: [X,Y], N, A


意図しない機能が必要以上に難しくなったように感じます。

以前に気づいたことのない、「以上」はありません。

そして、仕事、および必要に応じていなかった]1バイトのために、#]³



3

Perl 6、47バイト

->\A,\N,\X,\Y{A∈(X,Y,{[+] @_.tail(N)}...*>A)}

試して

拡張:

->
  \A,
  \N,
  \X, \Y
{
    A          # is 「A」

              # an element of

    (          # this Sequence

      X, Y,        # seed values of sequence

      {            # generate the rest of the Seq using this code block

        [+]        # reduce by addition

          @_       # of all previously generated values
          .tail(N) # only use the last 「N」 of them
      }

      ...          # keep generating values until

      * > A        # it is greater than 「A」

    )
}


1

R69 60バイト

function(a,n,l){while(l<a)l=c(sum(l[1:n],na.rm=T),l)
a%in%l}

オンラインでお試しください!

無名関数を取得a,nし、ベクトルを返しますl=c(y,x)while(l<a)の最初の要素のみをチェックするため、N-ボナッチシーケンスを逆方向に構築します(つまり、より小さいインデックスがシーケンス内に追加されます)l


1

Common Lisp、164バイト

(defun f(a n x y &aux(l(list y x)))(if(= n 1)(or(= a x)(= a y))(loop(if(<= a(car l))(return(member a l))(setf l(cons(reduce'+ l)(if(<(length l)n)l(butlast l))))))))

この関数はNIL、(Common Lispの一般化されたブール値の定義に従って)falseの場合、trueの場合は非NILを返します。

(defun f(a n x y &aux (l (list y x)))    ; initialize a list l for the N values
  (if (= n 1)                            ; special case for N = 1
      (or (= a x) (= a y))               ;    true only if A = X or A = Y
      (loop
        (if (<= a (car l))               ; when the last number generated is greater than A
            (return (member a l))        ; return true if A is in the list
            (setf l (cons (reduce '+ l)  ; otherwise compute the sum of l
                          (if (< (length l) n)   ; and push it to l (truncating the list at 
                              l                  ; end if it has already size = N)
                              (butlast l))))))))

例えば、両方および/またはいつをN=1検出するための特別なケースの処理をしますか 私のLisp読解スキルはそれほど優れていませんが、2つの初期値のうちの1つとしか比較できないようです。A12X=1 Y=2A
-apsillers

N この場合、シーケンスが適切に定義されていない可能性がありますか?
レンゾ・

OK、質問が変更されたことがわかりました。答えを更新しました。
レンゾ・

0

k、29バイト

{x=*(*x>){(x=#y)_y,+/y}[y]/z}

オンラインでお試しください! 1真実で0あり、偽りです。入力は[A;N;X,Y]です。


私が見たすべての例でそれを実行しました。1は真実、0は偽です。
zgrep

@Gryphon入力を本文ではなくフッターに移動しましたが、何を変更したいかはわかりません。両方とも同じ機能でした。
-zgrep

あ、なるほど。あなたは何も入力していないと思っていましたが、コードで入力していました。今ではもっと理にかなっています。私はkがわからないので、質問を誤って解釈してしまうと思いました。10 1 1
Gryphon


0

Mathematica、94バイト

(s={#3,#4};t=1;While[t<#2-1,s~AppendTo~Tr@s;t++];!LinearRecurrence[1~Table~#2,s,#^2]~FreeQ~#)&


入力フォーマット

[A、N、X、Y]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.