Fibonacci สลับ


17

ในการสลับลำดับฟีโบนักชีคุณเริ่มต้นด้วย1และ1ตามปกติ

อย่างไรก็ตามแทนที่จะเพิ่มค่าสองค่าล่าสุดเสมอเพื่อให้ได้หมายเลขถัดไปคุณสามารถเลือกเริ่มต้นด้วยการเพิ่มและทุกครั้งที่คุณลบแทน

ลำดับเริ่มต้นดังนี้:

1
1
2    # 1 + 1
-1   # 1 - 2
1    # 2 + -1
-2   # -1 - 1
-1   # 1 + -2
-1   # -2 - -1
-2   # -1 + -1
1    # -1 - -2
-1   # -2 + 1
2    # 1 - -1
1    # -1 + 2
1    # 2 - 1

เป็นต้น

โปรดสังเกตว่าหลังจากเริ่มต้นอีกครั้งเมื่อถึง1และ1อีกครั้ง

รับตัวเลขNพิมพ์คำที่Nของลำดับฟิโบนาชีสลับกัน

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


ลำดับ 0 เป็นดัชนีหรือ 1 ดัชนี (หรืออย่างใดอย่างหนึ่ง)?
Doorknob

@ Doorknob อย่างใดอย่างหนึ่ง ระบุในคำตอบของคุณ
Oliver Ni

เราสามารถกลับtrueสำหรับ1?
ETHproductions

1ค่าสองค่าแรกนับเป็นค่าเริ่มต้นสำหรับผลลัพธ์หรือไม่ เราจะเริ่มต้นหรือโดยตรงกับ2?
Luis Mendo

@LuisMendo นับสองคนแรก
Oliver Ni

คำตอบ:


17

JavaScript (ES6), 25 ไบต์

n=>"334130110314"[n%12]-2

0 การจัดทำดัชนี คุณสามารถทำให้สตริงสั้นลงด้วยเวอร์ชันซ้ำเล็กน้อยแม้ว่าจะเพิ่ม 6 ไบต์:

f=n=>"3341301"[n]-2||f(13-n%12)

นี่ยังสั้นกว่าสูตรแบบเรียกซ้ำขั้นสุดท้าย:

f=n=>n<2||f(n-2)+f(n-1)*(-n%2|1)

8

Python ขนาด 31 ไบต์

lambda n:2-33107256/5**(n%12)%5

ไม่ต้องพยายามคำนวณค่า มองหาในรายการ peroidic length-12 [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]ซึ่งถูกบีบอัดในฐาน 5

เปรียบเทียบกับโซลูชันแบบเรียกซ้ำ (37 ไบต์) ด้วยTrue's สำหรับ 1:

f=lambda n:n<2or(-1)**n*f(n-1)+f(n-2)

หรือเพื่อการจัดเก็บสตริง

lambda n:int('334130110314'[n%12])-2

หรือความพยายามในการแสดงออกทางคณิตศาสตร์

lambda n:4**n%7%3*(-1)**((n+n%2*4)/6)

7

โอเอซิสขนาด 10 ไบต์

เตือนให้ฉันใช้บิวด์อินเพิ่มเติม: p การป้อนข้อมูลเป็น0 การจัดทำดัชนี

รหัส:

n>2%x<*c+V

ฉบับแปล:

a(n) = (2*((n+1)%2)-1) * a(n-1) + a(n-2)
a(1) = 1
a(0) = 1

และคำนวณn TH ระยะ

ลองออนไลน์!



4

Pyth - 13 ไบต์

เข้ารหัสพื้นฐานเมื่ออนุกรมซีรีย์ทำดัชนีแบบแยกส่วน

@-R2jC"
ûx"5

ลองมันออนไลน์ได้ที่นี่


4

เยลลี่ 12 ไบต์

“½Ġ⁻S’b5_2⁸ị

TryItOnline!

1 1ตามที่กำหนดค่าเป็นครั้งแรกและครั้งที่สอง

ไม่แน่ใจว่าจะสั้นกว่านี้หรือไม่ แต่สำหรับเรื่องนี้ฉันสังเกตว่าซีรีย์มีระยะเวลา 12:
[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]

