打印字母斐波那契


28

给定N(2 <= N),按如下方式打印字母Fibonacci系列的N行(即N = 5)首先,从a和开始b

a
b

接下来,添加两行。

a
b
ab

继续添加最后两行。

a
b
ab
bab

继续...

a
b
ab
bab
abbab

我们完成了。

提醒,这是,所以字节最少的代码将获胜。



可以是一个最多返回N个术语列表的函数吗?
FlipTack

我们必须打印结果还是可以从函数返回字符串列表?
nimi 2016年

等待,所以它不必为n = 1工作?
苏格拉底凤凰城

另外,我们可以使用基于0的索引吗?
苏格拉底凤凰城

Answers:


10

Python 2,41个字节

@xnor节省了3个字节

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:糟糕!固定。
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;@Ṅ部分
要讲

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,它甚至适用于除just a和以外的任何其他起始字符串b。我不确定是否将"a"and "b"参数计入字节数,因为该问题明确指出应使用aand b。无论如何,Java永远不会赢。;)
Kevin Cruijssen

@KevinCruijssen字符串参数是必需的,因为它们的值在每次调用该方法时都会改变。

@Snowman我知道它们是必需的。.我只是说字节数应该是75字节(for "a"和+6 "b"),而不是69,因为挑战特别要求aand 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只需使用Cu Mx将其转换为vim即可将其转换为vim
YSC

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

MATL,14个字节

97c98ci2-:"yyh

在线尝试!

97c     % Push 'a'
98c     % Push 'b'
i2-     % Input number. Subtract 2
:"      % Repeat that many times
  yy    %   Duplicate the top two elements
  h     %   Concatenate them

3

Python 2,55个字节

def f(n):m='a','b';exec'print m[-2];m+=m[-2]+m[-1],;'*n

3

视网膜,33字节

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

在线尝试!

由于@ MartinEnder,节省了10(!)个字节!

说明

输入转换为一元,减去2并添加ab,然后递归替换剩余1s的前两个字符串的连接。


:通过避免不必要的捕捉保存了几个字节retina.tryitonline.net/...
马丁安德

@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%

幸运的是,变量会在分配生效之前为每一行扩展,因此我可以设置它们ab使用其旧值而无需临时设置。编辑:由于@ nephi12,节省了9个字节。


我正要这样做;)顺便说一句,您可以通过删除“ exit / b”并从2开始循环来保存8个字节:for /l %%i in (2,1,%1) etc..
nephi12

通过将set命令放在@set a=a&set b=b最后一行的同一行中,再进行一次(换行)。尽管从技术上讲,它们都可能在同一行上……但是那太丑了……嗯……
nephi12 2016年


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 for -n

简单的方法。尝试使用数组切片最初$a[@a]="@a[-2,-1]"但必要$"=""或类似:(保存1个字节感谢@ 达达

@;=(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

@Dada我也一样-nE(不知道从哪里来的-pe!一定是星期五...)我会在得到mo时更新它!感谢分享!
唐·黑斯廷斯

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"]

之所以无法与之竞争是因为该语言仍在开发中,我在编写此语言时确实添加了一些新功能。

另外,关于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,但它应该是用户输入
卡尔NAPF

嗯...我不认为“用户输入”是难题中的要求...遵循与Perl,Python,C ++相同的路径,...答案,将“ int main()”替换为“ void f(int n)”。
Phil

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

嗯,用词来说,用户输入是一个错误的选择。我的意思是更喜欢动态N而不是固定。或者用户可能是使用您的功能/程序的人。
Karl Napf

我更正了一个关于不复制nul终止符的愚蠢错误。我还将功能置于更易读的状态(一个衬里很有趣,但并不方便)。要实际测试此功能,请使用以下命令:int main(int n,char ** p){f(n <2?5:atoi(p [1])); return 0;}
Phil

1

PHP,63 62字节

递归版本:

function f($n,$a=a,$b=b){return$n--?"$a
".f($n,$b,$a.$b):'';}

之后的多余空格return
Titus

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

APL,30个字节。

⎕IO必须是1

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

0

Mathematica,49个字节

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

定义一个函数g以单个数字输入;返回字符串列表。使用字符串连接运算符的简单递归实现<>

Mathematica,56个字节

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

未命名的函数,与上面相同的输入/输出格式。此解决方案使用另一种方式来生成字符串:列表中的每个字符串都是在前一个字符串中同时将所有出现的“ a”替换为“ b”以及所有出现的“ b”替换为“ ab”的结果。


0

Groovy,79字节

{println("a\nb");x=['a','b'];(it-2).times{println(y=x.sum());x[0]=x[1];x[1]=y}}


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)

0

Ruby(1.9+)46字节

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.