ฟังก์ชันหรือลำดับ Fibonacci


115

ลำดับฟีโบนักชีเป็นลำดับของตัวเลขซึ่งมีจำนวนในลำดับทุกคือผลรวมของตัวเลขสองก่อนหน้านั้นได้ ตัวเลขสองตัวแรกในลำดับคือ 1

ต่อไปนี้เป็นคำศัพท์สองสามคำแรก

1 1 2 3 5 8 13 21 34 55 89 ...

เขียนรหัสที่สั้นที่สุดที่:

  • สร้างลำดับ Fibonacci โดยไม่ต้องจบ

  • รับnคำนวณnคำที่ th ของลำดับ (มีดัชนี 1 หรือ 0 ศูนย์)

คุณสามารถใช้รูปแบบมาตรฐานของอินพุตและเอาต์พุต

(ฉันให้ทั้งสองตัวเลือกในกรณีที่การทำในภาษาที่คุณเลือกง่ายกว่าตัวเลือกอื่น)


สำหรับฟังก์ชั่นที่รับnค่าตอบแทนที่มีขนาดใหญ่พอสมควร (จำนวนฟีโบนัชชีที่ใหญ่ที่สุดที่เหมาะสมกับขนาดคำปกติของคอมพิวเตอร์ของคุณอย่างน้อยที่สุด) จะต้องได้รับการสนับสนุน


ลีดเดอร์บอร์ด

คำตอบ:


48

Perl 6, 10 ตัวอักษร:

รายชื่อลำดับ fibonacci อนันต์ไม่ระบุชื่อ:

^2,*+*...*

เหมือนกับ:

0, 1, -> $x, $y { $x + $y } ... Inf;

ดังนั้นคุณสามารถกำหนดให้อาร์เรย์:

my @short-fibs = ^2, * + * ... *;

หรือ

my @fibs = 0, 1, -> $x, $y { $x + $y } ... Inf;

และรับค่าสิบเอ็ดแรก (จาก 0 ถึง 10) ด้วย:

say @short-fibs[^11];

หรือด้วย:

say @fibs[^11];

รอคุณจะได้รับ 50 หมายเลขแรกจากรายการที่ไม่ระบุตัวตนด้วย:

say (^2,*+*...*)[^50]

ผลตอบแทนที่ได้:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169
63245986 102334155 165580141 267914296 433494437 701408733 1134903170 
1836311903 2971215073 4807526976 7778742049

และมาตรฐานง่ายๆ:

real    0m0.966s
user    0m0.842s
sys     0m0.080s

ด้วย:

$ time perl6 -e 'say (^2, *+* ... *)[^50]'

EOF


ฉันจะไม่ได้คิดว่าการแทน^2 0,1+1
Konrad Borowski

2
สิ่งนี้ไม่ถูกต้องอีกต่อไปคุณจะต้องเขียนเป็น|^2,*+*...*ซึ่งมีจำนวนไบต์เท่า0,1,*+*...*กัน
Brad Gilbert b2gills

5
Perl นั้นแปลกมาก
Cyoce

1
คำตอบนี้เขียนใน Perl 6 รุ่นใด
CalculatorFeline

3
@CalculatorFeline มีการเปลี่ยนแปลงครั้งใหญ่ที่เรียกว่า GLR (Great List Refactor) ซึ่งเกิดขึ้นไม่นานก่อนที่จะมีการเปิดตัวอย่างเป็นทางการครั้งแรกเมื่อวันที่ 2015-12-25 รหัสนี้จะใช้ได้จนถึงตอนนั้น
แบรดกิลเบิร์ต b2gills

73

Brainfuck, 22 จังหวะ

+>++[-<<[->+>+<<]>>>+]

สร้างลำดับ Fibonacci ค่อยๆเคลื่อนผ่านเทปหน่วยความจำ


5
สวย! สวยงามอย่างสวยงาม! หรืออาจจะไม่ใช่ ... ยัง
ไงก็ตาม

2
นี่คือ 3.344 หรือ4ไบต์ใน brainfuck บีบอัด (6 ln (22)) / ln (256)
Will Sherwood

24
16 ไบต์:+[[<+>->+>+<<]>]
primo

3
14 ไบต์:+[.[>+>+<<-]>]
Charlim