ดังนั้นฉันจึงใช้มันและบวก2เพื่อให้
[3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
แปลงเป็น5เลขฐานเป็นเบส250เพื่อให้:
[11, 197, 140, 84]
(ซึ่งคือ184222584)

“½Ġ⁻S’b5_2⁸ị - Main link: n
“½Ġ⁻S’       - base 250 number      184222584
      b5     - convert to base 5   [3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
        _2   - subtract 2          [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]
          ⁸  - left argument, n
           ị - index into (1-based and modular)

4

Haskell, 33 26 ไบต์

a!b=a:b:(a+b)!(-a)
(1!1!!)

วิธีการแบบเรียกซ้ำ 0 การจัดทำดัชนี ลองใช้กับ Ideone
ที่บันทึกไว้ 7 ไบต์ขอบคุณที่XNOR

การใช้งาน:

Prelude> (1!1!!)11
2

ดูสั้นลงไปa!b=a:b:(a+b)!(-a)เรื่อย ๆ
xnor

3

Mathematica ขนาด 40 ไบต์

เพียงสร้างตารางการค้นหาและเข้าถึงแบบวนรอบเช่นเดียวกับในคำตอบของ ETHproductions ฟังก์ชั่นที่ไม่มีชื่อ 1 ดัชนี

Join[s={2,1,1,2,-1,1},-s][[#~Mod~12+1]]&

3

MATL , 17 16 15 ไบต์

'"Bl)e'F5Za2-i)

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

ลองออนไลน์!

คำอธิบาย

[1 1 2 -1 1 -2 -1 -1 -2 1 -1 2]ลำดับที่มีระยะเวลา

'"Bl)e     % Compressed array [1 1 2 -1 1 -2 -1 -1 -2 1 -1 2] with source 
           % alphabet [-2 -1 0 1 2]
F5Za       % Decompress with target alphabet [0 1 2 3 4]
2-         % Subtract 2 to transform alphabet into [-2 -1 0 1 2]
i)         % Input N and use as (modular, 1-based) index into the sequence

3

WinDbg ขนาด 26 ไบต์

?(85824331b>>@$t0%c*3&7)-2

$t0การป้อนข้อมูลจะถูกส่งผ่านหลอกทะเบียน 0 การจัดทำดัชนี 2 ของแต่ละคำในลำดับที่ถูกเก็บไว้ใน 3 85824331bบิตทำให้

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

? (85824331b >> @$t0 % c * 3 & 7) - 2 ;*? Evalutes the expression. Shifts 85824331b to get
                                       *the 3 bits for the @$t0'th term (mod c (12) when
                                       *the sequence repeats). Bitwise AND by 7 to get the
                                       *desired 3 bits, finally subtract 2 since the terms
                                       *where stored as +2.

ตัวอย่างผลลัพธ์การพิมพ์ลูป 14 ค่าแรกของลำดับ:

0:000> .for(r$t0=0;@$t0<e;r$t0=@$t0+1){?(85824331b>>@$t0%c*3&7)-2}
Evaluate expression: 1 = 00000001
Evaluate expression: 1 = 00000001
Evaluate expression: 2 = 00000002
Evaluate expression: -1 = ffffffff
Evaluate expression: 1 = 00000001
Evaluate expression: -2 = fffffffe
Evaluate expression: -1 = ffffffff
Evaluate expression: -1 = ffffffff
Evaluate expression: -2 = fffffffe
Evaluate expression: 1 = 00000001
Evaluate expression: -1 = ffffffff
Evaluate expression: 2 = 00000002
Evaluate expression: 1 = 00000001
Evaluate expression: 1 = 00000001

3

Java, 32 ไบต์

n->"334130110314".charAt(n%12)-50

เนื่องจากนี่คือ Java คำตอบคือ 0-indexed

การทดสอบและ ungolfed:

class Ideone {
  public static void main (String[] args) throws Exception {
    java.util.function.IntFunction f = n->"334130110314".charAt(n%12)-50;
    for (int i = 0; i < 12; i++) {
      System.out.printf("%d -> %d%n", i, f.apply(i));
    }
  }
}

ทดสอบไอดีโอ


2

Mathematica, 45 41 38 ไบต์

ขอบคุณ @MartinEnder เป็นเวลา 3 ไบต์

±0=±1=1;±n_:=±(n-2)+±(n-1)(1-2n~Mod~2)

0 การจัดทำดัชนี

การใช้

±5

-2


2
คุณอาจจะสามารถบันทึกสามไบต์โดยการกำหนดผู้ประกอบการเอกแทนของฟังก์ชั่น± a
Martin Ender


1

C #, 117 ไบต์

แข็งแรงเล่นกอล์ฟ:

int A(int n){var f=new List<int>{0,1,1};for(int i=3;i<=n;i++){f.Add(i%2>0?f[i-1]+f[i-2]:f[i-2]-f[i-1]);}return f[n];}

Ungolfed:

public int A(int n)
{
  var f = new List<int> { 0, 1, 1 };

  for (int i = 3; i <= n; i++)
  {
    f.Add(i % 2 > 0 ? f[i - 1] + f[i - 2] : f[i - 2] - f[i - 1]);
  }

  return f[n];
}

การทดสอบ:

var alternatingFibonacci = new AlternatingFibonacci();
Console.WriteLine(alternatingFibonacci.B(10));
1

คอมไพล์เป็น Func <int, int> ดังนั้นpublic int A(int n)ขณะนี้n=>คุณสามารถลบวงเล็บปีกกาสำหรับคำสั่งที่ประหยัดได้ 2 ไบต์คุณสามารถเพิ่มการเพิ่มiของลูปในวงก่อน++i <= nและตั้งค่าi = 2การบันทึก 3 ไบต์เพราะมันจะลบi++ส่วนท้ายของคำสั่ง
TheLethalCoder

ดูคำตอบของฉันด้วยถ้าคุณติดตามตัวแปรก่อนหน้าแทนที่จะสร้างรายการตัวแปรทั้งหมดมันสั้นกว่ามาก
TheLethalCoder

1

R, 38 ไบต์

ใช้โซลูชันตารางการค้นหาที่ได้รับแรงบันดาลใจจาก @ETHproductions JS answer

c(s<-c(2,1,1,2,-1,1),-s)[scan()%%12+1]

แก้ไข: ลืมพูดถึงว่านี่เป็น 1 ดัชนี



1

Java 7, 88 82 79 ไบต์

แข็งแรงเล่นกอล์ฟ:

int f(int n){int c,i=0,a=1,b=1;for(;i<n;){c=i++%2>0?a-b:a+b;a=b;b=c;}return b;}

ungolfed:

int f(int n)
{
    int c, i = 0, a = 1, b = 1;
    for (; i < n;)
    {
        c = i++ % 2 > 0 ? a - b : a + b;
        a = b;
        b = c;
    }
    return b;
}

ลองออนไลน์


1
เนื่องจากคุณใช้วิธี "ตรรกะ" ต่อไปนี้เป็นคำแนะนำ: 1. คุณลืมที่จะประกาศintเป็นประเภทผลตอบแทน 2. คุณสามารถสำรองไบต์ด้วยการย้ายการกำหนด 0 เป็นการประกาศของ i:int c,i=0for(;i<n;){และ 3. คุณสามารถลบเครื่องหมายวงเล็บออกได้ตามเงื่อนไขของผู้ประกอบการที่สาม
Olivier Grégoire

1
@ OlivierGrégoireขอบคุณเพื่อน :) คงที่ วิธีการแก้ปัญหาที่ดี btw
peech

1

DC, 55 ไบต์

?sd[ln1+snly[[+2Q]sEln2%1=E-]xlyrsylnld>r]sr1sy0sn1lrxp

0 การจัดทำดัชนี

?sd                                                     takes input and stores
                                                        it in register d

                                            1sy0sn1     stores 1 in register y
                                                        and 0 in register n and
                                                        appends 1 to the stack

   [ln1+snly                                            adds 1 to register n and
                                                        appends the value of
                                                        register y to the stack

            [[+2Q]sEln2%1=E-]                           adds or subtracts the
                                                        the two values on the
                                                        stack depending on
                                                        parity of n

                             xlyrsylnld>r]              does the rest of the
                                                        stuff required to store
                                                        the new values properly
                                                        and quits if it has
                                                        done enough iterations

                                          sr            stores the main macro
                                                        in register r

                                                   lrxp executes the macro and
                                                        prints the stack

รีจิสเตอร์ d เก็บดัชนีของค่า การลงทะเบียน n จะนับจำนวนการวนซ้ำที่เสร็จสิ้น รีจิสเตอร์ r เก็บแมโครหลัก รีจิสเตอร์ y เก็บค่าในภายหลังในลำดับขณะที่สแต็กมีค่าก่อนหน้าในลำดับ

คำอธิบายแบบภาพของสิ่งที่เกิดขึ้นในลูปใหญ่ (สมมติว่ามีการเพิ่ม):

register: y=1     y=1   y=1    y=1   y=1    y=2
stack:     1      1 1    2     2 1   1 2     1
               ly     +     ly     r     sy

การตรวจสอบเพื่อตรวจสอบว่าการเพิ่มหรือลบใช้เวลาโมดูเคาน์เตอร์ที่สองและใช้เคล็ดลับนี้เพื่อสร้างถ้าแล้วการก่อสร้างอื่น

pในตอนท้ายกองมีหมายเลขเดียวค่าที่ต้องการซึ่งเป็นพิมพ์ที่มี

(ฉันใหม่เพื่อ dcเพื่อฉันจะคาดหวังว่าจะมีการปรับปรุงที่ชัดเจนที่นี่)



0

Turtlèd , 35 ไบต์

#112-1_--_1-2#?:[*l+].(-r'1)(_"-2")

0 จัดทำดัชนีแล้ว

คำอธิบาย:

#112-1_--_1-2#                      the 12 values of sequence. - is -1, _ is -2
              ?:                    input a number and move right that many
                [*l+]               move back to the asterisk on start cell, 
                                    increment sting pointer by amount moved
                     .              write pointed char
                      (-r'1)        if it was -, move right, write 1
                            (_"-2") if it was _, write "-2"
      [print grid]

ลองออนไลน์!


0

ABCR, 43 ไบต์

)AAB)ABB..A))A..A)AA(ABB.)A+A)))AiB5aAb(Bxo

คำอธิบาย: ส่วนแรก ( )AAB)ABB..A))A..A)AA(ABB.)A+A)))A) ตั้งค่าคิวเพื่อให้มี [1, 1, 2, -1, 1, -2, -1, -1, -1, -2, 1, -1, 2] ทำให้คิวอื่น ๆ ทั้งหมดว่างเปล่า . iBเก็บคำที่เราต้องการและวน5aAb(Bxรอบผ่านคิวที่หลายต่อหลายครั้ง oพิมพ์ด้านหน้าของคิวเป็นตัวเลขซึ่งจะเป็นคำตอบที่เราต้องการ


0

แบตช์ 49 ไบต์

@cmd/cset/a"n=%1%%12,~!(n%%3)*(1|-!(n%%5*(n/4)))"

รับอินพุตเป็นพารามิเตอร์บรรทัดคำสั่ง คำอธิบาย: แบบฟอร์มปิดใช้ข้อสังเกตต่อไปนี้:

  • ลำดับเป็นรอบที่มีระยะเวลา 12
  • ทุกๆเทอมที่สามคือ± 2 ในขณะที่เทอมอื่น ๆ คือ± 1
  • คำศัพท์หลังจากที่สามเป็นลบยกเว้นทวีคูณของ 5 (หลังจากลดโมดูโล 12)

เราจึงเริ่มต้นด้วยการลดโมดูโล 12 (เพื่อบันทึก 2 ไบต์) จากนั้นเราลดโมดูโล่สามและกลับผลลัพธ์ซึ่งก็คือ 1 สำหรับผลคูณของ 3 หรือ 0 จากนั้นเราให้ค่าไม่ใช่ค่านั้น, ให้เรา -2 สำหรับผลคูณของ 3 หรือ -1 จากนั้นเราลดโมดูโล 5 และหารด้วย 4, ให้ศูนย์สำหรับเทอม 1, 2, 3, 5, 10 และ 12 (0) ค่าอินเวอร์ติ้งและค่าลบทำให้เรา -1 สำหรับค่าเหล่านั้นและศูนย์สำหรับค่าอื่น จากนั้นเราใช้ค่าบิตหรือว่าด้วย 1 และคูณกับการคำนวณก่อนหน้านี้


0

TI-Basic, 26 ไบต์

แต่น่าเสียดายที่วิธีการที่น่าทึ่งมาก ฉันไม่สามารถหาอะไรที่สั้นกว่านี้ได้ รายการถูกทำดัชนี 1 รายการ

Input :{1,1,2,-1,1,-2:augment(Ans,-Ans:Ans(X

0

C #, 73 71 ไบต์

สิ่งนี้ใช้ค่าดัชนี 0 ของ n

n=>{int a=1,b=1,i=0,r;for(;++i<n;){r=i%2>0?a+b:a-b;a=b;b=r;}return b;};

เวอร์ชันที่จัดรูปแบบ:

Func<int, int> f = n =>
{
    int a = 1, b = 1, i = 0, r;

    for(; ++i < n;)
    {
        r = i % 2 > 0 ? a + b : a - b;
        a = b;
        b = r;
    }

    return b;
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.