ในเว็บไซต์นี้เราเชื่อฟังกฎหมายของอุณหพลศาสตร์!


23

และโดยเฉพาะอย่างยิ่งกฎหมายที่สอง : เอนโทรปีของแยกระบบเพิ่มขึ้นเมื่อเวลาผ่านไป

สำหรับความท้าทายนี้

  • " ระบบแยก " จะถูกนำไปเป็นโปรแกรมหรือฟังก์ชั่น (ตัวย่อเป็น "โปรแกรม" นับจากนี้เป็นต้นไป);
  • การผ่านของ " เวลา " จะสอดคล้องกับการประมวลผลซ้ำของเอาต์พุตของโปรแกรมซึ่งถือว่าเป็นโปรแกรมใหม่
  • " เอนโทรปี " จะถูกใช้เป็นเอนโทรปีลำดับแรกของแชนนอน (จะถูกกำหนดไว้ด้านล่าง) ซึ่งเป็นการวัดความหลากหลายของตัวละครของสตริง

ความท้าทาย

โปรแกรมของคุณควรสร้างสตริงที่ไม่ว่างเปล่าซึ่งเมื่อเรียกใช้งานเป็นโปรแกรมในภาษาเดียวกันจะสร้างสตริงที่มีเอนโทรปีมากกว่าสตริงก่อนหน้า อนันต์วนนี้ขั้นตอนการดำเนินการที่การส่งออกจะต้องผลิตลำดับที่เพิ่มขึ้นอย่างเคร่งครัดของค่าเอนโทรปี

สตริงสามารถมีอักขระ Unicode 9.0ได้ ลำดับของสตริงจะต้องกำหนดไว้ล่วงหน้า (เมื่อเทียบกับการสุ่ม)

เอนโทรปีสำหรับสตริงที่กำหนดจะได้รับการกำหนดไว้ดังนี้ ระบุอักขระที่ไม่ซ้ำและจำนวนครั้งที่ปรากฏในสตริง ความถี่p iของอักขระเฉพาะi -th คือจำนวนการเกิดขึ้นของอักขระนั้นหารด้วยความยาวของสตริง เอนโทรปีคืออะไร

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่ผลรวมอยู่เหนืออักขระเฉพาะทั้งหมดของสตริง ในทางเทคนิคแล้วสิ่งนี้สอดคล้องกับเอนโทรปีของตัวแปรสุ่มแบบไม่ต่อเนื่องโดยมีการแจกแจงตามความถี่ที่สังเกตได้ในสตริง

ให้H kแสดงถึงเอนโทรปีของสตริงที่สร้างโดยโปรแกรมk -th และให้H 0แสดงถึงเอนโทรปีของรหัสโปรแกรมเริ่มต้น นอกจากนี้ให้L 0แทนความยาวของโปรแกรมเริ่มต้นเป็นตัวอักษร ลำดับ { H k } เป็นเสียงเดียวตามข้อกำหนดของการท้าทายและถูก จำกัด ขอบเขต (เนื่องจากจำนวนอักขระที่มีอยู่มี จำกัด ) ดังนั้นมันมีขีด จำกัด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 ) แต่ในกรณีใด ๆ ลำดับอนันต์ของเอนโทรปีจะต้องเพิ่มขึ้นอย่างเคร่งครัด

โปรดระบุคำอธิบายหรือหลักฐานสั้น ๆ ว่าลำดับของการเพิ่มขึ้นของ entropies หากไม่ชัดเจน

ตัวอย่าง

ในภาษาสมมติให้พิจารณาโค้ดaabcabซึ่งเมื่อ run สร้างสตริงcdefghซึ่งเมื่อ run สร้างcdefghiขึ้นซึ่ง ...

ตัวละครที่เป็นเอกลักษณ์ของรหัสเดิมa, bและ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จะเป็น 1 มีขนาดเล็กกว่า 2.8074