2
@ แน่นอนว่ายิ่งน้อยก็ยิ่งทำลายได้มาก วิธีการแก้ปัญหาข้างต้นจะสิ้นสุดลงด้วยลำดับฟีโบนักชีบนเทปซึ่งเป็นสิ่งที่โซลูชัน 16 ไบต์ทำเช่นกัน
โม่

51

Haskell, 17 15 14 ตัวอักษร

f=1:scanl(+)1f

ลองออนไลน์!


4
ทำไมไม่ตัดสองช่องว่างเป็นf=0:scanl(+)1 f?
R. Martinho Fernandes

@ Martininho: แก้ไขแล้วขอบคุณ
อานนท์

ว้าวมันสั้นกว่าปกติด้วยซ้ำf@(_:x)=0:1:zipWith(+)f x! ต้องจำไว้
FUZxxl

4
f=0:scanl(+)1fคุณยังอาจตัดพื้นที่อื่น:
FUZxxl

37

C # 4, 58 ไบต์

สตรีม (69; 65 หากพิมพ์ไม่ถึงIEnumerable)

(สมมติว่าusingคำสั่งสำหรับSystem.Collections.Generic.)

IEnumerable<int>F(){int c=0,n=1;for(;;){yield return c;n+=c;c=n-c;}}

ค่าเดียว (58)

int F(uint n,int x=0,int y=1){return n<1?x:F(n-1,y,x+y);}

6
ระบุว่าnเป็นuint, สามารถลงไปn==0 n<1และสตรีมสามารถบันทึกสองสามตัวอักษรโดยแบ่งพื้นที่หลังจากประเภททั่วไปและประกาศxในขอบเขตที่กว้างกว่าที่จำเป็น ในความเป็นจริงคลองxทั้งหมด:n+=c;c=n-c;
Peter Taylor

1
@ Peter: ขอบคุณจะแก้ไขเมื่อฉันได้รับเวลา
Jon Skeet

รุ่นที่มีค่าเดียวของคุณนั้นตราบใดที่คำตอบของฉันคือแลมบ์ดาแบบเรียกซ้ำ ... ดี!
Andrew Gray

1
@ wizzwizz4 ถ้าฉันไม่เข้าใจผิดถ้าได้!nผลก็ควรทำเช่นนั้นnถ้าคุณพลิกเงื่อนไข
Cyoce

3
@JonSkeet Aw และที่นี่ฉันคิดว่าฉันพ่ายแพ้ Jon Skeet ที่ C # ... :-)
wizzwizz4

32

GolfScript, 12

ตอนนี้มีเพียง 12 ตัวอักษร!

1.{.@.p+.}do

+1 ดีมาก หากคุณทำให้มันสั้นกว่า 13 ตัวอักษรฉันจะยอมรับคำตอบของคุณทันที (ยกเว้นบางคนทำให้คำตอบสั้นลงแน่นอน) :-P
Chris Jester-Young

1
ฉันรักความท้าทาย ทำ! ;-)
jtjacques

ดีคุณชนะ อย่างน้อยก็จนกว่าจะมีคนทำบางสิ่งให้สั้นลง (ถ้าเป็นไปได้) :-P
Chris Jester-Young

5
คำจำกัดความนั้นเกือบจะสั้นเท่ากับชื่อ 'ฟีโบนักชี'! +1
เอเจนต์ -j

23

> <> - 15 ตัวอักษร

0:nao1v LF a+@:n:<o

แม้ว่าคุณจะสามารถย่อให้สั้นลง0:nao1v LF a+@:n:<oถ้าคุณต้องการ ให้ 15 :) ในความเป็นจริงนี้ยังทำให้การส่งออกเล็กน้อยอ่านได้มากขึ้น ...
tomsmeding

5
13 chars:01r:nao$:@+$r
randomra

21

J, 10 ตัวอักษร

ใช้การคำนวณในตัวของค่าสัมประสิทธิ์ซีรีย์เทย์เลอร์ดังนั้นอาจจะโกงเล็กน้อย เรียนรู้มันนี่

   (%-.-*:)t.

   (%-.-*:)t. 0 1 2 3 4 5 10 100
0 1 1 2 3 5 55 354224848179261915075

2
@aditsu (q:^-^:p) 6คือ64 729ตำแหน่งที่ p อยู่ J อาจดีสำหรับสิ่งที่ทำปริศนา :)
randomra

2
ได้ดียิ่งขึ้น: (<:^-^:>) 4เป็น81และเป็น<:^-^:> 4 53.5982
Randomra

