長さがnの次のフィボナッチ数である別のプログラムを出力する長さnのプログラムを作成します。新しいプログラムは同じことをしなければなりません-長さが次のフィボナッチ数などである別のプログラムを出力します
。n自体(元のプログラムの長さ)はフィボナッチ数である必要はありませんが、そうであれば良いでしょう。
最短のコードが優先されます。
外部リソースなし、ASCIIのみ、無料のコンパイラ/インタプリタが必要です。
出力が改行で終わる場合も、カウントされます。
長さがnの次のフィボナッチ数である別のプログラムを出力する長さnのプログラムを作成します。新しいプログラムは同じことをしなければなりません-長さが次のフィボナッチ数などである別のプログラムを出力します
。n自体(元のプログラムの長さ)はフィボナッチ数である必要はありませんが、そうであれば良いでしょう。
最短のコードが優先されます。
外部リソースなし、ASCIIのみ、無料のコンパイラ/インタプリタが必要です。
出力が改行で終わる場合も、カウントされます。
回答:
あなたの言語を試してみました。
7{9\@5mq)2/*')*\"_~"}_~
9は (22*0.618 + 0.5 - 1)/1.618 + 1
。
*1.618
2つの数字を繰り返し加算する代わりに、独自の長さを計算します。最初のバージョンでは、{
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
です。
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はサポートしていません)を出力していました。修繕
{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$~' ";
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の答えに似ています。
print
end=''
引数を指定しない限り、常に改行が追加されます。
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'
(function q(w,e){return ('('+q+')('+e+','+(s=w+e)+')'+Array(s).join('/')).substr(0,s)})(55,89)
よく知られたJavaScript Quineに基づいて、これはほぼ同じ関数を返しますが、その後にスラッシュが続くだけで、合計するとNの次のフィボナッチ数である144になります。
Nはフィボナッチ数ではありませんが、「いい」だけでした。
p = (my answer)
それp = eval(p)
を数回使用してテストしていましたが、196418まで到達しました ...その処理時間が> 1秒だったのでテストを終了しました:Pしかし、それはさらに続けることができると思います。
p=eval(p)
、チェックもしてくださいp.length
。987に達すると、フィボナッチ数ではなく、長さ1598を取得します。
({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
、ここで置き換えることができます(ただし、私は怠け者です:)。
LeafCount
。:-)文字数を使用するように変更するつもりはありませんが、必要に応じて気分を害することなく削除できます。
p,c=55,89;exec(s:="print((a:=f'p,c={c},{p+c};exec(s:=%r)'%s)+'#'*(c-len(a)))")
int
またはBigInteger
)