Eu sou um número N-bonacci especial?

11

A sequência N-bonacci, originalmente inventada por @DJMcMayhem nesta pergunta , é uma sequência gerada iniciando com os inteiros 0 e 1 e adicionando os números N anteriores para gerar o próximo número. A sequência N-bonacci especial é uma sequência N-bonacci que começa com um par de números diferentes de 0 e 1, que será nomeado X e Y. Se N for maior que o número de termos já na sequência, basta adicionar todos os termos.

Por exemplo, a sequência normal de fibonacci tem um N de 2 (pega os dois itens anteriores) e um X e Y de 0 e 1, ou 1 e 1, dependendo de quem você perguntar.

Sua tarefa:

Você deve escrever um programa ou função que verifique se um número inteiro inserido (A) faz parte da sequência N-bonacci especial gerada pelos próximos três números inteiros (usando a segunda entrada como N e a terceira e quarta como X e Y) . Certifique-se de lidar com o caso especial de N = 1.

Entrada:

Quatro números inteiros não negativos, A, N, X e Y.

Resultado:

Um valor de verdade / falsidade que indica se A faz parte da sequência N-bonacci gerada pelas entradas N, X e Y.

Casos de teste:

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.  

Pontuação:

Isso é , então a pontuação mais baixa em bytes vence.

Gryphon
fonte
1
N==1é um caso tão estranho.
Magic Octopus Urn
Sim, mas os casos estranhos são o que torna este divertido :)
Gryphon
Se você realmente deseja respostas para lidar com o caso N=1, convém mencioná-lo na pergunta, pois muitas respostas (incluindo todas as respostas atuais, eu acho) terão uma condição de falha que assume uma série estritamente crescente. Além disso, pode Xe Yé negativo? Isso provavelmente também invalidará todas as respostas existentes.
apsillers
1
Penso que todas as respostas existentes não conseguem lidar com o caso não crescente em que X e Y são zero. É necessário lidar com esse caso também?
apsillers
1
Eu acho que você deve adicionar os casos verdadeiros 8,1,8,9e 9,1,8,9garantir que o N=1tratamento de casos detecte o Xvalor não repetido e o Yvalor. (Se você quiser lidar com 0,0casos você deve adicionar isso também.)
apsillers

Respostas:

5

Gelatina , 12 bytes

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

A tomada programa completo [X,Y], N, A.

Experimente online!

Quão?

ḣ⁴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?
Jonathan Allan
fonte
Excelente. Parece funcionar para mim, de qualquer maneira. +1
Gryphon
Para ver a sequência N-bonacci invertida até um valor maior ou igual a A, basta remover a ⁵edo final; muito mais fácil dizer que funcionará então (observando que a ordem dos dois primeiros termos não tem importância).
Jonathan Allan
Tentei um monte de casos de teste, então, a menos que alguém encontre um que falhe, é bom comigo.
Gryphon
5

05AB1E , 18 bytes

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

Experimente online!


Usos: [X,Y], N, A


Sinto que algumas funcionalidades não intencionais tornaram isso mais difícil do que precisava ser.

Não há maior ou igual a, nunca notei isso antes.

E não funcionou, e exigiu um ], para +1 bytes #]³.

Urna de polvo mágico
fonte
4

Python 2 , 59 56 bytes

a,n,l=input()
while l[0]<a:l=[sum(l[:n])]+l
print a in l

Experimente online!

Aceita entrada como A,N,[X,Y]

ovs
fonte
Aqui está um wrapper para todos os casos de teste, se você quiser.
Leaky Nun
Aqui estão 2 bytes jogados fora.
Leaky Nun
3

Perl 6 , 47 bytes

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

teste-o

Expandido:

->
  \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」

    )
}
Brad Gilbert b2gills
fonte
2

Python 2, 50 bytes

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

Toma entrada como A,N,[Y,X]. Saídas via código de saída.

Experimente online!

Lynn
fonte
1

R , 69 60 bytes

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

Experimente online!

Retorna uma função anônima, taking a,ne um vetor l=c(y,x). Constrói a sequência N-bonacci para trás (ou seja, um índice menor está mais adiante na sequência), uma vez que while(l<a)apenas verifica o primeiro elemento de l.

Giuseppe
fonte
1

Lisp comum, 164 bytes

(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))))))))

Esta função retorna NILpara false, não NIL para true (de acordo com a definição de boolean generalizado do 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))))))))
Renzo
fonte
Você trata de casos especiais para N=1detectar um Ade, por exemplo, ambos 1e / ou 2quando X=1 Y=2? Minhas habilidades de leitura de Lisp não são ótimas, mas parece que você pode comparar apenas Acom um dos dois valores iniciais.
Apsillers
@apsillers, quando N = 1 eu comparo A apenas com X e não com Y. devo compará-lo com os dois retornando true se for igual a um deles? Talvez a sequência não esteja bem definida para este caso?
Renzo
Ok, agora vejo que a pergunta foi alterada, atualizei minha resposta.
Renzo
0

k, 29 bytes

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

Experimente online! 1é verdade, 0é falsey. Entrada é [A;N;X,Y].

zgrep
fonte
Eu executei em todos os exemplos que vi. 1 é verdade, 0 é falsey.
Zgrep
@Gryphon Mudei a entrada para o rodapé em vez do corpo, mas não tenho certeza do que você quer que eu mude. Ambos são e foram a mesma função.
Zgrep
Oh, eu vejo agora. Eu pensei que você não estava recebendo nenhuma entrada, mas você estava recebendo no código. Faz muito mais sentido agora. Eu não sei k, então eu assumi que tinha missinterpreted a questão, como tudo o que iria fazer era saída 1 0 1 1
Gryphon
0

PHP> = 7,1, 103 bytes

for([,$n,$d,$s,$e]=$argv,$f=[$s,$e];$x<$n;)$x=$f[]=array_sum(array_slice($f,-$d));echo+in_array($n,$f);

Casos de teste

Jörg Hülsermann
fonte
0

Mathematica, 94 bytes

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


Formato de entrada

[A, N, X, Y]

J42161217
fonte