Apakah saya Nomor N-bonacci Khusus?

11

Urutan N-bonacci, awalnya ditemukan oleh @DJMcMayhem dalam pertanyaan ini , adalah urutan yang dihasilkan dengan memulai dengan bilangan bulat 0 dan 1, dan kemudian menambahkan angka N sebelumnya untuk menghasilkan angka berikutnya. Urutan N-bonacci khusus adalah urutan N-bonacci yang dimulai dengan pasangan angka selain 0 dan 1, yang akan dinamai X dan Y. Jika N lebih besar dari jumlah istilah yang sudah ada dalam urutan, cukup tambahkan semua yang tersedia ketentuan

Jadi misalnya deret fibonacci normal memiliki N of 2 (mengambil dua item sebelumnya), dan X dan Y dari 0 dan 1, atau 1 dan 1, tergantung pada siapa Anda bertanya.

Tugas Anda:

Anda harus menulis sebuah program atau fungsi yang memeriksa apakah integer yang dimasukkan (A) adalah bagian dari urutan N-bonacci khusus yang dihasilkan oleh tiga bilangan bulat berikutnya (menggunakan input kedua sebagai N, dan yang ketiga dan keempat sebagai X dan Y) . Pastikan Anda menangani kasus khusus N = 1.

Memasukkan:

Empat bilangan bulat non-negatif, A, N, X, dan Y.

Keluaran:

Nilai kebenaran / kepalsuan yang menunjukkan apakah A adalah bagian dari urutan N-bonacci yang dihasilkan oleh input N, X, dan Y.

Kasus uji:

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.  

Mencetak:

Ini adalah , sehingga skor terendah dalam byte menang.

Gryphon
sumber
1
N==1adalah kasus yang aneh.
Magic Gurita Guci
Yap, tetapi kasus-kasus aneh adalah yang membuat ini menyenangkan :)
Gryphon
Jika Anda memang ingin jawaban untuk menangani kasus ini N=1, Anda mungkin ingin menyebutkannya dalam pertanyaan, karena banyak jawaban (termasuk semua jawaban saat ini, saya pikir) akan memiliki kondisi kegagalan yang mengasumsikan serangkaian peningkatan yang ketat. Juga, bisakah Xdan Ymenjadi negatif? Itu mungkin juga akan membatalkan semua jawaban yang ada.
apsillers
1
Saya pikir semua jawaban yang ada gagal menangani kasus yang tidak meningkat di mana X dan Y adalah nol. Apakah perlu untuk menangani kasus itu juga?
apsillers
1
Saya pikir Anda harus menambahkan kasus kebenaran 8,1,8,9dan 9,1,8,9untuk memastikan bahwa N=1penanganan kasus mendeteksi nilai yang tidak berulang Xserta Ynilainya. (Jika Anda ingin menangani 0,0kasus, Anda harus menambahkannya juga.)
apsillers

Jawaban:

5

Jelly , 12 byte

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

Sebuah program taking penuh [X,Y], N, A.

Cobalah online!

Bagaimana?

ḣ⁴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
sumber
Luar biasa. Tampaknya bekerja untuk saya. +1
Gryphon
Untuk melihat urutan N-bonacci yang terbalik hingga nilai yang lebih besar atau sama dengan A, hapus saja ⁵edari bagian akhir; lebih mudah untuk mengatakan itu akan berhasil saat itu (mencatat bahwa urutan dua istilah pertama tidak ada konsekuensinya).
Jonathan Allan
Mencoba beberapa kasus uji, jadi kecuali seseorang menemukan itu gagal, ada baiknya dengan saya.
Gryphon
5

05AB1E , 18 byte

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

Cobalah online!


Penggunaan: [X,Y], N, A


Saya merasa beberapa fungsi yang tidak disengaja membuat itu lebih sulit daripada yang seharusnya.

Tidak ada yang lebih besar daripada sama dengan, tidak pernah memperhatikan itu sebelumnya.

Dan tidak berfungsi, dan membutuhkan ], untuk +1 byte #]³.

Guci Gurita Ajaib
sumber
4

Python 2 , 59 56 byte

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

Cobalah online!

Mengambil input sebagai A,N,[X,Y]

ovs
sumber
Ini adalah pembungkus untuk semua test case jika Anda suka.
Leaky Nun
Berikut adalah 2 byte golf.
Leaky Nun
3

Perl 6 , 47 byte

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

menguji

Diperluas:

->
  \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
sumber
2

Python 2, 50 byte

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

Mengambil input sebagai A,N,[Y,X]. Keluaran melalui kode keluar.

Cobalah online!

Lynn
sumber
1

R , 69 60 byte

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

Cobalah online!

Mengembalikan fungsi anonim, mengambil a,ndan vektor l=c(y,x). Membangun urutan N-bonacci ke belakang (yaitu, indeks yang lebih kecil lebih lanjut dalam urutan), karena while(l<a)hanya memeriksa elemen pertama l.

Giuseppe
sumber
1

Gangguan Umum, 164 byte

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

Fungsi ini mengembalikan NILfalse, non-NIL untuk true (sesuai dengan definisi boolean umum dari 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
sumber
Apakah Anda menangani kasus khusus untuk N=1mendeteksi A, misalnya, keduanya 1dan / atau 2kapan X=1 Y=2? Keterampilan membaca Lisp saya tidak bagus, tetapi sepertinya Anda hanya dapat membandingkan Adengan salah satu dari dua nilai awal.
apsillers
@apsillers, ketika N = 1 saya membandingkan A hanya dengan X dan tidak dengan Y. haruskah saya membandingkannya dengan keduanya kembali benar jika sama dengan salah satunya? Mungkin urutannya tidak didefinisikan dengan baik untuk kasus ini?
Renzo
Ok, sekarang saya melihat pertanyaan telah diubah, saya telah memperbarui jawaban saya.
Renzo
0

k, 29 byte

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

Cobalah online! 1adalah kebenaran, 0adalah dusta. Masukan adalah [A;N;X,Y].

zgrep
sumber
Saya menggunakan semua contoh yang saya lihat. 1 benar, 0 adalah palsu.
zgrep
@Gryphon Saya memindahkan input ke footer alih-alih tubuh, tapi saya tidak yakin apa yang Anda ingin saya ubah. Keduanya adalah dan memiliki fungsi yang sama.
zgrep
Oh, saya mengerti sekarang. Saya pikir Anda tidak mengambil input apa pun, tetapi Anda mengambilnya dalam kode. Lebih masuk akal sekarang. Saya tidak tahu k, jadi saya berasumsi bahwa Anda salah menafsirkan pertanyaan, karena yang akan dilakukan hanyalah output 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);

Testcases

Jörg Hülsermann
sumber
0

Mathematica, 94 byte

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


Masukkan format

[A, N, X, Y]

J42161217
sumber