Друк листа Фібоначчі


28

Враховуючи N (2 <= N ), надрукуйте N рядків літери рядів Фібоначчі так (тобто N = 5) Спочатку почніть з aі b:

a
b

Далі додайте два рядки.

a
b
ab

Продовжуйте додавати останні два рядки.

a
b
ab
bab

Продовжуй...

a
b
ab
bab
abbab

І ми закінчили.

Пам’ятайте, це , тому виграє код з найменшими байтами.



Чи може це бути функція, яка повертає список термінів до N?
FlipTack

Чи потрібно друкувати результат чи ми можемо повернути список рядків з функції?
німі

Зачекайте, значить, він не повинен працювати при n = 1?
Сократичний Фенікс

Чи можемо ми використовувати індексацію на основі 0?
Сократичний Фенікс

Відповіді:


10

Python 2, 41 байт

Збережено 3 байти завдяки @xnor

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

Тест на Ideone

Просто слід рекурсивне визначення.


Це коротше як програма: 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: На жаль, яка помилка! Виправлено.
німі


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);}

неозорий

 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);

}
}

Вам дійсно потрібно відформатувати свій код, що не використовується для гольфу, трохи більше у відповідях. Хоча xD +1, і він працює навіть для будь-яких інших початкових рядків, відмінних від простого aта b. Я не впевнений, чи слід враховувати параметри "a"та "b"параметри підрахунку байтів, оскільки в питанні конкретно зазначено, що він повинен використовуватись aі b. Не те, що Java все одно переможе. ;)
Кевін Круїссен

@KevinCruijssen параметри рядка необхідні, оскільки їх значення змінюються щоразу, коли метод викликається.

@Snowman Я знаю, що вони потрібні. Я просто кажу, що кількість байтів може бути 75 байтів (+6 для "a"і "b"), а не 69, тому що виклик спеціально вимагається aі b, і використовується метод, який використовується в даний момент змінний вхід. Не впевнений, які правила стосуються чогось подібного, але я особисто думаю, що це слід порахувати. Інакше ви можете в деяких мовах мати функцію, яка виконує функцію параметра, а потім просто надати всю функцію виклику в параметрі, не рахуючи його байтів. Звучить як правило стандартного лазівки.
Кевін Круїссен

1
Я люблю відповіді на Java. Вони виділяються так приємно - 12 байт тут, 5 там, 17 тут ... 70 байт там ... зачекайте, що? О, це знову Java ... +1
RudolfJelin

5

Emacs, 26 , 25-іш клавіш

Програма

#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
Я розірваний. З одного боку, я завжди схвалюю редактор-гольф, але з іншого я використовую vim. Ну добре, +1 у будь-якому випадку. :)
DJMcMayhem

@DrMcMoylex просто перетворить його на vim за допомогою Cu Mx
conver

5

JavaScript (ES6), 43 42 байти

Збережено байт завдяки @Arnauld

f=(n,a="a",b="b")=>n&&f(n-!alert(a),b,a+b)

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 !

Пояснення

Перетворює вхід в одинарний, віднімає 2і додає aі b, а потім рекурсивно замінює решту 1s на конкатенацію двох попередніх рядків.


Збережено кілька байтів, уникаючи зайвих зйомок
Martin Ender

@MartinEnder Приємно! Не зовсім бачив силу $%` ! і це інше захоплення було просто поганим плануванням ... Дивовижне, дякую!
Дом Гастінгс

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

Ще один (новий рядок), поставивши задані команди в той самий рядок, @set a=a&set b=bяк ви зробили з останнім. хоча технічно всі вони можуть бути на одній лінії ... але це було б потворно ... хм ...
nephi12


2

Perl, 36 35 байт

Включає +3 для -n

Дайте рахунок на STDIN

perl -M5.010 fibo.pl <<< 5

fibo.pl

#!/usr/bin/perl -n
$_=$'.s/1//.$_,say$`for(a1.b)x$_

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

@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.але не думав, що було б справедливо додати як відповідь, якщо я не зміг би опрацюй!
Дом Гастінгс

Впевнені, що це не пов’язано з -peзамість цього -nE? Так чи інакше, це працює на моєму, тому це, мабуть, пов'язане з вашою версією чи системою Perl ... Але, повірте, я перевірив це, і воно працює! ;)
Дада

@Dada У мене теж те саме -nE(не знаю, звідки -pe! Повинна бути п’ятниця ...) Я оновлю це, коли отримаю мо! Дякую, що поділились!
Дом Гастінгс

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! Чудовий перший пост!
Олівер Ні

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;
    }
}

Два буфери (u & v) зберігають останні два рядки. Найновіший рядок (відслідковується двома вказівниками: start = c, end = d) додається до найстарішого (start = a, end = b). Зміна (a, b) і (c, d) та петля. Зверніть увагу на розмір буфера, перш ніж вимагати занадто багато рядків. Не такий короткий (як очікувалося, мови низького рівня), але кодувати було весело.


Ви жорстко 5
зашифрували,

Хм ... я не бачу "введення користувача" як вимоги в головоломці ... Дотримуючись того самого шляху, як Perl, Python, C ++, ... відповіді, замініть "int main ()" на "void f (int п) ".
Філ

Given N (2 <= N), print N lines of the letter Fibonacci series like this (i.e. N = 5)
Карл Напф

Що ж, введення користувача було поганим вибором у терміні слів. Я мав на увазі більше, як динамічний Nі не фіксований. Або користувачем може бути хтось, хто використовує вашу функцію / програму.
Карл Напф

Я виправив дурну помилку щодо не копіювання нульового термінатора. Я також поставив функцію в більш читабельному стані (один вкладиш смішний, але не зручний). Щоб перевірити цю функцію, скористайтеся цією функцією: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil


0

Піт , 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

APL, 30 байт.

⎕IOповинно бути 1.

{⎕←⍵}¨{⍵∊⍳2:⍵⌷'ab'⋄∊∇¨⍵-⌽⍳2}¨⍳

0

Математика, 49 байт

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

Визначає функцію, що gприймає єдиний числовий вхід; повертає список рядків. Пряма рекурсивна реалізація з використанням оператора з'єднання рядків <>.

Математика, 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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.