手紙フィボナッチを印刷する


28

与えられたN(2 <= N)、印刷Nのこのような手紙フィボナッチ数列のラインを(すなわちN = 5)まず、で始まるab

a
b

次に、2行を追加します。

a
b
ab

最後の2行を追加し続けます。

a
b
ab
bab

立ち止まるな...

a
b
ab
bab
abbab

これで完了です。

Remmeber、これはなので、バイト数が最も少ないコードが優先されます。



Nまでの用語のリストを返す関数にできますか?
FlipTack

結果を出力する必要がありますか、または関数から文字列のリストを返すことができますか?
-nimi

待って、n = 1で動作する必要はありませんか?
ソクラ

また、0ベースのインデックスを使用できますか?
ソクラティックフェニックス

回答:


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;@Ṅ部分を下ろしましたが、そこからどこに行くべきかわかりませんでした...今はわかっています:
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 ..あなたの答えに、もう少しあなたのungolfedコードをフォーマットする必要があり、それも単なるとは異なる他の開始文字列のために働くab"a""b"パラメータがバイトカウントにカウントされるべきかどうかはわかりませんが、質問では具体的にaand を使用する必要があると述べていますb。とにかくJavaが勝つわけではありません。;)
ケビンクルーイッセン

@KevinCruijssen文字列パラメーターは、メソッドが呼び出されるたびに値が変わるため必要です。

私は、彼らが必要としている知っている@Snowman ..私はちょうどバイトカウントは多分75バイト(6用であることを言っている"a""b"挑戦を具体的にするために求められているため)の代わりに、69 abし、現在のコード-切り取ら/メソッド用途変数入力。このようなものに関するルールが何であるかはわかりませんが、私は個人的にそれを数えるべきだと思います。それ以外の場合、一部の言語では、パラメーター関数を実行する関数を使用し、そのバイトをカウントせずにパラメーター内のチャレンジ関数全体を単純に指定できます。標準的な抜け穴タイプのルールのように聞こえます。
ケビンCruijssen 16年

1
Javaの回答が大好きです。彼らはとても素晴らしい-ここに12バイト、そこに5バイト、ここに17バイト...そこに70バイト...待って、何?ああ、またジャワです... +1
ルドルフジェリン

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のおかげで1バイト節約

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

ところで、文字列の数は現在1つずれています。最後p;。のn代わりにを使用すると、出力を囲む引用符を取り除くことができますp。最後に、で'a'b2バイト節約します"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

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(!)バイト節約できました

説明

入力を単項に変換し、2andを減算および加算してaからb、残り1のsを前の2つの文字列の連結で再帰的に置き換えます。


保存された不要なキャプチャを回避することによって数バイト: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%

幸いなことに、変数は割り当てが有効になる前にすべての行で展開されるため、一時を必要とせずに両方aを設定bし、古い値を使用できます。編集:@ nephi12のおかげで9バイト保存されました。


私はこれをやろうとしていました;)ところで、「exit / b」を削除し、2からループを開始することで8バイトを節約できます:for /l %%i in (2,1,%1) etc..
nephi12

@set a=a&set b=b最後の1 行で行ったのと同じ行にsetコマンドを配置することにより、もう1つ(改行)。技術的には、それらはすべて同じ行にある可能性があります...しかしそれはいでしょう...うーん
...-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バイト

-nフラグの+1バイト

$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]"が、それが必要$"=""または類似しています:(。@ Dadaのおかげで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

@;代わりにを使用して1バイトを保存できるため@a、最後のセミコロンを省略できます(どういう意味ですか?)。(私は知っている、1バイトはかなり安いが、私はより良いアイデアを持っていなかった..)
ダダ

@ダダはい、私はそれを試しましたが、それは私のマシンでコンパイルされないので、おそらく私のものに奇妙なことが起こっていると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から来たのかわかりません!金曜日でなければなりません...)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へようこそ!素晴らしい最初の投稿!
オリバー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;
    }
}

2つのバッファ(u&v)は最後の2行を保存します。最新の行(2つのポインターで追跡:start = c、end = d)は、最も古い行(start = a、end = b)に追加されます。(a、b)と(c、d)を交換し、ループします。過剰な行を要求する前に、バッファサイズに注意してください。それほど短くはありませんが(低レベル言語で予想されるように)、コーディングは楽しかったです。


あなたはハードコード5が、それはユーザーの入力する必要があります
カール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)
カールナップ16年

まあ、ユーザーの入力は言葉の面で悪い選択でした。私はもっ​​と動的でN、修正されていないことを意味しました。または、ユーザーはあなたの関数/プログラムを使用する誰かかもしれません。
カールナップ16年

NULターミネーターをコピーしないという愚かな間違いを修正しました。また、関数をより読みやすい状態にしました(1つのライナーは面白いですが、便利ではありません)。この関数を実際にテストするには、これを使用します。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
タイタス

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

PHP、53バイト

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

二重引用符を使用$bして文字列を挿入することにより、1バイトを節約します。
タイタス

0

C ++ 11、89 98バイト

最後の行だけでなく、すべての行で+7バイト。N0から始まるものではなく、印刷される行数が+2バイト増えます。

#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.