Power Fibonacci Sequence สำรอง


24

คำนิยาม

ลำดับ Fibonacci Power Alternating จะเกิดขึ้นดังนี้

  1. เริ่มต้นด้วยลำดับที่ว่างเปล่าและชุดnไป1

  2. Compute nที่n THไม่ใช่เชิงลบจำนวนฟีโบนักชีกับการเกิดซ้ำ
    0คืออันแรก1คืออันที่สองและที่สาม2คือที่สี่ อื่น ๆ ทั้งหมดได้มาจากการรวมตัวเลขสองตัวก่อนหน้านี้ในลำดับดังนั้น3 = 1 + 2คือห้า, 5 = 2 + 3คือหก, เป็นต้น

  3. ถ้าnเป็นเลขคี่เปลี่ยนสัญลักษณ์ของ n

  4. ผนวก2 n-1สำเนาของf nตามลำดับ

  5. เพิ่มค่าnแล้วย้อนกลับไปยังขั้นตอนที่ 2

เหล่านี้เป็นหนึ่งร้อยคำแรกของลำดับ 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

งาน

เขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่ใช้เป็นจำนวนเต็มบวกnเป็น input และพิมพ์หรือส่งกลับn THระยะของลำดับอำพลฟูดส์

หากคุณต้องการจัดทำดัชนี 0 ตามที่คุณสามารถเลือกใช้เป็นจำนวนเต็มไม่เป็นลบnและพิมพ์หรือส่งคืนจำนวน APF ที่ดัชนี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

