พิมพ์ตัวอักษร Fibonacci


28

รับN (2 <= N ) พิมพ์Nบรรทัดของชุดตัวอักษร Fibonacci เช่นนี้ (เช่นN = 5) ก่อนอื่นให้เริ่มด้วยaและb:

a
b

ถัดไปเพิ่มสองบรรทัด

a
b
ab

เพิ่มสองบรรทัดสุดท้ายต่อไป

a
b
ab
bab

ทำต่อไป...

a
b
ab
bab
abbab

และเราทำเสร็จแล้ว

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



มันเป็นฟังก์ชั่นที่ส่งคืนรายการคำศัพท์ถึง N หรือไม่?
FlipTack

เราต้องพิมพ์ผลลัพธ์หรือเราสามารถส่งคืนรายการสตริงจากฟังก์ชันได้หรือไม่?
nimi

รอดังนั้นมันไม่จำเป็นต้องใช้สำหรับ n = 1?
โสคราตีฟฟีนิกซ์

นอกจากนี้เราสามารถใช้การจัดทำดัชนีแบบ 0 ได้หรือไม่
Socratic ฟีนิกซ์

คำตอบ:


10

Python 2, 41 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ @xnor

a,b="ab";exec"print a;a,b=b,a+b;"*input()

ทดสอบไอดีโอ

เพียงทำตามคำจำกัดความซ้ำ


a,b="ab";exec"print a;a,b=b,a+b;"*input()นี่คือสั้นเป็นโปรแกรมที่:
xnor

1
อาจต้องการระบุ python 2 :)
FlipTack

8

Haskell, 29 35 32 ไบต์

a%b=a:b%(a++b)
(`take`("a"%"b"))

เรียกซ้ำง่าย ๆ

สำหรับการอ้างอิง: เวอร์ชันเก่า (การดัดแปลงของคำตอบนี้ ), การเรียงสตริงในลำดับที่ไม่ถูกต้องดังนั้นฉันต้องเพิ่มอันflip(...)ที่ทำให้ยาวเกินไป (35 ไบต์)

f="a":scanl(flip(++))"b"f
(`take`f)

ผลลัพธ์จะแตกต่างจากตัวอย่าง (เรียงลำดับต่างกันในการต่อข้อมูล):["b","a","ab","aba","abaab"]
Angs

@Angs: อ๊ะผิดพลาด! คงที่
nimi


5

เยลลี่ , 11 10 ไบต์

”a”bṄ;¥@¡f

ลองออนไลน์!

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

”a”bṄ;¥@¡f  Main link. Argument: n

”a          Set the return value to 'a'.
  ”b    ¡   Call the link to the left n times, with left argument 'b' and right
            argument 'a'. After each call, the right argument is replaced with the
            left one, and the left argument with the return value. The final
            return value is yielded by the quicklink.
      ¥       Combine the two atoms to the left into a dyadic chain.
    Ṅ           Print the left argument of the chain, followed by a linefeed.
     ;          Concatenate the left and right argument of the chain.
       @      Call the chain with reversed argument order.
         f  Filter the result by presence in n. This yields an empty string
            and thus suppresses the implicit output.

ฉันมี”a”b;@Ṅส่วนที่ลง แต่ฉันไม่สามารถคิดออกว่าจะไปจากที่นั่น ... ตอนนี้ฉันรู้ว่า :-)
ETHproductions

5

Java 7, 69 ไบต์

String c(int n,String a,String b){return n--<1?"":a+"\n"+c(n,b,a+b);}

ungolfed

 class fibb {


public static void main(String[] args) {
    System.out.println( c( 7, "a" , "b" ) );

}
static String c(int n,String a,String b) {

    return n-- < 1  ? "" : a + "\n" + c(n,b,a + b);

}
}

คุณจริงๆต้องจัดรูปแบบรหัส ungolfed ของคุณมากขึ้นอีกนิดในคำตอบของคุณ .. xD +1 แม้ว่าและมันยังทำงานสำหรับสตริงเริ่มต้นอื่น ๆ ที่แตกต่างกันมากกว่าเพียงแค่การและa bฉันไม่แน่ใจว่า"a"และ"b"พารามิเตอร์ควรจะนับไบต์นับ แต่เนื่องจากคำถามเฉพาะรัฐก็ควรใช้และa bไม่ใช่ว่า Java จะชนะอยู่ดี ;)
Kevin Cruijssen

