Chuỗi năng lượng xen kẽ


24

Định nghĩa

Chuỗi Fibre Power thay thế được hình thành như sau.

  1. Bắt đầu với chuỗi trống và đặt n thành 1 .

  2. Tính f n , số Fibonacci không âm thứ n , với các lần lặp lại. 0 là thứ nhất, 1 là thứ hai và thứ ba, 2 là thứ tư. Tất cả những số khác có được bằng cách tính tổng hai số trước đó trong chuỗi, vì vậy 3 = 1 + 2 là số thứ năm, 5 = 2 + 3 là số thứ sáu, v.v.

  3. Nếu n là số lẻ, thay đổi dấu của f n .

  4. Nối 2 n-1 bản sao của f n vào chuỗi.

  5. Tăng n và quay lại bước 2.

Đây là một trăm điều khoản đầu tiên của chuỗi APF.

 0  1  1 -1 -1 -1 -1  2  2  2  2  2  2  2  2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
 5  5  5  5  5  5  5  5  5  5  5  5  5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8

Bài tập

Viết chương trình đầy đủ hoặc hàm lấy số nguyên dương n làm đầu vào và in hoặc trả về số hạng thứ n của chuỗi APF.

Nếu bạn thích lập chỉ mục dựa trên 0, bạn có thể lấy số nguyên n không âm và in hoặc trả về số APF ở chỉ số n .

Đây là ; có thể mã ngắn nhất trong byte giành chiến thắng!

Các trường hợp thử nghiệm (dựa trên 1)

    1 ->    0
    2 ->    1
    3 ->    1
    4 ->   -1
    7 ->   -1
    8 ->    2
  100 ->   -8
  250 ->   13
  500 ->  -21
 1000 ->   34
11111 ->  233
22222 -> -377
33333 ->  610

Các trường hợp thử nghiệm (dựa trên 0)

    0 ->    0
    1 ->    1
    2 ->    1
    3 ->   -1
    6 ->   -1
    7 ->    2
   99 ->   -8
  249 ->   13
  499 ->  -21
  999 ->   34
11110 ->  233
22221 -> -377
33332 ->  610

Có bất kỳ ràng buộc cho n ?
Okx

2
Miễn là thuật toán của bạn hoạt động với các giá trị lớn tùy ý của n , bạn có thể giả sử rằng nó phù hợp với kiểu dữ liệu của bạn.
Dennis

1
Cái này có số OEIS không?
Mindwin

@Mindwin Không.
Dennis

Câu trả lời:


12

Thạch , 5 byte

BLCÆḞ

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

Làm sao?

Mở rộng chuỗi Fibonacci trở lại thành các chỉ mục tiêu cực sao cho mối quan hệ f(i) = f(i-2) + f(i-1)vẫn giữ:

  i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ...

Quay trở lại từ i=0những con số là những con số chúng ta cần lặp lại 2 n-1 lần và tích hợp Fibonacci của Jelly ÆḞ, sẽ tính toán những con số này.

Chúng ta có thể tìm thấy -i(một số dương) mà chúng ta cần bằng cách lấy độ dài bit nvà trừ đi 1.

Vì chúng tôi muốn i(một số âm) thay vào đó chúng tôi có thể thực hiện 1-bitLengthvà Jelly có một nguyên tử cho 1-x, Cđơn vị bổ sung.

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21

Tôi biết có một cách ngắn hơn nhưng không phải do mà nhiều, nghĩ rằng nó muốn được 7 byte với một cách để loại bỏ µ
dặm

Việc phủ định lặp đi lặp lại của bạn rất thông minh, tôi đã xem xét sức mạnh của âm trừ một, thêm một vài byte, cho đến khi tôi nhớ lại các giá trị Fibonacci âm và thử cắm chúng vào đơn nguyên của Jelly.
Jonathan Allan

4
Thành thật mà nói, tôi rất ngạc nhiên khi Jelly không tích hợp sẵn một byte để có được độ dài nhị phân của một số ...
Sản phẩm ETH

22

Python 2 , 30 byte

f=lambda n:n<1or f(n/4)-f(n/2)

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

Một chỉ mục.

Chuỗi cảm giác giống như một câu đố, một cái gì đó mà Dennis tạo ra bằng cách có một cách ngắn để thể hiện nó. Sự lặp lại sức mạnh của hai lần gợi ý đệ quy bằng cách dịch chuyển bit (chia sàn cho 2). Phép đệ quy Fibonacci ký hiệu xen kẽ f(n)=f(n-2)-f(n-1)có thể được điều chỉnh theo bithift thay cho giảm dần. Các trường hợp cơ sở hoạt động độc đáo bởi vì tất cả mọi thứ kênh n=0.


6

Toán học, 43 36 24 byte

Fibonacci@-Floor@Log2@#&

7 byte được lưu nhờ vào @GregMartin và thêm 12 byte nhờ @JungHwanMin.


1
Bạn có thể lưu một vài byte bằng Floor@Log2@#và bằng cách viết Fibonacci[t=...](và bằng cách xóa khoảng trắng trong số mũ cuối cùng).
Greg Martin

