Bu sitede termodinamik yasalarına uyuyoruz!


23

Ve özellikle de ikinci kanun : yalıtılmış bir sistemin entropisi zamanla artar .

Bu meydan okuma için

  • " İzole edilmiş bir sistem " bir program veya işlev olarak alınacaktır (bundan böyle "program" olarak kısaltılır);
  • " Zaman " ın geçilmesi , program çıktısının yeni bir program olarak kabul edilen yinelenen uygulamalarına karşılık gelir ;
  • " Entropy ", Shannon'un birinci sıradaki entropisi olarak alınacaktır (aşağıda tanımlanacaktır);

Meydan okuma

Programınız, aynı dilde bir program olarak yürütüldüğünde öncekinden daha entropi içeren bir dize üreten boş olmayan bir dize üretmelidir. Bu yinelemeli yineleme, çıkış işlemi kesinlikle artan bir entropi değerleri dizisi üretmelidir .

Dizeler, herhangi bir Unicode 9.0 karakteri içerebilir . Dizelerin sırası deterministik olmalıdır (rastgele yerine).

Entropi aşağıdaki gibi belirli bir dizeye ilişkin belirlenecektir. Dizedeki benzersiz karakterleri ve bunların sayısını tanımlayın. Frekans s ı arasında i -inci kendine has bir özelliğidir, dizinin uzunluğu ile bölünmesi bu karakterin yineleme sayısıdır. Entropi o zaman

görüntü tanımını buraya girin

Toplam, dizenin tüm benzersiz karakterlerinin üzerindedir. Teknik olarak, bu , dizede gözlenen frekanslar tarafından verilen dağılımla birlikte , ayrı bir rasgele değişkenin entropisine karşılık gelir .

Let H k göstermektedirler tarafından üretilen dize entropi k -inci programı ve izin H 0 belirtmek başlangıçtaki programın kodunun entropisinin. Ayrıca, L 0 ' ın ilk programın uzunluğunu karakter cinsinden göstermesine izin verin . { H k } dizisi , zorluk şartlarına göre monotondur ve sınırlanır (çünkü mevcut karakterlerin sayısı sonludur). Bu nedenle bir sınırı vardır, H .

bir gönderme (olacaktır lH - lH 0 /) L 0 :

  • Pay, H - H 0 , için ne derece yansıttığı kodunuzu "itaat" sonsuz zaman aralığında entropinin artma yasası.
  • Denonimator, L 0 , (değil bayt) karakter başlangıç kodunun uzunluğudur.

En yüksek puana sahip kod kazanır . En erken başvuru / düzenleme lehine bağlar çözülecektir.

Bir dizenin entropisini hesaplamak için, bu yazının sonunda JavaScript snippet'ini ( @flawr izniyle ve düzeltmeleri ile @Dennis ve @ETHproductions ) kullanabilirsiniz.

Limit elde ederse H özel durumda zordur, öyle, herhangi bir düşük bağlı kullanabilirsiniz H 20 (eğer (kullanırsınız böylece skor hesaplama, H 20 - H 0 ) / L 0 ). Ancak, her durumda, sonsuz entropi dizisi kesinlikle artmalıdır.

Lütfen, açık değilse, entropi dizilerinin arttığına dair bir açıklama veya kısa bir kanıt ekleyin.

Örnek

Kurgusal dilinde kod düşünün aabcabçalışma dizesi üretir, cdefghçalışma üretir, cdefghiki ...,

Orijinal kod benzersiz karakterlerdir a, bve cilgili frekansları 3/6, 2/6 ve 6/1 ile. Entropisi 1.4591'dir. Bu H 0 .

Dize cdefghdaha entropiye sahiptir aabcab. Bunu hesaplamadan anlayabiliriz çünkü belirli sayıda karakter için bütün frekanslar eşit olduğunda entropi en üst düzeye çıkarılır. Gerçekten de, entropi H 1 2,5850 olan.

Dize cdefghitekrar öncekinden daha fazla entropi vardır. Şimdi hesaplama yapmadan yapabiliriz, çünkü var olmayan bir karakter eklemek her zaman entropiyi artırır. Gerçekten de, H 2 2,8074 olan.

Bir sonraki dize olsaydı 42, çünkü zincir, geçersiz olacağını H 3 2.8074 daha küçük 1, olur.

Öte yandan, dizi H = 3 sınırında artan entropi dizeleri üretmeye devam ederse, puan (3−1.4597) / 6 = 0.2567 olur.

Teşekkür

Sayesinde

  • Zorluğu geliştirme konusundaki yardımları için ve özellikle beni yinelenen uygulamadan elde edilen artan artan entropinin zincirlerinin mümkün olduğuna inandırdığı için;

  • @flawr , puan işlevini değiştirmek ve çok faydalı snippet'i yazmak dahil olmak üzere çeşitli öneriler için;

  • @ Skor fonksiyonunun önceki bir tanımında önemli bir dezavantaja işaret etme;

  • JavaScript snippet'indeki düzeltme için @Dennis ;

  • Pasajda başka bir düzeltme için @ETHproductions ;

  • Entropi tanımında bir düzeltme için @PeterTaylor .