@KevinCruijssen ต้องการพารามิเตอร์สตริงเนื่องจากค่าเปลี่ยนแปลงในแต่ละครั้งที่มีการเรียกใช้เมธอด

@ Snowman ฉันรู้ว่าพวกมันจำเป็น .. ฉันแค่บอกว่าจำนวนไบต์ควรจะเป็น 75 ไบต์ (+6 สำหรับ"a"และ"b") แทนที่จะเป็น 69 เพราะความท้าทายที่ถามมาโดยเฉพาะaและbและวิธีการใช้รหัสในปัจจุบัน ตัวแปรอินพุต ไม่แน่ใจว่ากฎระเบียบเกี่ยวกับอะไรเช่นนี้ แต่ฉันคิดว่าควรนับเป็นส่วนตัว มิฉะนั้นคุณสามารถทำได้ในบางภาษาที่มีฟังก์ชั่นที่เรียกใช้งานฟังก์ชั่นพารามิเตอร์จากนั้นให้ฟังก์ชั่นการท้าทายทั้งหมดในพารามิเตอร์โดยไม่นับจำนวนไบต์ ดูเหมือนกฎประเภทมาตรฐานของช่องโหว่
Kevin Cruijssen

1
ฉันรักคำตอบของจาวา พวกมันดูดีมาก - 12 ไบต์ที่นี่, 5 ตรงนั้น, 17 ตรงนี้ ... 70 ไบต์ที่นั่น ... เดี๋ยวก่อน, อะไรนะ? โอ้มันเป็น Java อีกครั้ง ... +1
RudolfJelin

5

Emacs การกดแป้น26 , 25-ish

โครงการ

#nที่จะอ่านเป็นคีย์ที่มีตัวเลขn :

ARETBRETF3UPUPC-SPACEC-EM-WDOWNDOWNC-Y UPC-AC-SPACEC-EM-WDOWNC-EC-YRETF4C-#(n-2)F4

คำอธิบาย

command(s)               explanation                      buffer reads (| = cursor aka point)
-----------------------------------------------------------------------------------------------
A<RET> B<RET>            input starting points            "a\nb\n|"
<F3>                     start new macro                  "a\nb\n|"
<UP><UP>                 move point two lines up          "|a\nb\n"
C-<SPACE> C-E M-W        copy line at point               "a|\nb\n"
<DOWN><DOWN>             move point two lines down        "a\nb\n|"
C-Y                      yank (paste)                     "a\nb\na|"
<UP>                     move point one line up           "a\nb|\na"
C-A C-<SPACE> C-E M-W    copy line at point               "a\nb|\na"
<DOWN>                   move point one line down         "a\nb|\na|"
C-E C-Y <RET>            yank (paste) and add new line    "a\nb|\nab\n|"
<F4>                     stop macro recording             "a\nb|\nab\n|"
C-#(n-3) <F4>            apply macro n-3 times            "a\nb|\nab\nbab\nabbab\n|"

ด้วย n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
ฉันฉีกขาด ในอีกด้านหนึ่งฉันมักจะโหวตบรรณาธิการกอล์ฟ แต่ในทางกลับกันฉันใช้เสียงเรียกเข้า โอเค +1 :)
DJMcMayhem

@DrMcMoylex เพียงแปลงเป็น vim ด้วย Cu Mx แปลงเป็น vim
YSC


4

CJam, 19 17 ไบต์

'a'b{_@_n\+}ri*;;

คำอธิบาย

"a": Push character literal "a" onto the stack.
"b": Push character literal "b" onto the stack.
{_@_p\+}
    {: Block begin.
    _: duplicate top element on the stack
    @: rotate top 3 elements on the stack
    _: duplicate top element on the stack
    n: print string representation
    \: swap top 2 elements on the stack
    +: add, concat
    }: Block end.
r: read token (whitespace-separated)
i: convert to integer
*: multiply, join, repeat, fold (reduce)
;: pop and discard
;: pop and discard

โดยวิธีการจำนวนสายในขณะนี้ปิดหนึ่ง; สุดท้ายที่ควรจะเป็นp ;คุณสามารถได้รับการกำจัดของคำพูดรอบการส่งออกถ้าคุณใช้แทนn pในที่สุดจะช่วยประหยัดไบต์ที่สองมากกว่า'a'b "a""b"
เดนนิส