2
อีโมจิที่แสดงที่นี่คือสิ่งที่รหัส J ทั้งหมดควรมุ่งมั่น ในอีกด้านหนึ่ง+/@:!&i.-ใช้อีก 9 ไบต์
ไมล์

1
@miles ดีมาก! คุณควรโพสต์มันแตกต่างจากของฉันอย่างสิ้นเชิง
randomra

21

Hexagony ,18 14 12

ขอบคุณ Martin สำหรับ 6 ไบต์!

1="/}.!+/M8;

ขยาย:

  1 = "
 / } . !
+ / M 8 ;
 . . . .
  . . .

ลองออนไลน์


เก่าตอบ สิ่งนี้กำลังถูกทิ้งไว้เนื่องจากรูปภาพและคำอธิบายอาจเป็นประโยชน์กับผู้ใช้ Hexagony ใหม่

!).={!/"*10;$.[+{]

ขยาย:

  ! ) .
 = { ! /
" * 1 0 ;
 $ . [ +
  { ] .

นี่จะพิมพ์ลำดับ Fibonacci คั่นด้วยการขึ้นบรรทัดใหม่

ลองออนไลน์! ระวังแม้ว่าล่ามออนไลน์ไม่ชอบผลลัพธ์ที่ไม่มีขีด จำกัด

คำอธิบาย

มี "รูทีนย่อย" สองตัวสำหรับโปรแกรมนี้แต่ละตัวดำเนินการโดยหนึ่งในสอง IP ที่ใช้ รูทีนแรกพิมพ์บรรทัดใหม่และที่สองทำการคำนวณ Fibonacci และส่งออก

รูทีนย่อยแรกเริ่มต้นที่บรรทัดแรกและเลื่อนจากซ้ายไปขวาตลอดเวลา มันเป็นครั้งแรกที่พิมพ์ค่าตัวชี้หน่วยความจำ (เริ่มต้นได้ที่ศูนย์) 1แล้วเพิ่มค่าที่ชี้หน่วยความจำโดย หลังจากไม่มีการป้อนข้อมูล IP จะข้ามไปยังบรรทัดที่สามซึ่งจะสลับไปยังเซลล์หน่วยความจำอื่นก่อนจากนั้นพิมพ์บรรทัดใหม่ เนื่องจากขึ้นบรรทัดใหม่มีค่าเป็นบวก (ค่าของมันคือ 10) รหัสจะข้ามไปยังบรรทัดที่ห้าเสมอถัดไป บรรทัดที่ห้าส่งคืนตัวชี้หน่วยความจำไปยังหมายเลข Fibonacci ของเราจากนั้นสลับไปที่รูทีนย่อยอื่น เมื่อเรากลับมาจากรูทีนย่อยนี้ IP จะกระโดดกลับไปที่บรรทัดที่สามหลังจากรัน no-op

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


รูปภาพพริตตี้เบื้องต้น!

ด้านซ้ายของภาพคือโปรแกรมด้านขวาแสดงถึงหน่วยความจำ กล่องสีน้ำเงินเป็น IP แรกและ IP ทั้งสองชี้ไปที่คำสั่งถัดไปที่จะดำเนินการ

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: รูปภาพอาจดูสวยสำหรับผู้ที่มีทักษะ จำกัด ในทำนองเดียวกันกับโปรแกรมแก้ไขภาพ: PI จะเพิ่มการทำซ้ำอย่างน้อย 2 ครั้งขึ้นไปเพื่อให้การใช้งาน*โอเปอร์เรเตอร์นั้นชัดเจนยิ่งขึ้น

หมายเหตุ 2: ฉันเห็นคำตอบของ alephalphaหลังจากเขียนส่วนใหญ่แล้วฉันคิดว่ามันยังมีค่าเนื่องจากการแยก แต่ส่วนฟีโบนักชีจริงของโปรแกรมของเรานั้นคล้ายกันมาก นอกจากนี้นี่เป็นโปรแกรม Hexagony ที่เล็กที่สุดที่ฉันเห็นว่าใช้ประโยชน์มากกว่าหนึ่ง IP ดังนั้นฉันคิดว่ามันอาจจะดีต่อไป: P


คุณควรเชื่อมโยงกับสิ่งที่คุณใช้ในการทำภาพสวยแล้วใส่ลิงค์ในesolangs.org/wiki/Hexagony
mbomb007

1
@ mbomb007 ฉันใช้ gimp เพื่อสร้างแต่ละเฟรมด้วยตนเองจากนั้นอัปโหลดภาพไปยังเว็บไซต์สร้าง gif แม้ว่าหลายครั้งในระหว่างกระบวนการนี้ฉันคิดว่าการสร้างเครื่องมือเพื่อทำมันโดยพิจารณาว่ามันน่าเบื่อเพียงใด
FryAmTheEggman

@FryAmTheEggman น่าประทับใจ! ทำให้เป็นเรื่องที่ท้าทาย ฉันแน่ใจว่าบางคนจะโพสต์คำตอบ : D ดียิ่งขึ้นถ้าคุณสามารถสร้างเว็บไซต์ที่คล้ายกับล่ามออนไลน์ของปลา
mbomb007

@ mbomb007 นั่นอาจเป็นเรื่องท้าทายสำหรับไซต์นี้ แต่ก็ไม่อาจพูดได้ว่ามันอาจจะเป็นเรื่องที่กว้างมาก ฉันไม่คิดว่าฉันจะโพสต์สิ่งนั้น แต่คุณสามารถทำมันเองได้หากคุณคิดว่าคุณมีวิธีการนำเสนอที่ดี นอกจากนี้ฉันเชื่อว่า Timwi สร้าง C # ide สำหรับรูปหกเหลี่ยมแม้ว่าฉันไม่เคยใช้เพราะฉันไม่ได้ใส่ใจกับขาวดำ
FryAmTheEggman

1
@ mbomb007 IDE อาศัยอยู่ที่นี่โดยวิธีการนี้ลืมที่จะเชื่อมโยงมันเป็นครั้งสุดท้าย
FryAmTheEggman


17

Python 2, 34 ไบต์

Python โดยใช้การเรียกซ้ำ ... ที่นี่ StackOverflow มา!

def f(i,j):print i;f(j,i+j)
f(1,1)

15

เยลลี่ 3 ไบต์

+¡1

ลองออนไลน์!

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

+¡1    Niladic link. No implicit input.
       Since the link doesn't start with a nilad, the argument 0 is used.

  1    Yield 1.
+      Add the left and right argument.
 ¡     For reasons‡, read a number n from STDIN.
       Repeatedly call the dyadic link +, updating the right argument with
       the value of the left one, and the left one with the return value.

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


12

Golfscript - หมายเลขเดียว - 12/11/10

12 ตัวอักษรสำหรับการป้อนข้อมูลจาก stdin:

~0 1@{.@+}*;

11 ตัวอักษรสำหรับการป้อนข้อมูลในสแต็กแล้ว:

0 1@{.@+}*;

10 ตัวอักษรสำหรับการกำหนดเพิ่มเติมอีก 1 รายการเป็นหมายเลข Fibonacci 0:

1.@{.@+}*;

1
ตัวเลือกคือ "คำนวณให้ n, หมายเลขฟีโบนักชีที่ n" ดังนั้นคลอง~และคุณมี 11 ตัวอักษรที่ใช้nในกองและทิ้งไว้F_nในกอง
Peter Taylor

12

ทับทิม

29 27 25 24 ตัวอักษร

p a=b=1;loop{b=a+a=p(b)}

แก้ไข: ทำให้เป็นวงไม่สิ้นสุด ;)


13
ไม่มีใครสังเกตเห็นว่าb=a+a=bเป็นอาการปวดหลังหรือไม่ :)
st0le

