Tôi có phải là số N-bonacci đặc biệt không?


11

Chuỗi N-bonacci, ban đầu được phát minh bởi @DJMcMayhem trong câu hỏi này , là một chuỗi được tạo bằng cách bắt đầu với các số nguyên 0 và 1, sau đó thêm các số N trước đó để tạo số tiếp theo. Chuỗi N-bonacci đặc biệt là chuỗi N-bonacci bắt đầu bằng một cặp số khác 0 và 1, sẽ được đặt tên là X và Y. Nếu N lớn hơn số lượng thuật ngữ đã có trong chuỗi, chỉ cần thêm tất cả có sẵn điều kiện.

Vì vậy, ví dụ chuỗi Wikipedia bình thường có N là 2 (lấy hai mục trước) và X và Y là 0 và 1, hoặc 1 và 1, tùy thuộc vào người bạn hỏi.

Nhiệm vụ của bạn:

Bạn phải viết một chương trình hoặc hàm để kiểm tra xem một số nguyên được nhập (A) có phải là một phần của chuỗi N-bonacci đặc biệt được tạo bởi ba số nguyên tiếp theo không (sử dụng đầu vào thứ hai là N, và thứ ba và thứ tư là X và Y) . Đảm bảo rằng bạn xử lý trường hợp đặc biệt của N = 1.

Đầu vào:

Bốn số nguyên không âm, A, N, X và Y.

Đầu ra:

Giá trị trung thực / giả mạo cho biết liệu A có phải là một phần của chuỗi N-bonacci được tạo bởi các đầu vào N, X và Y hay không.

Các trường hợp thử nghiệm:

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.  

Ghi điểm:

Đây là , vì vậy điểm số thấp nhất tính bằng byte sẽ thắng.


1
N==1là một trường hợp kỳ lạ
Bạch tuộc ma thuật Urn

Đúng, nhưng trường hợp kỳ lạ là những gì làm cho điều này vui vẻ :)
Gryphon

Nếu bạn thực sự muốn câu trả lời để xử lý vụ việc N=1, bạn có thể muốn gọi nó ra trong câu hỏi, vì nhiều câu trả lời (bao gồm tất cả các câu trả lời hiện tại, tôi nghĩ) sẽ có một điều kiện thất bại giả định rằng một chuỗi tăng nghiêm ngặt. Ngoài ra, có thể XYtiêu cực? Điều đó có thể cũng sẽ làm mất hiệu lực tất cả các câu trả lời hiện có.
apsillers

1
Tôi nghĩ rằng tất cả các câu trả lời hiện tại không thể xử lý trường hợp không tăng trong đó cả X và Y đều bằng không. Có cần thiết phải xử lý trường hợp đó là tốt?
apsillers

1
Tôi nghĩ bạn nên thêm các trường hợp trung thực 8,1,8,99,1,8,9để đảm bảo rằng N=1việc xử lý trường hợp phát hiện Xgiá trị không lặp lại cũng như Ygiá trị. (Nếu bạn muốn xử lý 0,0các trường hợp, bạn cũng nên thêm vào đó.)
apsillers

Câu trả lời:


5

Thạch , 12 byte

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

Một chương trình lấy đầy đủ [X,Y], N, A.

Hãy thử trực tuyến!

Làm sao?

ḣ⁴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?

Thông minh. Dường như để làm việc cho tôi, dù sao. +1
Gryphon

Thay vào đó, để xem chuỗi N-bonacci bị đảo ngược lên đến giá trị lớn hơn hoặc bằng A, chỉ cần loại bỏ ⁵etừ cuối; Sau đó, dễ dàng hơn để nói rằng nó sẽ hoạt động (lưu ý rằng thứ tự của hai điều khoản đầu tiên là không có kết quả).
Jonathan Allan

Đã thử một loạt các trường hợp thử nghiệm, vì vậy trừ khi ai đó tìm thấy nó không thành công, điều đó tốt với tôi.
Gryphon

5

05AB1E , 18 byte

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

Hãy thử trực tuyến!


Sử dụng: [X,Y], N, A


Tôi cảm thấy như một số chức năng ngoài ý muốn làm cho nó khó hơn mức cần thiết.

Không có gì lớn hơn hoặc bằng, không bao giờ nhận thấy điều đó trước đây.

không hoạt động, và yêu cầu a ], cho +1 byte #]³.



3

Perl 6 , 47 byte

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

kiểm tra nó

Mở rộng:

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

R , 69 60 byte

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

Hãy thử trực tuyến!

Trả về một hàm ẩn danh, lấy a,nvà một vectơ l=c(y,x). Xây dựng chuỗi N-bonacci ngược (nghĩa là chỉ số nhỏ hơn nằm trong chuỗi), vì while(l<a)chỉ kiểm tra phần tử đầu tiên của l.


1

Lisp thông thường, 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))))))))

Hàm này trả về NILfalse, không phải NIL cho true (theo định nghĩa boolean tổng quát của 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))))))))

Bạn có xử lý trường hợp đặc biệt để N=1phát hiện một A, ví dụ, cả 1và và 2khi X=1 Y=2nào? Kỹ năng đọc Lisp của tôi không tốt lắm, nhưng có vẻ như bạn chỉ có thể so sánh Avới một trong hai giá trị ban đầu.
apsillers

@apsillers, khi N = 1 tôi chỉ so sánh A với X và không so với Y. tôi có nên so sánh nó với cả hai trả về true nếu nó bằng một trong số chúng không? Có lẽ trình tự không được xác định rõ cho trường hợp này?
Renzo

Ok, bây giờ tôi thấy câu hỏi đã được thay đổi, tôi đã cập nhật câu trả lời của mình.
Renzo

0

k, 29 byte

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

Hãy thử trực tuyến! 1là sự thật, 0là chim ưng. Đầu vào là [A;N;X,Y].


Tôi chạy nó trên tất cả các ví dụ mà tôi thấy. 1 là sự thật, 0 là falsey.
zgrep

@Gryphon Tôi đã chuyển đầu vào sang chân trang thay vì phần thân, nhưng tôi không chắc bạn muốn tôi thay đổi điều gì. Nó là cả hai và là cùng một chức năng.
zgrep

Ồ, tôi hiểu rồi. Tôi nghĩ rằng bạn không lấy bất kỳ đầu vào nào, nhưng bạn đã lấy nó trong mã. Làm cho nhiều ý nghĩa hơn bây giờ. Tôi không biết k, vì vậy tôi cho rằng bạn đã hiểu sai câu hỏi, vì tất cả những gì nó sẽ làm là đầu ra 1 0 1 1
Gryphon


0

Toán học, 94 byte

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


định dạng đầu vào

[A, N, X, Y]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.