3

V , 18 ไบต์

ia
bkÀñyjGpgJkñdj

ลองออนไลน์!

หรือรุ่นที่อ่านได้มากขึ้น:

ia
b<esc>kÀñyjGpgJkñdj

คำอธิบาย:

ia
b<esc>          " Insert the starting text and escape back to normal mode
k               " Move up a line
 Àñ       ñ     " Arg1 times:
   yj           "   Yank the current line and the line below
     G          "   Move to the end of the buffer
      p         "   Paste what we just yanked
       gJ       "   Join these two lines
         k      "   Move up one line
           dj   " Delete the last two lines



3

เรติน่า 33 ไบต์

.+
$*
^11
a¶b
+`¶(.+?)1
¶$1¶$%`$1

ลองออนไลน์!

ไบต์ที่บันทึก 10 (!) ต้องขอบคุณ @ MartinEnder !

คำอธิบาย

แปลงอินพุตเป็น unary ลบ2และเพิ่มaและและbจากนั้นแทนที่1s ซ้ำที่เหลือด้วยการต่อเชื่อมของสองสตริงก่อนหน้านี้


บันทึกสองสามไบต์โดยหลีกเลี่ยงการจับที่ไม่จำเป็น: retina.tryitonline.net/ …
Martin Ender

@MartinEnder Nice! ไม่เห็นพลังของ$%` ! และการจับกุมอื่นนั้นเป็นการวางแผนที่ไม่ดี ... น่าทึ่งขอบคุณ!
Dom Hastings

2

แบตช์102 93 ไบต์

@set a=a
@set b=b
@for /l %%i in (2,1,%1)do @call:l
:l
@echo %a%
@set a=%b%&set b=%a%%b%

โชคดีที่ตัวแปรถูกขยายสำหรับทุกบรรทัดก่อนที่การมอบหมายจะมีผลบังคับใช้ดังนั้นฉันสามารถตั้งค่าทั้งสองaและbใช้ค่าเดิมโดยไม่จำเป็นต้องใช้ชั่วคราว แก้ไข: บันทึกแล้ว 9 ไบต์ด้วย @ nephi12


ฉันกำลังจะทำเช่นนี้;) โดยวิธีการที่คุณสามารถบันทึก 8 ไบต์โดยการลบ "exit / b" และเริ่มวนรอบของคุณจาก 2:for /l %%i in (2,1,%1) etc..
nephi12 12

อีกหนึ่งบรรทัด (ขึ้นบรรทัดใหม่) โดยใส่คำสั่ง set ในบรรทัดเดียวกัน@set a=a&set b=bกับที่คุณทำกับคำสั่งสุดท้าย แม้ว่า techncally พวกเขาทั้งหมดจะอยู่ในบรรทัดเดียวกัน ... แต่ที่จะน่าเกลียด ... hmm ...
nephi12

2

สแต็คกอล์ฟของฉันขนาด 63 ไบต์

รับภาษาของฉันที่นี่: https://github.com/cheertarts/Stack-My-Golf

($1=(_(a))($2=(_(b))($2-f:1-f,)?)?)f\($1=(f)($1-p(\n),:f,)?)p\p

อาจเป็นวิธีที่สั้นกว่า แต่นี่เป็นสิ่งที่ชัดเจนที่สุด



2

Perl, 45 +1 = 46 ไบต์

+1 ไบต์สำหรับแฟล็ก -n

$a=a,$b=b;say($a),($a,$b)=($b,$a.$b)for 1..$_

การปรับปรุงเล็กน้อยเหนือโซลูชัน 49- ไบต์ที่มีอยู่ แต่พัฒนาแยกกัน วงเล็บsay($a)มีความจำเป็นเพราะไม่เช่นนั้นมันจะตีความ$a,($a,$b)=($b,$a.$b)ว่าเป็นข้อโต้แย้งsayที่ทำให้เกิดขยะมากกว่าที่เราต้องการ

Perl, 42 ไบต์

$b=<>;$_=a;say,y/ab/bc/,s/c/ab/g while$b--

แนวทางแยกจากโซลูชันด้านบน:

$b=<>;                                       #Read the input into $b
      $_=a;                                  #Create the initial string 'a' stored in $_
           say                               #Print $_ on a new line
               y/ab/bc/                      #Perform a transliteration on $_ as follows:
                                   #Replace 'a' with 'b' and 'b' with 'c' everywhere in $_
                        s/c/ab/g             #Perform a replacement on $_ as follows:
                                   #Replace 'c' with 'ab' everywhere in $_
              ,        ,         while$b--   #Perform the operations separated by commas
                                   #iteratively as long as $b-- remains truthy

ฉันยังไม่มั่นใจว่าฉันไม่สามารถรวมการทับศัพท์และทดแทนเข้ากับการใช้งานที่สั้นลงได้ หากฉันพบหนึ่งฉันจะโพสต์



1

Perl, 48 ไบต์

47 รหัสไบต์ + 1 -nสำหรับ

วิธีการง่าย ๆ ลองใช้ชิ้นส่วนของอาร์เรย์$a[@a]="@a[-2,-1]"แต่ก็จำเป็น$"=""หรือคล้ายกัน :( บันทึก 1 ไบต์ด้วย @ Dada !

@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@

การใช้

perl -nE '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5
a
b
ab
bab
abbab

คุณสามารถบันทึกหนึ่งไบต์โดยใช้@;แทน@aเพื่อให้คุณสามารถละเว้นเครื่องหมายอัฒภาคสุดท้าย (ดูสิ่งที่ฉันหมายถึง?) (ฉันรู้ว่าหนึ่งไบต์ค่อนข้างถูก แต่ฉันไม่มีความคิดที่ดีกว่านี้)
Dada

@ ดาด้าใช่ฉันพยายามแล้ว แต่มันไม่กระทบยอดกับเครื่องของฉันดังนั้นฉันคิดว่าอาจมีบางอย่างแปลก ๆ เกิดขึ้นกับฉัน: perl -pe '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5 syntax error at -e line 1, at EOF Execution of -e aborted due to compilation errors.แต่ไม่คิดว่ามันจะยุติธรรมถ้าหากเพิ่มไม่ได้ ทำให้มันใช้งานได้!
Dom Hastings

แน่ใจว่านี่ไม่เกี่ยวข้องกับ-peแทนที่จะเป็น-nE? ไม่ว่าจะด้วยวิธีใดก็ทำงานได้ในเหมืองดังนั้นจึงอาจเกี่ยวข้องกับเวอร์ชันหรือระบบของคุณใน perl ... แต่เชื่อใจฉันฉันทดสอบและใช้งานได้! ;)
Dada

@ ดาด้าฉันก็เหมือน-nEกัน (ไม่รู้ว่า-peมาจากไหน! ต้องเป็นวันศุกร์ ... ) ฉันจะอัปเดตเมื่อฉันได้รับโม! ขอบคุณสำหรับการแบ่งปัน!
Dom Hastings

1

SOML , 8 ไบต์ (ไม่แข่งขัน)

 a b.{;t⁴+

คำอธิบาย:

 a b.{;t⁴+                                        stack on 1st cycle
 a              push "a"                               ["a"]
   b            push "b"                               ["a","b"]
    .{          repeat input times                     ["a","b"]
      ;         swap the two top things on the stack   ["b","a"]
       t        output the top thing on the stack      ["b","a"]
        ⁴       copy the 2nd from top thing from stack ["b","a","b"]
         +      join them together                     ["b","ab"]

เหตุผลที่นี่ไม่ใช่การแข่งขันเนื่องจากภาษานี้ยังอยู่ในระหว่างการพัฒนาและฉันได้เพิ่มฟังก์ชั่นใหม่สองสามอย่างในขณะที่เขียนสิ่งนี้

นอกจากนี้โพสต์ที่ 1 ใน PPCG!


1
ยินดีต้อนรับสู่ PPCG! โพสต์แรกสุดยอด!
Oliver Ni

1

05AB1E, 15 ไบต์

'a'bVUFX,XYUYJV

1

C , 156 ไบต์ (ไม่มีการเยื้อง)

void f(int n)
{
    char u[999]="a",v[999]="b",*a=u,*b=a+1,*c=v,*d=c+1,*e,i;
    for(i=0;i<n;++i)
    {
        printf("%s\n",a);
        for(e=c;*b++=*e++;);
        e=a;a=c;c=e;e=b+1;b=d;d=e;
    }
}

บัฟเฟอร์สองอัน (&&) เก็บสองบรรทัดสุดท้าย บรรทัดใหม่ล่าสุด (ติดตามด้วยตัวชี้สองตัว: start = c, end = d) จะถูกต่อท้ายหนึ่งบรรทัดที่เก่าที่สุด (start = a, end = b) สลับ (a, b) และ (c, d) และลูป ให้ความสนใจกับขนาดบัฟเฟอร์ก่อนที่จะขอสายมากเกินไป ไม่สั้น (ตามที่คาดไว้ในภาษาระดับต่ำ) แต่สนุกกับการเขียนโค้ด


คุณ hardcoded 5แต่ควรป้อนข้อมูลผู้ใช้
Karl Napf

อืม ... ฉันไม่เห็น "การป้อนข้อมูลผู้ใช้" เป็นข้อกำหนดในจิ๊กซอว์ ... ตามเส้นทางเดียวกับ Perl, Python, C ++, ... คำตอบให้แทนที่ "int main ()" ด้วย "void f (int n)"
ฟิล

Given N (2 <= N), print N lines of the letter Fibonacci series like this (i.e. N = 5)
Karl Napf

การป้อนข้อมูลของผู้ใช้เป็นตัวเลือกที่ไม่ดีในแง่ของคำ ฉันหมายถึงเหมือนไดนามิกNและไม่คงที่ หรือผู้ใช้อาจเป็นคนที่ใช้ฟังก์ชั่น / โปรแกรมของคุณ
Karl Napf

ฉันแก้ไขข้อผิดพลาดโง่ ๆ ที่ไม่ได้คัดลอก nul terminator ฉันได้ใส่ฟังก์ชั่นในสถานะที่อ่านได้ง่ายขึ้นอีกด้วย (มี liners หนึ่งตัวที่ตลก แต่ไม่มีประโยชน์) เพื่อทดสอบฟังก์ชั่นนี้ให้ใช้สิ่งนี้: int main (int n, char ** p) {f (n <2? 5: atoi (p [1]))); return 0;}
Phil


0

Pyth , 17 ไบต์

J,\a\bjP.U=+Js>2J

โปรแกรมที่รับอินพุตของจำนวนเต็มและพิมพ์ผลลัพธ์

ลองออนไลน์!

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

J,\a\bjP.U=+Js>2J  Program. Input: Q
 ,\a\b             Yield the two element list ['a', 'b']
J                  Assign to J
        .U         Reduce over [0, 1, 2, 3, ..., Q] (implicit input):
          =J+        J = J +
              >2J     the last two elements of J
             s        concatenated
       P           All of that except the last element
      j            Join on newlines
                   Implicitly print



0

Mathematica, 49 ไบต์

f@1="a";f@2="b";f@n_:=f[n-2]<>f[n-1];g=f~Array~#&

กำหนดฟังก์ชั่นgรับอินพุตตัวเลขเดียว; ส่งคืนรายการสตริง การดำเนินการ recursive <>ตรงไปตรงมาใช้ประกอบการสตริงเข้าร่วม

Mathematica, 56 ไบต์

NestList[#~StringReplace~{"a"->"b","b"->"ab"}&,"a",#-1]&

ฟังก์ชั่นที่ไม่มีชื่อ, รูปแบบอินพุต / เอาท์พุตเดียวกับด้านบน วิธีการแก้ปัญหานี้ใช้วิธีอื่นในการสร้างสตริง: แต่ละสตริงในรายการเป็นผลลัพธ์ของการแทนที่พร้อมกันในสตริงก่อนหน้าการเกิดขึ้นทั้งหมดของ "a" กับ "b" และการเกิดขึ้นทั้งหมดของ "b" ด้วย "ab"



0

PHP, 53 ไบต์

for($a=b,$b=a;$argv[1]--;$a=($_=$b).$b=$a)echo$b.'
';

บันทึกหนึ่งไบต์โดยใช้เครื่องหมายคำพูดคู่และใส่$bในสตริง
ติตัส

0

C ++ 11, 89 98 ไบต์

+7 ไบต์สำหรับทุกบรรทัดไม่ใช่เฉพาะบรรทัดสุดท้าย +2 ไบต์มากขึ้นสำหรับNการพิมพ์จำนวนบรรทัดไม่ใช่สิ่งที่ใช้ 0

#include<string>
using S=std::string;S f(int n,S a="a",S b="b"){return n-1?a+"\n"+f(n-1,b,a+b):a;}

การใช้งาน:

f(5)

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