Dan khususnya hukum kedua : entropi sistem terisolasi meningkat seiring waktu .
Untuk tantangan ini,
- " Sistem terisolasi " akan dianggap sebagai program atau fungsi (disingkat "program" mulai sekarang);
- Berlalunya " waktu " akan sesuai dengan eksekusi yang berulang dari output program , dianggap sebagai program baru;
- " Entropi " akan dianggap sebagai entropi orde pertama Shannon (akan didefinisikan di bawah), yang merupakan ukuran seberapa beragam karakter string.
Tantangan
Program Anda harus menghasilkan string yang tidak kosong yang ketika dieksekusi sebagai program dalam bahasa yang sama menghasilkan string dengan lebih banyak entropi daripada yang sebelumnya. Mengulangi proses eksekusi-output yang tak terhingga ini harus menghasilkan urutan nilai entropi yang meningkat secara ketat .
String dapat berisi karakter Unicode 9.0 . Urutan string harus deterministik (sebagai lawan acak).
The entropi untuk string yang diberikan akan didefinisikan sebagai berikut. Identifikasi karakter uniknya dan jumlah kemunculannya dalam string. Frekuensi p i dari karakter unik ke- i adalah jumlah kemunculan karakter tersebut dibagi dengan panjang string. Entropi itu kemudian
di mana jumlahnya adalah seluruh karakter unik string. Secara teknis, ini sesuai dengan entropi dari variabel acak diskrit dengan distribusi yang diberikan oleh frekuensi yang diamati dalam string.
Mari H k menyatakan entropi dari string yang dihasilkan oleh k Program -th, dan biarkan H 0 menyatakan entropi dari kode program awal ini. Juga, biarkan L 0 menunjukkan panjang program awal dalam karakter. Urutan { H k } adalah monoton sesuai persyaratan tantangan, dan dibatasi (karena jumlah karakter yang ada terbatas). Karena itu ia memiliki batas, H ∞ .
The skor pengajuan akan menjadi ( H ∞ - H 0 ) / L 0 :
- Pembilangnya, H ∞ - H 0 , mencerminkan sejauh mana kode Anda "mematuhi" hukum peningkatan entropi selama rentang waktu tak terbatas.
- Denonimator, L 0 , adalah panjang kode awal dalam karakter (bukan dalam byte).
Kode dengan skor tertinggi menang . Ikatan akan diselesaikan untuk pengajuan / edit paling awal.
Untuk menghitung entropi string, Anda dapat menggunakan JavaScript potongan (courtesy of @flawr dan dengan koreksi oleh @Dennis dan @ETHproductions ) pada akhir posting ini.
Jika mendapatkan batas H ∞ sulit dalam kasus spesifik Anda, Anda dapat menggunakan batas bawah apa pun, misalnya H 20 , untuk menghitung skor (jadi Anda akan menggunakan ( H 20 - H 0 ) / L 0 ). Tetapi bagaimanapun juga, urutan entropi yang tak terbatas harus meningkat secara ketat.
Harap sertakan penjelasan atau bukti singkat bahwa urutan entropi meningkat, jika itu tidak terbukti.
Contoh
Dalam bahasa fiksi, pertimbangkan kode aabcab
, yang saat dijalankan menghasilkan string cdefgh
, yang saat dijalankan menghasilkan cdefghi
, yang ...
Karakter unik dari kode asli adalah a
, b
dan c
, dengan frekuensi masing-masing 3/6, 2/6 dan 1/6. Entropinya adalah 1,4591. Ini adalah H 0 .
String cdefgh
memiliki lebih banyak entropi daripada aabcab
. Kita dapat mengetahui ini tanpa menghitungnya karena untuk sejumlah karakter tertentu entropi dimaksimalkan ketika semua frekuensinya sama. Memang, entropi H 1 adalah 2,5850.
String cdefghi
lagi memiliki lebih banyak entropi daripada yang sebelumnya. Kita sekarang dapat tanpa menghitung karena menambahkan karakter yang tidak ada selalu meningkatkan entropi. Memang, H 2 adalah 2,8074.
Jika string berikutnya adalah 42
rantai akan menjadi tidak valid, karena H 3 akan menjadi 1, lebih kecil dari 2,8074.
Jika, di sisi lain, urutan melanjutkan menghasilkan string peningkatan entropi dengan batas H ∞ = 3, skornya adalah (3−1.4597) / 6 = 0.2567.
Ucapan Terima Kasih
Terimakasih untuk
@ xnor atas bantuannya memperbaiki tantangan, dan khususnya untuk meyakinkan saya bahwa rantai tak terbatas peningkatan entropi yang diperoleh dari eksekusi berulang memang mungkin;
@ flawr untuk beberapa saran, termasuk memodifikasi fungsi skor, dan untuk menulis cuplikan yang sangat berguna;
@Angs untuk menunjukkan kelemahan penting dalam definisi fungsi skor sebelumnya;
@Dennis untuk koreksi dalam cuplikan JavaScript;
@ETHproduk untuk koreksi lain dalam cuplikan;
@PeterTaylor untuk koreksi dalam definisi entropi.
Cuplikan untuk menghitung entropi
sumber
Jawaban:
Jelly, 0,68220949
H 90 = 19.779597644909596802, H 0 = 4.088779347361360882, L 0 = 23
Saya menggunakan ganda panjang untuk menghitung H 90 . Ketelitian ganda mengapung secara tidak benar melaporkan bahwa H 47 <H 46
Program pertama dicetak
di mana
…
berfungsi sebagai pengganti untuk semua karakter Unicode dengan titik kode antara 100.000 dan 1.000.000 . Panjang sebenarnya adalah 900.031 karakter.Program detik dicetak
yang, pada gilirannya, mencetak
dll.
Tidak satu pun dari program ini yang berfungsi dalam juru bahasa online, yang memiliki batas keluaran 100 KB . Namun, jika kami memodifikasi program untuk mencetak
0123456789
alih-alih 900.000 karakter Unicode yang disebutkan di atas , Anda dapat Coba online!sumber
MATLAB,
9.6923e-0050.005950967872272Versi baru ini adalah versi perbaikan dari "bukti konsep" pertama. Dalam versi ini saya mendapatkan peningkatan skor besar dari iterasi pertama. Ini dicapai dengan "meledakkan" output dari program pertama, yang direplikasi oleh semua yang berikutnya. Kemudian saya juga mencoba mencari minimal
H0
dengan hanya menambahkan simbol kode yang paling umum sebanyak mungkin. (Ini jelas memiliki batas, karena tidak hanya menurunH0
tetapi juga meningkatL0
pada saat yang sama. Anda dapat melihat perkembangan skor diplot terhadap ukuran program di mana ukurannya bervariasi dengan hanya menambah atau menghapus1
.) Berikutnya iterasi masih setara dengan versi sebelumnya di bawah ini.Versi sebelumnya:
Kode berikut diilhami oleh matlab quine . Ini pada dasarnya hanya menampilkan sendiri lagi dua kali . Petunjuknya adalah bahwa untuk setiap iterasi kami memiliki
n
baris kode dann-1
simbol baris baru\n
. Jadi, ketikan
mendekati infinity, rasio garis kode ke baris baru mendekati 1, dan pada saat yang sama ini menjamin bahwa kita memiliki pertumbuhan entropi yang sangat monoton. Itu juga berarti kita dapat dengan mudah menghitungHinf
dengan hanya mempertimbangkan kode generasi ke-nol dengan baris baru yang sama banyaknya sebagai garis kode. (Yang mana dapat secara eksperimental mengkonfirmasi, karena konvergennya cukup cepat.)sumber
10
dengan mengganti0
(dan menyesuaikan sisa kode untuk itu)? Char0
ditampilkan sebagai ruang oleh Matlab