หากในทางกลับกันลำดับก็เกิดการผลิตสายของเอนโทรปีที่เพิ่มขึ้นด้วยขีด จำกัดH = 3 คะแนนจะเป็น (3 (1.4597) / 6 = 0.2567

กิตติกรรมประกาศ

ขอบคุณ

  • @ xnorสำหรับความช่วยเหลือของเขาในการปรับปรุงความท้าทายและโดยเฉพาะอย่างยิ่งสำหรับการโน้มน้าวใจฉันว่าโซ่ที่ไม่มีที่สิ้นสุดของการเพิ่มเอนโทรปีที่ได้รับจากการกระทำซ้ำแล้วซ้ำอีกเป็นไปได้จริง;

  • @ flawrสำหรับคำแนะนำหลายประการรวมถึงการแก้ไขฟังก์ชั่นคะแนนและสำหรับการเขียนตัวอย่างที่มีประโยชน์มาก

  • @ คำตอบสำหรับการชี้ให้เห็นข้อเสียเปรียบที่สำคัญในคำจำกัดความก่อนหน้านี้ของฟังก์ชันคะแนน

  • @Dennisสำหรับการแก้ไขในตัวอย่าง JavaScript;

  • @ETHproductionsสำหรับการแก้ไขอื่นในตัวอย่าง

  • @PeterTaylorสำหรับการแก้ไขในความหมายของเอนโทรปี

ตัวอย่างสำหรับการคำนวณเอนโทรปี


4
“ ในเว็บไซต์นี้เราเชื่อฟังกฎของอุณหพลศาสตร์!” [จำเป็นต้องมีการอ้างอิง]
TuxCrafting

2
นี่คือที่มา :-)
Luis Mendo

1
ฉันหวังว่าคำถามจะเกี่ยวกับคำถามเครือข่าย "ร้อนแรง"
mbomb007

1
ฉันสงสัยว่า ... เป็นไปได้หรือไม่ที่จะเพิ่มเอนโทรปีอย่างเคร่งครัด? ถ้าฉันเอาผลลัพธ์ออกมาในรูปแบบไบนารีที่ไม่ได้ลงนามมันเป็นลำดับของจำนวนเต็มในช่วง [0,255] ถ้าเอนโทรปีเหมาะสมที่สุดเมื่อตัวละครทุกตัวแตกต่างกัน (เป็นเพียงข้อสันนิษฐาน) มันจะไม่แปลว่าสายที่มีเอนโทรปีที่ใหญ่ที่สุดคือ 256 ไบต์หรือไม่? มันไกลจากการไม่มีที่สิ้นสุด หรือการสันนิษฐานของฉันผิด
Osable

2
@Osable แนบสำเนาของสตริงนั้นไปยังตัวเองและเอนโทรปีจะเหมือนกัน จากนั้นลบถ่านหนึ่งอันออกและมันจะเล็กลงเล็กน้อย ย้อนกลับกระบวนการและคุณเพิ่มเอนโทรปี หากคุณจัดการที่จะไม่เข้าถึงเอนโทรปีสูงสุดคุณสามารถเพิ่มขึ้นเรื่อย ๆ ได้ตลอดไป
Luis Mendo

คำตอบ:


4

เยลลี่, 0.68220949

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

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

ผมใช้คู่นานในการคำนวณH 90 ความแม่นยำสองเท่าลอยรายงานผิดพลาดว่าH 47 <H 46

โปรแกรมแรกจะพิมพ์ออกมา

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

ที่ทำหน้าที่เป็นตัวยึดสำหรับอักขระ Unicode ทั้งหมดที่มีจุดรหัสระหว่าง100,000และ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แทนอักขระ Unicode ดังกล่าวข้างต้น900,000ตัวคุณสามารถลองใช้งานออนไลน์ได้!


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 มันเป็นพื้น outputs เพียงแค่ตัวเองอีกครั้งเป็นครั้งที่สอง เบาะแสเป็นที่สำหรับการทำซ้ำใด ๆ ที่เรามี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
Luis Mendo

ขอบคุณสำหรับคำแนะนำ! ให้ฉันลองทำ แต่ฉันคิดว่ามีการปรับปรุงอื่น ๆ ที่จะเพิ่มคะแนนได้อีกมาก สิ่งนี้ควรจะเป็นข้อพิสูจน์แนวคิด :) ก่อนอื่น
ข้อบกพร่อง

ฉันได้รวมข้อเสนอแนะของคุณไว้พร้อมกับการปรับปรุงอื่น ๆ อีกมากมาย
ข้อบกพร่อง

ฉันชอบกราฟการเพิ่มประสิทธิภาพที่ :-)
Luis Mendo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.