我是一个特殊的N-bonacci号码吗?


11

N-bonacci序列最初是由@DJMcMayhem在此问题中发明的,它是通过以整数0和1开头,然后加上前N个数字以生成下一个数字而生成的序列。特殊的N-bonacci序列是一个以0和1以外的一对数字开头的N-bonacci序列,它们将被命名为X和Y。如果N大于序列中已经存在的项数,只需添加所有可用的条款。

因此,例如正常的斐波那契数列的N为2(取前两项),X和Y为0和1,或者1和1,具体取决于您问谁。

你的任务:

您将编写一个程序或函数来检查输入的整数(A)是否是由接下来的三个整数生成的特殊N-bonacci序列的一部分(将第二个输入用作N,将第三个和第四个用作X和Y) 。确保处理N = 1的特殊情况。

输入:

四个非负整数A,N,X和Y。

输出:

真/假值,指示A是否为N,X和Y输入生成的N-bonacci序列的一部分。

测试用例:

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真是个奇怪的例子。
Magic Octopus Urn

是的,但是奇怪的情况才使这个变得有趣:)
Gryphon

如果您确实希望答案能够解决问题N=1,则可能需要在问题中加以说明,因为许多答案(包括我认为所有当前答案)的失败条件都将假设序列不断增加。另外,可以X并且Y为负吗?那可能还会使所有现有答案无效。
apsillers

1
我认为所有现有答案都无法处理X和Y均为零的非递增情况。是否有必要处理这种情况?
apsillers

1
我认为您应该添加真实的案例,8,1,8,99,1,8,9确保N=1案例处理能够检测到非重复X值以及该Y值。(如果您想处理0,0案件,也应该添加。)
apsillers

Answers:


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
狮ry

要改为看到反向N-bonacci序列的值大于或等于A,只需⁵e从末尾删除;这样一来,它就可以容易地工作了(注意,前两个术语的顺序无关紧要)。
乔纳森·艾伦,

尝试了一堆测试用例,所以除非有人发现一个失败,否则对我来说很好。
狮ry

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」

    )
}

2

Python 2,50个字节

a,n,l=input()
while[a]>l:l=[sum(l[:n])]+l
a in l>x

将输入作为A,N,[Y,X]。通过退出代码输出。

在线尝试!


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和vector l=c(y,x)。向后构造N-bonacci序列(即,序列中的索引更小),因为while(l<a)仅检查的第一个元素l


1

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

此函数返回NILfalse,非NIL 返回true(根据Common Lisp 的广义布尔值的定义)。

(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检测A例如1and和/或2when X=1 Y=2?我的Lisp阅读技能不是很好,但是看起来您可能只比较A了两个初始值之一。
apsillers

@apsillers,当N = 1时,我仅将A与X进行比较,而不与Y进行比较。如果它等于其中之一,我应该将两者都返回true吗?也许这种情况下的顺序定义不正确?
Renzo

好的,现在我看到问题已经更改,我已经更新了答案。
Renzo

0

k,29个字节

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

在线尝试! 1是真实的,0是虚假的。输入为[A;N;X,Y]


我在看到的所有示例中都使用了它。1为真,0为假。
zgrep

@Gryphon我将输入内容移到了页脚而不是正文,但是我不确定您要我更改什么。两者是相同的功能。
zgrep

哦,我明白了。我以为您没有接受任何输入,但是您在代码中接受了输入。现在变得更加有意义。我不知道k,所以我认为您会误解这个问题,因为它只会输出1 0 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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.