2
ใช่ st0le ทำ :)
gnibbler

ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่ใครสามารถอธิบายได้ว่าb=a+a=bชิ้นส่วนนี้ทำงานอย่างไร ดูเหมือนจะไม่ห่อหัวฉันไว้
Mr. Llama

3
@GigaWatt คิดแบบนี้คำสั่งจะถูกดำเนินการจากซ้ายไปขวา ... ดังนั้นnewb=olda+(a=oldb)
st0le

คุณสามารถบันทึกได้ 2 ตัวอักษรโดยใช้loop:p 1,a=b=1;loop{p b=a+a=b}
Patrick Oscity

11

Mathematica, 9 ตัวอักษร

Fibonacci

หากไม่ได้รับอนุญาตให้ใช้ฟังก์ชันในตัวนี่เป็นวิธีการแก้ปัญหาที่ชัดเจน:

Mathematica, 33 32 31 ตัวอักษร

#&@@Nest[{+##,#}&@@#&,{0,1},#]&

#&@@Nest[{#+#2,#}&@@#&,{0,1},#]&32 ตัวอักษร
chyanog

1
@chyanog 31:#&@@Nest[{+##,#}&@@#&,{0,1},#]&
Mr.Wizard

1
@ Mr.Wizard 24 ตัวอักษร (26 ไบต์):Round[GoldenRatio^#/√5]&
JungHwan ขั้นต่ำ

1
หรือ 23 ตัวอักษร (27 ไบต์):Round[((1+√5)/2)^#/√5]&
JungHwan ขั้นต่ำ

10

DC (20 ไบต์)

ในฐานะที่เป็นโบนัสมันก็ยิ่งยุ่งเหยิง;)

zzr[dsb+lbrplax]dsax

แก้ไข: ฉันอาจชี้ให้เห็นว่ามันพิมพ์ทั้งหมดตัวเลขในลำดับ Fibonacci ถ้าคุณรอนานพอ


13
ฉันจะไม่เรียกมันว่า obfuscated - รหัสที่ obfuscated นั้นยากที่จะเข้าใจและตราบใดที่ dc ไปที่รหัสที่นี่ตรงไปตรงมาอย่างสมบูรณ์
Nabb

10

โหมโรง 12 ไบต์

หนึ่งในความท้าทายไม่กี่ข้อที่ Prelude แข่งขันกันอย่างเป็นธรรม:

1(v!v)
  ^+^

สิ่งนี้ต้องการตัวแปล Pythonที่พิมพ์ค่าเป็นตัวเลขทศนิยมแทนที่จะเป็นตัวอักษร

คำอธิบาย

ในโหมโรงบรรทัดทั้งหมดจะถูกดำเนินการในแบบคู่ขนานพร้อมกับตัวชี้คำแนะนำภายในคอลัมน์ของโปรแกรม แต่ละบรรทัดมีสแต็กของตัวเองซึ่งเริ่มต้นเป็นศูนย์

1(v!v)
  ^+^
| Push a 1 onto the first stack.
 | Start a loop from here to the closing ).
  | Copy the top value from the first stack to the second and vice-versa.
   | Print the value on the first stack, add the top two numbers on the second stack.
    | Copy the top value from the first stack to the second and vice-versa.

