このサイトでは、熱力学の法則に従います!


23

そして特に第2の法則孤立システムのエントロピーは時間とともに増加します。

この挑戦のために、

  • 分離されたシステム」は、プログラムまたは機能(以降、「プログラム」と略す)と見なされます。
  • time」の経過は、プログラムの出力の繰り返し実行に対応し、新しいプログラムと見なされます。
  • エントロピー」は、シャノンの1次エントロピー(以下で定義)として解釈されます。これは、文字列の文字の多様性の尺度です。

チャレンジ

プログラムは、同じ言語のプログラムとして実行されたときに、前のものよりもエントロピーの多い文字列を生成する空でない文字列を生成する必要があります。この出力実行プロセスを無限に繰り返すと、エントロピー値の厳密に増加するシーケンスが生成される必要があります

文字列には、Unicode 9.0文字を含めることができます。文字列のシーケンスは(ランダムではなく)確定的でなければなりません。

特定の文字列のエントロピーは、次のように定義されます。一意の文字と文字列内の出現回数を特定します。i番目の一意の文字の頻度p iは、その文字の出現回数を文字列の長さで割ったものです。エントロピーは

ここに画像の説明を入力してください

ここで、合計は文字列のすべての一意の文字に対するものです。技術的には、これは、文字列で観測される周波数によって与えられる分布を持つ離散確率変数のエントロピーに対応します。

LET H K示すにより作成された文字列のエントロピーのk番目のプログラム、およびlet H 0意味を初期プログラムのソースコードのエントロピーを。また、L 0で初期プログラムの長さを文字で示します。シーケンス{ H k }は、チャレンジ要件に従って単調であり、制限されています(既存の文字の数が有限であるため)。したがって、H H∞という制限があります。

スコア提出は(なりH - H 0 /)L 0

  • 分子、H - H 0は、無限時間のスパンでエントロピーを増やすどの程度あなたのコード「従う」の法律に反映されます。
  • denonimator、L 0は、文字単位の(バイト単位ではない)初期コードの長さです。

最高スコアのコードが勝ちます。関係は、最も早い提出/編集を支持して解決されます。

文字列のエントロピーを計算するには、この投稿の最後でJavaScriptスニペット(@flawrの提供および@Dennis@ETHproductionsによる修正)を使用できます。

制限を取得する場合はH ∞があなたの特定のケースでは困難であり、あなたは、任意の下限を使用することができ、言うH 20((あなたが使用してスコアを計算するために、H 20 - H 0)/ L 0)。ただし、いずれにしても、エントロピーの無限シーケンスは厳密に増加している必要があります。

明らかでない場合は、エントロピーのシーケンスが増加しているという説明または簡単な証拠を含めてください。

架空の言語では、コードを検討しaabcab、実行には、文字列生成、cdefgh実行が発生し、cdefghi...

元のコードの一意の文字はabおよびcで、それぞれの周波数は3 / 6、2 / 6および1/6です。そのエントロピーは1.4591です。これはH 0です。

文字列にcdefghはより大きいエントロピーがありaabcabます。これは、特定の文字数に対して、すべての周波数が等しいときにエントロピーが最大化されるため、計算せずにこれを知ることができます。実際、エントロピーH 1は2.5850です。

このストリングcdefghiも、前のものよりも多くのエントロピーを持っています。存在しない文字を追加すると常にエントロピーが増加するため、コンピューティングなしでできるようになりました。実際、H 2は2.8074です。

次の文字列が42チェーンの場合、H 3は2.8074より小さい1になるため、無効になります。

一方、シーケンスが限界と増加エントロピーの文字列を生成する上で行った場合はH = 3、スコアは(3から1.4597)/ 6 = 0.2567であろう。

謝辞

おかげで

  • @xnorは、課題の改善に協力してくれました。特に、反復実行から得られるエントロピーの無限の連鎖が実際に可能であることを確信させてくれました。

  • スコア関数の変更を含むいくつかの提案、および非常に有用なスニペットの作成については、@ flawr

  • スコア関数の以前の定義における本質的な欠点を指摘する@Angs

  • JavaScriptスニペットの修正については@Dennis

  • スニペットの別の修正のための@ETHproductions

  • エントロピーの定義の修正については、@ PeterTaylor

エントロピーを計算するためのスニペット


