フィボナッチプログラムの長さ


14

長さがnの次のフィボナッチ数である別のプログラムを出力する長さnのプログラムを作成します。新しいプログラムは同じことをしなければなりません-長さが次のフィボナッチ数などである別のプログラムを出力します
。n自体(元のプログラムの長さ)はフィボナッチ数である必要はありませんが、そうであれば良いでしょう。

最短のコードが優先されます。

外部リソースなし、ASCIIのみ、無料のコンパイラ/インタプリタが必要です。
出力が改行で終わる場合も、カウントされます。


これは永遠に続ける必要がありますか?(intまたはBigInteger
ジャスティン14年

1
@Quincunx intの制限またはコンパイラ/インタープリターの制限のどちらか早いほうで動作を停止しても問題ありません。私はそれが10000以上になると期待しています。
aditsu

1
元のプログラムまたはその後生成されるプログラムで、空白、コメント、または任意の長い変数/関数/クラス名の使用に制限はありますか?
ジョナサンプラノ14年

1
プログラムは独自のソースコードを読み取ることができますか、それとも真の準クインを探していますか?
histocrat

@JonathanPullano制限はありません。有効なプログラムである必要があります
aditsu 14年

回答:


5

CJam、 26 23

あなたの言語を試してみました。

7{9\@5mq)2/*')*\"_~"}_~

9は (22*0.618 + 0.5 - 1)/1.618 + 1

*1.6182つの数字を繰り返し加算する代わりに、独自の長さを計算します。最初のバージョンでは、{likeの前に出力が埋められ、1)))))))))それらの文字自体がカウントされます。結果を言ってくださいn。全長はでn+22、前の新しい長さ{(n+22)*1.618-22、丸みを帯びました。の数を数えるには1減らし)ます。そうすると、ほぼに等しくなり(n+8)*1.618ます。

古いバージョン:

-3{1\@5mq)2/*E+')*\"_~"}_~

番号14は24*0.618 + 0.5 - 1です。


非常に印象的!
デニス14年

新しい勝者がいると思います:)
aditsu 14年

7

Python 2、160バイト

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1'
c=s
l=len(s%c)+4
a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1)
print s%`c`

これは真の準クインです。独自のソースを読み取りませんが、生成します。最初の出力(末尾に改行があります):

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=1

第二:

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111

編集:おっと。;s からs に変更したときに文字列を変更するのを忘れた1ため、2番目の出力は余分なセミコロン(Pythonはサポートしていません)を出力していました。修繕


私は...それは約3回の反復後に動作を停止し怖い
aditsu

@aditsu何?Pythonには整数のサイズに制限がありますか?!(または、カウントがフィボナッチ/スキップ/何かではないということですか?)ああ。文字列XDを変更するのを忘れた
ジャスティン14年

7

CJam、41 31バイト

{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~

オンラインでお試しください。

出力

$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'); echo
{1$+S@]_1=4+1$`,-S*"2$~"}34 21 2$~
$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~') | wc -c
34
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')); echo
{1$+S@]_1=4+1$`,-S*"2$~"}55 34                      2$~
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')) | wc -c
55
$ cjam (cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
bash: syntax error near unexpected token `cjam'
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
{1$+S@]_1=4+1$`,-S*"2$~"}89 55                                                        2$~
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))) | wc -c
89

使い方

{       "                                                   {…} 21 13                     ";
  1$+   " Duplicate the higher number and add.              {…} 21 34                     ";
  S@    " Push a space and rotate the lower number on top.  {…} 34 ' ' 21                 ";
  ]     " Wrap the stack into an array.                     [ {…} 34 ' ' 21 ]             ";
  _1=   " Push the second element of the array.             [ {…} 34 ' ' 21 ] 34          ";
  4+    " Add 4 to it.                                      [ {…} 34 ' ' 21 ] 38          ";
  1$`,  " Push the length of the stringified array.         [ {…} 34 ' ' 21 ] 38 37       ";
  -S*   " Subtract and push that many spaces.               [ {…} 34 ' ' 21 ] ' '         ";
  "2$~" " Push the string '2$~'.                            [ {…} 34 ' ' 21 ] ' ' '2$~'   ";
}       "                                                   {…}                           ";

21D     " Push 21 and 13.                                   {…} 21 13                     ";
2$~     " Copy the code block an evaluate.                  [ {…} 34 ' ' 21 ] ' ' '2$~'   ";

2
ニース、最大100万人まで確認済み:)説明ではありますが、39ではなく37だと思います。
aditsu 14年

@aditsu:あなたが今までコメントを編集したことに気づきませんでした。確かに37です。ありがとうございます。
デニス14年

6

パイソン-89

g="%(s,b,a+b);print o.ljust(b-1)";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)#####

私の完璧なキャラクター数はなくなりました。; _; TheRareが改行を指摘してくれたこと、QuincunxがPython 2を使って2文字を削ることを提案してくれたことに感謝します。

編集:今では#なく、より多くのsを使用します1。12文字短くなります。

編集2 2:94文字!いくつかの繰り返しを排除しました。>:3

編集3:Python 2のより短いreprの代替。

編集4:出力は今より短い文字です。

編集5%rそれを短縮するための使用は、@ primoによる別の質問に対する回答から取られました。

編集6:より短く。:D

Python 3バージョンは次のとおりです。

g="%(s,b,a+b);print(o.ljust(b-1))";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)####

この答えは、@ Quincunxの答えに似ています。


printend=''引数を指定しない限り、常に改行が追加されます。
seequ 14年

なぜPython 2を使用しないのですか?:s,a,b="s,a,b=%s,%i,%i;o=s%%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'",89,144;o=s%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'
Justin 14年

@Quincunx私はしなければなりません!ありがとう:D
cjfaure 14年

90文字のプログラムはpython 3では機能せず、145文字の出力(フィボナッチ数ではありません)
aditsu 14年

@aditsu修正済み。:3
cjfaure 14年

2

JavaScript、94

(function q(w,e){return ('('+q+')('+e+','+(s=w+e)+')'+Array(s).join('/')).substr(0,s)})(55,89)

よく知られたJavaScript Quineに基づいて、これはほぼ同じ関数を返しますが、その後にスラッシュが続くだけで、合計するとNの次のフィボナッチ数である144になります。

Nはフィボナッチ数ではありませんが、「いい」だけでした。


それは1000年に通過したときには正常に動作していないよう
aditsu

1000何?反復?
ジェイコブ14年

いいえ、プログラムの長さ
aditsu 14年

うーん...私はChromeのコンソールでp = (my answer)それp = eval(p)を数回使用してテストしていましたが、196418まで到達しました ...その処理時間が> 1秒だったのでテストを終了しました:Pしかし、それはさらに続けることができると思います。
ジェイコブ14年

理解できない..動作が停止したり、遅すぎるとは言わなかった。私はそれが正しく動作しないと言いました。ただやるだけでなくp=eval(p)、チェックもしてくださいp.length。987に達すると、フィボナッチ数ではなく、長さ1598を取得します。
aditsu

0

Mathematica

({0};
 With[{n = Ceiling[ InverseFunction[Fibonacci]@LeafCount@#0 ], l = Length[#0[[1, 1]]]},
    #0 /. {0..} -> ConstantArray[0, Fibonacci[n+1] - LeafCount[#0] + l]
 ]) &

これは非常に単純な実装です(つまり、ここでは難読化は行われません)。これは、正しい長さを達成するために少しのパディングで自分自身を返す匿名関数です。Mathematicaはホモイコニックです。コードとデータはどちらもMathematica式として表され、コードをその場で簡単に修正/生成することができます。これは、文字数がコード長の自然な尺度ではないことも意味します。Epxressionサイズ(「リーフカウント」)です。このバージョンは、コード長の尺度としてリーフカウントに基づいています。

この匿名関数を変数に割り当てf(読みやすい方法で何が起こるかを示すことができます)、それを1、2、3、...回呼び出し続け、戻り値の長さを測定するたびに、これが我々が得る:

In[]:= f // LeafCount
Out[]= 42

In[]:= f[] // LeafCount
Out[]= 89

In[]:= f[][] // LeafCount
Out[]= 144

In[]:= f[][][] // LeafCount
Out[]= 233

無料のインタープリター要件について:MathematicaはRaspberry Piに対して無料です。それ以外の場合、このコードはMathics(オープンソース)に移植するのが簡単です。Mathicsに欠けている唯一のものはInverseFunctionここで置き換えることができます(ただし、私は怠け者です:)。


うわー、私はMathematicaがPiに無料であることを知りませんでした。ただし、プログラムは標準出力に文字を出力することになっているため、カウントする必要があります。
aditsu

@aditsu実際、私はこれをチャレンジで競うよりも楽しみのために行いましたLeafCount。:-)文字数を使用するように変更するつもりはありませんが、必要に応じて気分を害することなく削除できます。
ザボルクス14年

ああなるほど。そのままにして、削除する必要はありません。
aditsu

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.