1
-12 byte: Fibonacci@-Floor@Log2@#&- Fibonaccicũng có thể nhận các đối số phủ định (chăm sóc dấu hiệu cho bạn).
JungHwan Min

5

MATL , 19 17 16 11 byte

lOiB"yy-]x&

Đầu vào là 1 dựa.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Đối với đầu vào n dựa trên 1 , gọi m là số chữ số trong khai triển nhị phân của n . Các n hạn -thứ trong chuỗi đầu ra là m -thứ hạn trong dãy Fibonacci, có thể với dấu hiệu của nó thay đổi.

Một ý tưởng sẽ là lặp đi lặp lại m lần để tính các thuật ngữ của chuỗi Fibonacci. Điều này là dễ dàng với một for eachvòng lặp sử dụng mảng các chữ số nhị phân. Nếu chuỗi Fibonacci được bắt đầu bằng 0 , sau đó 1 như bình thường, việc lặp lại m lần sẽ dẫn đến các điều khoản m + 2 trên ngăn xếp, do đó hai số trên cùng sẽ phải bị xóa. Thay vào đó, chúng tôi bắt đầu với 1 , sau đó 0 . Bằng cách đó, các thuật ngữ được tạo tiếp theo là 1 , 1 , 2 , ... và chỉ cần xóa một lần .

Dấu hiệu có thể được xử lý bằng cách sử dụng một vòng lặp khác để thay đổi dấu hiệu m lần. Nhưng đó là tốn kém. Tốt hơn là tích hợp hai vòng lặp, điều này được thực hiện đơn giản bằng cách trừ thay vì thêm vào phép lặp Fibonacci.

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack



3

Thạch , 9 byte

BLµ’ÆḞN⁸¡

Sử dụng lập chỉ mục một dựa trên.

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

Giải trình

Phương pháp này hoạt động nếu hàm Fibonacci của bạn chỉ hỗ trợ các đối số không âm.

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1)

3

Japt , 6 byte

Mg1-¢l

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

Như đã đề cập trong các câu trả lời khác, thuật ngữ thứ n trong chuỗi Fibonacci ký hiệu xen kẽ giống như thuật ngữ thứ n trong chuỗi thông thường. n có thể được tìm thấy bằng cách lấy độ dài bit của đầu vào và trừ đi một; phủ nhận kết quả này trong 1 trừ đi độ dài bit.

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index.

3

05AB1E , 11 10 byte

Sử dụng lập chỉ mục dựa trên 1

Hàm Fibonacci của 05AB1E trả về số sợi dương nhỏ hơn n , nghĩa là chúng ta phải tạo nhiều hơn mức cần thiết, lấy số chính xác theo chỉ số và sau đó tính toán dấu. Vì vậy, tôi nghi ngờ bất kỳ phương pháp nào dựa trên đó sẽ ngắn hơn so với việc tính toán các số lặp.

Sử dụng nhận thức rằng chúng ta có thể khởi tạo ngăn xếp với 1, 0đảo ngược để xử lý trường hợp khi n=1được mô tả trong câu trả lời MATL của Luis Mendo .

XÎbgG‚D«`-

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

Giải trình

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements

2

Perl 6 , 53 byte

{flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]}

Thực hiện đơn giản trình tự, cách nó được mô tả.
Không dựa trên.


2

Julia 0,5 , 19 byte

!n=n<1||!(n/=4)-!2n

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

Làm thế nào nó hoạt động

Điều này sử dụng cùng một công thức như câu trả lời Python của @ xnor . Mối quan hệ lặp lại
g (n) = g (n-2) + g (n-1) tạo ra các số hạng âm của chuỗi Fibonacci, bằng với các số hạng dương với các dấu hiệu xen kẽ. Từ bất cứ nơi nào trong một lần chạy 2 k lặp lại cùng một số, chúng ta có thể chọn bất kỳ sự lặp lại nào của lần chạy trước đó là 2 số k-1 và chạy 2 số 2 k trước 2 số đó bằng cách chia chỉ số cho 24 .

Thay vì đơn giản

f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes

chúng ta có thể định nghĩa lại một nhà điều hành cho các mục đích của chúng tôi. Ngoài ra, f sẽ hoạt động tốt như phao, vì vậy chúng tôi nhận được

!n=n<1||!(n/4)-!(n/2)   # 21 bytes

Cuối cùng, nếu chúng ta cập nhật n với số chia cho 4 , chúng ta có thể viết n / 22n và bỏ qua một cặp parens, dẫn đến định nghĩa hàm 19 byte trong câu trả lời này.


1

J , 18 byte

(%>:-*:)t.@<:@#@#:

Sử dụng lập chỉ mục một dựa trên. Lấy một số nguyên đầu vào n > 0 và tính toán floor(log2(n))bằng cách tìm độ dài của biểu diễn nhị phân của nó và sau đó giảm giá trị đó bằng một. Sau đó, nó tìm thấy hệ số floor(log2(n))-1thứ của hàm tạo x / (1 + x - x 2 ) là gf cho các giá trị Fibonacci được lập chỉ mục âm.

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

Giải trình

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value
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.