Entropiyi hesaplamak için pasaj


4
“Bu sitede termodinamik yasalarına uyuyoruz!” [Kaynak belirtilmeli]
TuxCrafting

2
İşte kaynak :-)
Luis Mendo

1
Sorunun "Sıcak" Ağ Soruları ile ilgili olacağını umuyordum.
mbomb007

1
Merak ediyordum da ... entropiyi sınırsızca arttırmak gerçekten mümkün mü? Çıkışı işaretsiz ikili biçimde alırsam, temelde [0,255] aralığında bir tam sayı dizisidir. Bütün karakterler farklı olduğunda entropi en uygunsa (sadece bir varsayım), en büyük entropiye sahip dizginin 256 bayt olduğu anlamına gelmez mi? Sonsuz olmaktan uzak. Ya da benim varsayım yanlıştır.
Osable

2
@Osable Bu dizgenin bir kopyasını kendine eklerseniz entropi aynı olur. Sonra bir char çıkarın ve biraz daha küçük olacaktır. Süreci ters çevirin ve entropiyi arttırdınız. Asla maksimum entropiye ulaşmayı başaramazsanız, sonsuza dek artmaya devam edebilirsiniz
Luis Mendo

Yanıtlar:


4

Jöle, 0.68220949

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

H 90 = 19,779597644909596802 H 0 = 4,088779347361360882 L 0 = 23

H 90'ı hesaplamak için uzun çiftler kullandım . Çift duyarlıklı yüzdürme yanlış bildirildi H 47 <H 46

İlk program yazdırıyor

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

burada arasında kod noktalarına Tüm Unicode karakterleri için bir tutucu olarak hizmet eder 100,000 ve 1,000,000 . Gerçek uzunluk 900.031 karakterdir.

Saniye programı yazdırılıyor

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

sırayla

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

vb.

Bu programların hiçbiri 100 KB çıkış sınırına sahip çevrimiçi tercümanlarda çalışmamaktadır. Bununla birlikte, 0123456789söz konusu 900.000 Unicode karakterleri yerine programı yazdırması için değiştirirsek, çevrimiçi deneyebilirsiniz!


5

MATLAB, 9.6923e-005 0.005950967872272

H0 =  2.7243140535197345, Hinf = 4.670280547752703, L0 = 327

Bu yeni sürüm, ilk "kavram kanıtı" nın geliştirilmiş bir versiyonudur. Bu versiyonda ilk tekrardan büyük bir puan artışı alıyorum. Bu, sonraki programların tümü tarafından kopyalanan ilk programın çıktısını "şişirerek" başarıldı. Sonra en az H0kodun en sık kullanılan simgesini olabildiğince fazla ekleyerek de bulmaya çalıştım . (Açıkça bir sınırı vardı, çünkü sadece azalmıyor , aynı zamanda H0da artıyor L0. Boyutun sadece eklenerek veya çıkarılarak değiştirildiği programın boyutuna göre çizilen puanın gelişimini görebilirsiniz 1.) yinelemeler hala aşağıdaki önceki sürüme eşittir.

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

Puan vs Program uzunluğu

Önceki versiyon:

H0 = 4.22764479010266, Hinf = 4.243346286312808, L0 = 162

Aşağıdaki kod matlab quine'den esinlenmiştir . Temelde iki kez tekrar çıktı . Buradaki ipucu, herhangi bir yineleme için nkod satırlarına ve n-1yeni satır sembollerine sahip olduğumuzdur \n. Yani nsonsuza yaklaşır, satırsonlarına kod satırları oranı biz entropi bir kesinlikle monoton bir büyüme olduğunu 1 yaklaşır, ve aynı zamanda bu garantiler. Bu aynı zamanda Hinfsadece sıfırıncı nesil kodu eşit sayıda yeni satırla kod satırları olarak göz önüne alarak kolayca hesaplayabileceğimiz anlamına gelir . (Hangisi deneysel olarak onaylayabiliyor, oldukça hızlı bir şekilde birleşiyor.)

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

Çok hoş! Değiştirmekte şey kazanmak istiyorsunuz 10tarafından 0(bunun için kod dinlenme ve ayarlama)? Char 0, Matlab
Luis Mendo

Önerin için teşekkürler! Denememe izin verin, ancak skoru çok daha fazla artıracak başka bazı iyileştirmeler olduğunu düşünüyorum. Bu her şeyden önce kavramının bir kanıtı olmalı :)
kusur

Şimdi önerinizi bir sürü başka iyileştirme ile birlikte ekledim.
kusur

Bu optimizasyon grafiğini
beğeniyorum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.