4
「このサイトでは、熱力学の法則に従います!」[引用が必要]
TuxCrafting

2
ここにソースがあります :-)
ルイスメンドー

1
私は、質問が「ホット」ネットワーク質問に関するものになることを望んでいました。
mbomb007

1
私は...エントロピーを無限に厳密に増やすことは実際に可能ですか?出力を符号なしのバイナリ形式で取得する場合、基本的に[0,255]の範囲の整数のシーケンスです。すべての文字が異なる場合(単なる仮定)にエントロピーが最適である場合、最大のエントロピーを持つ文字列が256バイト長であることを意味しませんか?無限ではありません。または、私の仮定が間違っています。
2016年

2
@Osableその文字列のコピーをそれ自体に添付すると、エントロピーは同じになります。次に、1つの文字を削除すると、わずかに小さくなります。プロセスを反転すると、エントロピーが増加します。最大エントロピーに到達しない場合、永遠に増加し続けることができます
ルイスメンドー

回答:


4

ゼリー、0.68220949

“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v⁵

H 90 = 19.779597644909596802、H 0 = 4.088779347361360882、L 0 = 23

H 90の計算にはlong doubleを使用しました。倍精度浮動小数点数は、H 47 <H 46と誤って報告しました

最初のプログラムは印刷します

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v1010

ここでは、間のコードポイントを持つすべてのUnicode文字のプレースホルダとして機能10万および1,000,000。実際の長さは900,031文字です。

秒プログラムが印刷する

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v101010

次に、印刷します

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v10101010

これらのプログラムはいずれも、100 KBの出力制限があるオンラインインタープリターでは機能しません。ただし、0123456789前述の900,000個の Unicode文字の代わりに印刷するようにプログラムを変更した場合は、オンラインで試すことができます!


5

MATLAB、9.6923e-005 0.005950967872272

H0 =  2.7243140535197345, Hinf = 4.670280547752703, L0 = 327

この新しいバージョンは、最初の「概念実証」の改良バージョンです。このバージョンでは、最初の反復から大きなスコアの増加が得られます。これは、最初のプログラムの出力を「爆破」することによって達成され、後続のすべてのプログラムによって複製されます。それからH0、コードの最も一般的なシンボルをできるだけ多く追加するだけで、最小限のものを見つけようとしました。(これは明らかに減少するだけでなく、同時にH0増加するため、制限がありL0ました。プログラムのサイズに対してプロットされたスコアの推移を見ることができます。サイズを追加または削除するだけでサイズが変わり1ます。)繰り返しはまだ以下の前のバージョンと同等です。

a=['ns}z2e1e1116k5;6111gE16:61kGe1116k6111gE16:6ek7;:61gg3E1g6:6ek7;:61gg3E1'];11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;;disp(['[''',a+1,'''];',0,'a=[''',a,'''];',0,[a-10,']]);'],0,[a-10,']]);']]);

スコアとプログラムの長さ

前のバージョン:

H0 = 4.22764479010266, Hinf = 4.243346286312808, L0 = 162

次のコードは、matlab quineに触発されています。基本的に、それ自体を2回出力します。手がかりは、どの反復にもnコード行とn-1改行記号があること\nです。したがって、n無限に近づくにつれて、コード行と改行の比率は1に近づき、同時にエントロピーが厳密に単調に増加することを保証します。またHinf、コード行と同じ数の改行を含む0番目の世代のコードを考慮するだけで簡単に計算できることも意味します。(これは非常に早く収束するため、実験的に確認できます。)

a=['ns}z2e1kGe1116k6111gE16;:61kGe1116k6111gE16;:6ek7;:61gg3E1g6;:6ek7;:61gg3E1'];
disp(['a=[''',a,'''];',10,'a=[''',a,'''];',10,[a-10,']]);'],10,[a-10,']]);']]);

非常に素晴らしい!あなたは交換する何かを得るだろう10ことで0(そのためのコードの残りの部分をして調整しますか)?Char 0はMatlabによってスペースとして表示されます
ルイスメンドー

提案をありがとう!試してみましょうが、スコアをさらに高めるいくつかの改善点があると思います。これはまず最初に概念の証明でなければなりません:)
flawr

私は今、あなたの提案と他の多くの改善を含めました。
flawr

私はその最適化グラフが好きです:-)
ルイスメンドー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.