วนซ้ำตลอดไปเพราะกองแรกจะไม่0อยู่ด้านบน

0โปรดทราบว่านี้จะเริ่มต้นลำดับฟีโบนักชีจาก


10

Hexagonyขนาด 6 ไบต์

ไม่ใช่การแข่งขันเนื่องจากภาษานั้นใหม่กว่าคำถาม

1.}=+!

Ungolfed:

  1 .
 } = +
  ! .

มันพิมพ์ลำดับ Fibonacci โดยไม่มีตัวคั่นใด ๆ


2
นี่เป็นปัญหาเล็กน้อยที่ไม่ได้พิมพ์ตัวคั่นใด ๆ ระหว่างตัวเลข สิ่งนี้ไม่ได้ระบุไว้อย่างสมบูรณ์ในความท้าทาย (และฉันมีความสุขจริงๆที่มีคนกำลังใช้ Hexagony :))
Martin Ender

9

TI-BASIC, 11

โดยนักกอล์ฟระดับตำนาน TI-BASIC Kenneth Hammond ("Weregoose") จากเว็บไซต์นี้ รันในเวลา O (1) และถือว่า 0 เป็นเทอมที่ 0 ของลำดับฟีโบนักชี

int(round(√(.8)cosh(Anssinh‾¹(.5

ใช้:

2:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     1

12:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     144

มันทำงานอย่างไร ถ้าคุณทำคณิตศาสตร์มันกลับกลายsinh‾¹(.5)เป็นว่าเท่ากับln φดังนั้นมันจึงเป็นสูตรดัดแปลงของ Binet ที่ปัดเศษลงแทนที่จะใช้(1/φ)^nคำแก้ไข round((รอบไปยังสถานที่ 9 ทศนิยม) เป็นสิ่งจำเป็นเพื่อป้องกันข้อผิดพลาดในการปัดเศษ


8

K - 12

คำนวณหมายเลขnและn-1ฟีโบนักชี

{x(|+\)/0 1}

เพียงแค่nthหมายเลขฟีโบนักชี

{*x(|+\)/0 1}

+1 ไม่เลว! หากคุณสามารถย่อมันลงได้เพียงตัวละครตัวเดียว (และให้วิธีทดสอบกับฉัน) ฉันจะยอมรับคำตอบของคุณ :-)
Chris Jester-Young

วิธีเดียวที่จะลดขนาดมันคือการแทนที่ฟังก์ชั่นด้วยการโทรไปยังหมายเลขที่รู้จัก: n (| + \) / 0 1 ทดสอบโดยใช้ล่ามนี้
isawdrones


7

Java, 55

ฉันไม่สามารถแข่งขันกับความกระชับของภาษาส่วนใหญ่ที่นี่ แต่ฉันสามารถเสนอวิธีที่แตกต่างกันอย่างมากและอาจเร็วกว่ามาก (เวลาคงที่) ในการคำนวณตัวเลขที่ n:

Math.floor(Math.pow((Math.sqrt(5)+1)/2,n)/Math.sqrt(5))

nคืออินพุต (int หรือ long) เริ่มต้นด้วย n = 1 มันใช้สูตรและรอบของ Binetแทนการลบ


ฉันชอบวิธีแก้ปัญหานี้
Andreas

ดูเหมือนจะไม่ได้ผลสำหรับฉัน แต่มันเร็วและฉันอาจพลาดอะไรบางอย่าง! สมมติว่า0เป็นหมายเลขแรกในลำดับนี้จะให้0, 0, 1, 1, 3, 4, 8, 12, 21, 3310 หมายเลขแรก
Shaggy

@Shaggy โอ๊ะโอ! ขออภัยฉันแนะนำข้อผิดพลาด - แก้ไขแล้วตอนนี้
Hans-Peter Störr

6

ทับทิม 25 ตัวอักษร

คำตอบของ st0le สั้นลง

p 1,a=b=1;loop{p b=a+a=b}

6
ที่จริงแล้วคุณสามารถย่อให้สั้นลงยิ่งขึ้นโดยใช้a=b=1;loop{p a;b=a+a=b}
Ventero

6
ดังนั้นคุณเลยคำตอบของเขา? : P
mbomb007

6

FAC: APL ที่ใช้งานได้, ตัวละคร 4 ตัว (!!)

ไม่ใช่ของฉันดังนั้นโพสต์เป็นชุมชน wiki FAC เป็นภาษาถิ่นของ APL ที่ Hai-Chen Tu แนะนำอย่างชัดเจนว่าเป็นวิทยานิพนธ์ระดับปริญญาเอกของเขาในปี 1985 หลังจากนั้นเขาก็เขียนบทความร่วมกับ Alan J. Perlis ที่เรียกว่า " FAC: A APL Language Function " ภาษาถิ่นของ APL นี้ใช้ "lazy arrays" และอนุญาตให้ใช้อาร์เรย์ที่มีความยาวไม่ จำกัด มันกำหนดโอเปอเรเตอร์ "iter" ( ) เพื่ออนุญาตให้ใช้คำจำกัดความที่กะทัดรัดของบางวนซ้ำ

เอก ( "เอก") กรณีที่เป็นพื้นของ Haskell และถูกกำหนดให้เป็นiterate (F⌼) A ≡ A, (F A), (F (F A)), …dyadic ( "ฐาน") กรณีที่มีการกำหนดค่อนข้าง analogously A (F⌼) B ≡ A, B, (A F B), (B F (A F B)), …สองตัวแปร ทำไมถึงมีประโยชน์ เมื่อปรากฎว่าสิ่งนี้เป็นประเภทการเกิดซ้ำที่แม่นยำของลำดับฟีโบนักชี ในความเป็นจริงหนึ่งในตัวอย่างที่ให้ไว้คือ

1+⌼1

1 1 2 3 5 8 …การผลิตลำดับที่คุ้นเคย

ดังนั้นคุณไปได้หรือไม่อาจเป็นการใช้งานฟีโบนัชชีที่สั้นที่สุดในภาษาโปรแกรมที่ไม่แปลกใหม่ : D


โอ้ฉันไม่ได้ปลดชุมชนโพสต์ของคุณโดยไม่ได้ตั้งใจซึ่งเป็นส่วนหนึ่งของ โอ้ดี ;-)
Chris Jester-Young

6

R, 40 ไบต์

ยังไม่เห็นโซลูชัน R ดังนั้น:

f=function(n)ifelse(n<3,1,f(n-1)+f(n-2))

1
ฉันรู้ว่านี่เป็นคำตอบเก่า แต่คุณสามารถย่อให้เหลือ38 bytes
Robert S.


6

Dodosขนาด 26 ไบต์

	dot F
F
	F dip
	F dip dip

ลองออนไลน์!

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

ฟังก์ชั่นFทำหน้าที่ยกของหนักทั้งหมด มันถูกกำหนดแบบวนซ้ำดังนี้

F(n) = ( F(|n - 1|), F(||n - 1| - 1|) )

เมื่อใดก็ตามที่n> 1เรามี| n - 1 | = n - 1 <nและ|| n - 1 | - 1 | = | n - 1 - 1 | n = - 2 <nเพื่อให้ผลตอบแทนที่ฟังก์ชั่น(F (n - 1), F (n - 2))

ถ้าn = 0ดังนั้น| n - 1 | = 1> 0 ; ถ้าn = 1ดังนั้น|| n - 1 | - 1 | = | 0 - 1 | = 1 = 1 ในทั้งสองกรณี recursive พยายามเรียกF (1)ยกยอมจำนนยกเว้นดังนั้นF (0)ผลตอบแทน0และF (1)ผลตอบแทนที่1

ยกตัวอย่างเช่นF (3) = (F (1), F (2)) = (1, F (0), F (1)) = (1, 0, 1)

ในที่สุดฟังก์ชั่นหลักหมายถึง

main(n) = sum(F(n))

ดังนั้นจึงเพิ่มขึ้นทุกพิกัดของเวกเตอร์กลับโดยF

ยกตัวอย่างเช่นหลัก (3) = ผลรวม (F (3)) = ผลรวม (1, 0, 1) = 2




5

Cubix , 10 ไบต์

คำตอบที่ไม่แข่งขันเนื่องจากภาษาใหม่กว่าคำถาม

Cubix เป็นภาษา 2 มิติใหม่โดย @ETHproductions รหัสถูกห่อลงบนลูกบาศก์ขนาดให้พอดี

;.o.ON/+!)

ลองออนไลน์

สิ่งนี้ล้อมรอบบนลูกบาศก์ 2x2 ในลักษณะดังต่อไปนี้

    ; .
    o .
O N / + ! ) . .
. . . . . . . .
    . .
    . .
  • O ส่งออกมูลค่าของ TOS
  • N กดขึ้นบรรทัดใหม่ลงในสแต็ก
  • / สะท้อนทิศเหนือ
  • o เอาท์พุทตัวละครของ TOS
  • ; TOS ป๊อป
  • / สะท้อนทิศตะวันออกหลังจากเข้าไปในลูกบาศก์
  • + เพิ่ม 2 ค่าสูงสุดของสแต็ก
  • ! ข้ามคำสั่งถัดไปถ้า TOS เป็น 0
  • ) เพิ่ม TOS โดย 1 นี่จะเป็นการเริ่มต้นลำดับ