กรณีทดสอบ (ตาม 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

มีข้อ จำกัด ใด ๆ สำหรับnหรือไม่?
Okx

2
ตราบใดที่อัลกอริธึมของคุณใช้กับค่าที่มีขนาดใหญ่โดยพลการของnคุณสามารถสันนิษฐานได้ว่ามันเหมาะกับประเภทข้อมูล
Dennis

1
สิ่งนี้มีหมายเลข OEIS หรือไม่
Mindwin

@Mindwin มันไม่ได้
เดนนิส

คำตอบ:


12

เยลลี่ 5 ไบต์

BLCÆḞ

ลองออนไลน์!

อย่างไร?

การขยายซีรี่ส์ Fibonacci กลับไปเป็นดัชนีเชิงลบเพื่อให้ความสัมพันธ์f(i) = f(i-2) + f(i-1)ยังคงอยู่:

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

การย้อนกลับจากi=0ตัวเลขคือสิ่งที่เราต้องทำซ้ำ2 n-1ครั้งและฟิโบนัชชีในตัวของเยลลี่ÆḞจะคำนวณสิ่งเหล่านี้

เราสามารถหา-i(จำนวนบวก) ที่เราต้องการโดยการบิตความยาวของและลบn1

เนื่องจากเราต้องการi(จำนวนลบ) เราสามารถทำแทนได้1-bitLengthและเจลลี่มีอะตอมสำหรับ1-x, Cmonad เสริม

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

ฉันรู้ว่ามีวิธีที่สั้นกว่า แต่ไม่มากขนาดนั้นคิดว่าน่าจะเป็น 7 ไบต์ด้วยวิธีลบµและ
ไมล์

การปฏิเสธซ้ำของคุณนั้นฉลาดแม้ว่าฉันกำลังดูพลังของลบหนึ่งซึ่งเพิ่มสองสามไบต์จนกว่าฉันจะจำเกี่ยวกับค่าฟีโบนักชีเชิงลบและลองเสียบเข้ากับ Monad ของเยลลี่
Jonathan Allan

4
สุจริตฉันประหลาดใจ Jelly ไม่มี one-byte builtin เพื่อให้ได้ความยาวไบนารีของตัวเลข ...
ETHproductions

22

Python 2 , 30 ไบต์

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

ลองออนไลน์!

หนึ่งในการจัดทำดัชนี

ลำดับรู้สึกเหมือนตัวต่อเป็นสิ่งที่เดนนิสสร้างขึ้นโดยมีวิธีสั้น ๆ ในการแสดงออก การทำซ้ำแบบ power-of-two แนะนำให้ทำการเรียกซ้ำโดยการเลื่อนบิต (การหารพื้นด้วย 2) Fibonacci recursion แบบสลับ - ลงชื่อf(n)=f(n-2)-f(n-1)สามารถปรับให้เข้ากับบิตชิฟต์แทนที่การลดลง กรณีฐานทำงานออกมาได้ดีเพราะทุกอย่างจะเข้าn=0กัน


6

Mathematica, 43 36 24 bytes

Fibonacci@-Floor@Log2@#&

บันทึก 7 ไบต์ด้วย @GregMartin และอีก 12 ขอบคุณ @JungHwanMin


1
คุณสามารถบันทึกสองสามไบต์ด้วยFloor@Log2@#และโดยการเขียนFibonacci[t=...](และโดยการลบช่องว่างในเลขชี้กำลังสุดท้าย)
เกร็กมาร์ติ

1
-12 ไบต์: Fibonacci@-Floor@Log2@#&- Fibonacciสามารถใช้อาร์กิวเมนต์เป็นลบได้เช่นกัน (ดูแลเครื่องหมายสำหรับคุณ)
JungHwan Min

5

MATL , 19 17 16 11 ไบต์

lOiB"yy-]x&

อินพุตเป็นแบบอิง 1

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

1 ตามอินพุตnขอเป็นจำนวนตัวเลขในการขยายตัวของฐานn คำที่n- th ในลำดับเอาต์พุตคือคำm- th ในลำดับ Fibonacci ซึ่งอาจมีการเปลี่ยนแปลงเครื่องหมาย

ความคิดหนึ่งจะย้ำmครั้งเพื่อคำนวณเงื่อนไขของลำดับฟีโบนักชี นี่เป็นเรื่องง่ายด้วยการfor eachวนซ้ำโดยใช้อาร์เรย์ของเลขฐานสอง หากลำดับ Fibonacci เริ่มต้นด้วย0แล้ว1ตามปกติการวนซ้ำmจะส่งผลให้เกิดเงื่อนไขm + 2บนสแต็กดังนั้นตัวเลขสองอันดับแรกจะต้องถูกลบออก แต่เรา initiallize กับ1แล้ว0 วิธีดังกล่าวข้อกำหนดที่สร้างขึ้นถัดไปคือ1 , 1 , 2 , ... และจำเป็นต้องลบเพียงหนึ่งครั้ง

สามารถจัดการสัญญาณโดยใช้การวนซ้ำอื่นเพื่อเปลี่ยนเครื่องหมายmครั้ง แต่นั่นแพงมาก มันเป็นการดีกว่าที่จะรวมสองลูปซึ่งทำได้ง่าย ๆ โดยการลบแทนการเพิ่มในการทำซ้ำฟีโบนักชี

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

เยลลี่ขนาด 9 ไบต์

BLµ’ÆḞN⁸¡

ใช้การจัดทำดัชนีแบบอิงฐานเดียว

ลองออนไลน์!

คำอธิบาย

วิธีนี้ใช้ได้ถ้าฟังก์ชัน Fibonacci ของคุณรองรับอาร์กิวเมนต์ที่ไม่เป็นลบเท่านั้น

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

Japtap , 6 ไบต์

Mg1-¢l

ทดสอบออนไลน์!

มันทำงานอย่างไร

ตามที่ระบุไว้ในคำตอบอื่น ๆn THในระยะสลับเข้าสู่ระบบ Fibonacci series เป็นเช่นเดียวกับ-n THระยะในชุดปกติ nสามารถพบได้โดยการบิตความยาวของการป้อนข้อมูลและลบหนึ่ง ลบล้างผลลัพธ์นี้ใน 1 ลบความยาวบิต

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 ไบต์

ใช้การจัดทำดัชนีแบบอิง 1

ฟังก์ชั่น Fibonacci ของ05AB1Eคืนค่าจำนวนจุดบวกที่น้อยกว่าnซึ่งหมายความว่าเราจำเป็นต้องสร้างมากกว่าที่จำเป็นรับค่าที่ถูกต้องโดยดัชนีแล้วคำนวณเครื่องหมาย ดังนั้นฉันสงสัยว่าวิธีใดก็ตามที่มีพื้นฐานนั้นจะสั้นกว่าการคำนวณตัวเลขซ้ำ ๆ

ใช้ตระหนักว่าเราสามารถเริ่มต้นสแต็คที่มี1, 0การกลับรายการที่จะจัดการกับกรณีที่n=1ได้อธิบายไว้ในคำตอบ MATL หลุยส์ Mendo ของ

XÎbgG‚D«`-

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

การดำเนินการตามลำดับอย่างตรงไปตรงมาตามที่อธิบายไว้
Zero-based


2

Julia 0.5 , 19 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

นี้ใช้สูตรเดียวกับ@ XNOR คำตอบของงูหลาม ความสัมพันธ์ที่เกิดซ้ำ
g (n) = g (n-2) + g (n-1)สร้างเงื่อนไขเชิงลบของลำดับฟีโบนักชีซึ่งเท่ากับคำบวกกับสัญญาณสลับกัน จากที่ใดก็ได้ในการวิ่งซ้ำ2 kของหมายเลขเดียวกันเราสามารถเลือกการซ้ำของการวิ่งก่อนหน้าของ2 k-1หมายเลขใด ๆ และการวิ่งของ2 k-2หมายเลขก่อนหน้านั้นโดยหารดัชนีด้วย2และ4 4

แทนที่จะเป็นคนตรงไปตรงมา

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

เราสามารถกำหนดผู้ประกอบการใหม่เพื่อวัตถุประสงค์ของเรา นอกจากนี้fจะทำงานได้ดีเหมือนกับลอยดังนั้นเราจึงได้

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

สุดท้ายถ้าเราอัพเดทnด้วยการหารด้วย4เราจะสามารถเขียนn / 2เป็น2nและละเว้น parens คู่หนึ่งซึ่งนำไปสู่การนิยามฟังก์ชัน 19 ไบต์ในคำตอบนี้


1

J , 18 ไบต์

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

ใช้การจัดทำดัชนีแบบอิงฐานเดียว รับค่าอินพุทจำนวนเต็มn > 0 และคำนวณfloor(log2(n))โดยค้นหาความยาวของการแทนฐานสองของมันแล้วลดค่านั้นลงทีละหนึ่ง จากนั้นหาค่าสัมประสิทธิ์floor(log2(n))-1thของฟังก์ชันสร้างx / (1 + x - x 2 ) ซึ่งเป็น gf สำหรับค่าฟีโบนักชีเชิงลบ

ลองออนไลน์!

คำอธิบาย

(%>:-*:)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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.