Я специальный номер N-Bonacci?

11

Последовательность N-Боначи, изначально изобретенная @DJMcMayhem в этом вопросе , представляет собой последовательность, генерируемую, начиная с целых чисел 0 и 1, а затем добавляя предыдущие N чисел, чтобы сгенерировать следующее число. Специальная последовательность N-Боначи - это последовательность N-Боначи, начинающаяся с пары чисел, отличных от 0 и 1, которые будут называться 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-bonacci, генерируемой входами N, X и Y.

Тестовые случаи:

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это такой странный случай.
Волшебная урна осьминога
Да, но странные случаи - то, что делает это забавным :)
Gryphon
Если вы действительно хотите, чтобы ответы обрабатывали случай N=1, вы можете указать его в вопросе, поскольку многие ответы (включая все текущие ответы, я думаю) будут иметь состояние отказа, которое предполагает строго возрастающую последовательность. Кроме того, может Xи Yбыть отрицательным? Это, вероятно, также сделает недействительными все существующие ответы.
Апсиллеры
1
Я думаю, что все существующие ответы не справляются с невозрастающим случаем, когда X и Y равны нулю. Обязательно ли заниматься этим делом?
Апсиллеры
1
Я думаю, что вы должны добавить правдивые случаи 8,1,8,9и 9,1,8,9убедиться, что N=1обработка случаев обнаруживает неповторяющееся Xзначение, а также Yзначение. (Если вы хотите разобраться со 0,0случаями, вы должны добавить это также.)
apsillers

Ответы:

5

Желе , 12 байт

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

Полная программа взятия [X,Y], N, A.

Попробуйте онлайн!

Как?

ḣ⁴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
Грифон
Вместо этого, чтобы увидеть обратную последовательность N-Боначи до значения, большего или равного А, просто удалите ⁵eс конца; тогда гораздо проще сказать, что это сработает (учитывая, что порядок первых двух слагаемых не имеет значения).
Джонатан Аллан
Перепробовал кучу тестов, так что если кто-то не найдет один, он провалится, это хорошо для меня.
Грифон
5

05AB1E , 18 байт

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

Попробуйте онлайн!


Область применения: [X,Y], N, A


Я чувствую, что некоторые непреднамеренные функции сделали это сложнее, чем нужно.

Там нет больше, чем или равно, никогда не замечал этого раньше.

И не работал, и потребовал ], для +1 байт #]³.

Урна волшебного осьминога
источник
4

Python 2 , 59 56 байт

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

Попробуйте онлайн!

Принимает вход как A,N,[X,Y]

овс
источник
Вот обертка для всех тестовых случаев, если вам это нравится.
Утренняя монахиня
Вот 2 байта в гольфе.
Утренняя монахиня
3

Perl 6 , 47 байт

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

Попробуй это

Expanded:

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

    )
}
Брэд Гилберт b2gills
источник
1

R , 69 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). Создает последовательность N-Боначи в обратном направлении (т. Е. Меньший индекс далее в последовательности), поскольку while(l<a)проверяется только первый элемент l.

Giuseppe
источник
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))))))))

Эта функция возвращает 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))))))))
Renzo
источник
Есть ли у вас особый случай обработки для N=1обнаружения A, например, обоих 1и / или 2когда X=1 Y=2? Мои навыки чтения лисписа невелики, но, похоже, вы можете сравнить только Aодно из двух начальных значений.
Апсиллеры
@apsillers, когда N = 1, я сравниваю A только с X, а не с Y. Должен ли я сравнить его с обоими, возвращающими true, если он равен одному из них? Может быть, последовательность не очень хорошо определена для этого случая?
Ренцо
Хорошо, теперь я вижу, что вопрос был изменен, я обновил свой ответ.
Ренцо
0

к, 29 байт

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

Попробуйте онлайн! 1это правда, 0это ложь. Вход есть [A;N;X,Y].

zgrep
источник
Я запускал его на всех примерах, которые видел. 1 правдиво, 0 фальшиво.
zgrep
@Gryphon Я переместил ввод в нижний колонтитул, а не в тело, но я не уверен, что вы хотите, чтобы я изменил. Это и есть, и была одна и та же функция.
zgrep
О, теперь я вижу. Я думал, что вы не брали никакой информации, но вы брали ее в коде. Имеет гораздо больше смысла сейчас. Я не знаю k, поэтому я предположил, что вы неправильно поняли вопрос, так как все, что он должен был сделать, это вывести 1 0 1 1
Gryphon
0

PHP> = 7.1, 103 байта

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

Testcases

Йорг Хюльсерманн
источник
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]

J42161217
источник