นี่คือการวนซ้ำไม่รู้จบที่พิมพ์ลำดับด้วยตัวคั่นบรรทัดใหม่ ใช้ประโยชน์จากข้อเท็จจริงที่ว่าคำสั่งส่วนใหญ่จะไม่แสดงค่าจากสแต็ก
หากตัวคั่นถูกละเว้นการดำเนินการนี้สามารถทำได้ด้วย 5 ไบต์.O+!)


5

Brainfuck, 16,15, 14/13 ตัวอักษร

+[[->+>+<<]>]  

สร้างลำดับ Fibonacci และไม่ได้พิมพ์อะไรเลย นอกจากนี้สั้นกว่าข้างต้น

+[.[->+>+<<]>]   

อันนี้มี 14 ตัวอักษร แต่พิมพ์ตัวอักษร ASCII ที่มีค่าของลำดับ Fibonacci


1
นี่เป็นสิ่งที่ดี แต่ฉันไม่ถูกต้องหรือไม่ที่จะบอกว่ารุ่น 14 ไบต์จะแสดงผลเฉพาะที่ 1 ในวันที่ 2 หรือไม่ เช่นเดียวกับใน "1 2 3 5 8" แทนที่จะเป็น "1 1 2 3 5 8"?
Charlim

1
@ Charlim โอ้คุณพูดถูก ฉันไม่รู้ว่าสิ่งที่ฉันคิดในปี 2014 อย่างไรก็ตามฉันเพิ่งแก้ไขมันโดยการย้ายคำสั่งการพิมพ์ไปที่ด้านหน้าของลูป
Stefnotch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.