ดังที่เราทราบกันดีว่าระบบปฏิบัติการที่ทันสมัยมีตัวจัดกำหนดการเธรดที่สามารถเลือกคำสั่งที่แตกต่างกันเพื่อกำหนดเวลาเธรดของคุณตามตรรกะภายในซึ่งรหัสของคุณไม่เป็นส่วนตัว โดยปกติแล้วคุณจะต้องออกแบบโค้ดแบบมัลติเธรดของคุณเพื่อให้แน่ใจว่าสิ่งที่ไม่คาดฝันนี้กำหนดไว้กับคุณจะไม่ส่งผลกระทบต่อผลลัพธ์ของคุณอย่างมีความหมาย
เป้าหมายที่นี่ตรงกันข้าม สร้างโปรแกรมที่พิมพ์จำนวนเต็มในช่วงเวลา [0,99] แต่ในลำดับที่จะแตกต่างจากการรันเพื่อรันเนื่องจากตัวกำหนดตารางเวลาเธรด OS
คุณต้องได้ "nondeterminism ที่เพียงพอ" ซึ่งนิยามไว้เป็น:
ใน 10 ชุดตามลำดับของการทดลอง 10 ครั้งโปรแกรมของคุณจะต้องผลิตอย่างน้อย 9 พีชคณิตที่ไม่ซ้ำกันในแต่ละการทดลอง คุณอาจมีจำนวนชุดการทดลองที่ล้มเหลวในจำนวนที่เหมาะสมทั้งสองด้านของ 10 ติดต่อกันซึ่งประสบความสำเร็จ
หรือหากต้องการกล่าวอีกวิธีหนึ่งคุณต้องใช้ 100 โปรแกรมของคุณซึ่งแต่ละบล็อกของการรัน 10 ครั้งมีการรันที่มากที่สุดสองรายการซึ่งให้ผลลัพธ์เหมือนกัน
ดังนั้นการสลับ 98 และ 99 จะไม่ตัด
นี่คือรหัสกอล์ฟดังนั้นคำตอบที่ใช้จำนวนไบต์น้อยที่สุดชนะ
ข้อปลีกย่อย
- เขียนเอาต์พุตของคุณไปยัง stdout หนึ่งรายการต่อบรรทัด
- หากคุณรวมรูปแบบโดยให้ตัวอักษรสองตัวแทรกสอดระหว่างหัวข้อไปยัง stdout (แม้บางครั้ง) ทำให้เกิดสิ่งต่าง ๆ เช่นตัวเลขสามหลักหรือบรรทัดว่างผลลัพธ์ของคุณไม่ถูกต้อง
- ข้อยกเว้นสำหรับกฎข้างต้นคือคุณสามารถปล่อยบรรทัดว่างเปล่าบรรทัดเดียวหลังจากพิมพ์หมายเลขที่ต้องการล่าสุด (ยินดีต้อนรับ)
- หากคุณพลาดหรือทำซ้ำค่าที่ต้องการผลลัพธ์ของคุณจะไม่ถูกต้อง
- โปรแกรมของคุณไม่จำเป็นต้องเป็น nondeterministic บนตัวประมวลผลหลักเดียว
- โปรแกรมของคุณอาจใช้กรีนเธรด / เส้นใยซึ่งไม่ได้รับการจัดการโดยเคอร์เนลระบบปฏิบัติการจริงหากยังคงเป็นไปตามข้อกำหนดอื่น ๆ ของความท้าทายและระบบเธรดเป็นส่วนหนึ่งของภาษาของคุณหรือไลบรารีมาตรฐานสำหรับภาษาของคุณ
- รันไทม์สำหรับโปรแกรมของคุณต้องเชื่อถือได้ภายใน 5 วินาทีบนโปรเซสเซอร์ที่ทันสมัย
- คุณไม่ได้รับการระบุการเปลี่ยนแปลงสภาพแวดล้อมที่เกิดขึ้นนอกโปรแกรมของคุณเช่นรอหรือเปลี่ยนแปลงการตั้งค่า โปรแกรมของคุณควรผ่านการรัน 100ish ครั้งย้อนหลังหรือชั่วโมงระหว่างการรันแต่ละครั้งหรือ 100ish ครั้งในแบบคู่ขนาน (ซึ่งอาจช่วยได้จริง ... )
- คุณสามารถใช้ตัวประมวลผลร่วมเช่น GPU หรือ Xeon Phi และกลไกการตั้งเวลาภายในของตัวเองสำหรับงาน กฎใช้กับสิ่งนี้เช่นเดียวกับที่ใช้กับเธรดสีเขียว
- อย่าลังเลที่จะยั่วตารางเวลาด้วยวิธีการนอนหลับผลผลิตและลูกเล่นอื่น ๆ ตราบใดที่คุณทำตามกฎที่ระบุในโพสต์นี้
การดำเนินการที่ถูกแบน
nondeterminism แหล่งเดียวที่คุณได้รับอนุญาตให้วาดบนคือเมื่อตัวกำหนดตารางเวลากำหนดเธรดของคุณให้ทำงาน รายการต่อไปนี้ไม่ครบถ้วนสมบูรณ์มีวัตถุประสงค์เพื่อให้ตัวอย่างของสิ่งที่คุณไม่ได้รับอนุญาตให้ทำเนื่องจากพวกเขายอมรับแหล่งข้อมูลอื่น ๆ
- การเข้าถึง PRNG หรือความสามารถของฮาร์ดแวร์ RNG โดยตรงหรือโดยอ้อม (เว้นแต่จะเป็นส่วนหนึ่งของกำหนดการ)
- การอ่านอินพุตทุกชนิด (เวลาระบบระบบไฟล์เครือข่าย ฯลฯ )
- การอ่าน ID เธรดหรือ ID กระบวนการ
- การกำหนดตัวกำหนดตารางเวลาระบบปฏิบัติการเอง คุณต้องใช้ตัวกำหนดตารางเวลาระบบปฏิบัติการมาตรฐานจากระบบปฏิบัติการหลัก
- ไม่อนุญาตให้กำหนดตัวกำหนดตารางเวลาเธรด / เส้นใยสีเขียว ซึ่งหมายความว่าหากคุณเขียนภาษาสำหรับความท้าทายนี้คุณต้องใช้ระบบปฏิบัติการเธรด
คำตอบการตรวจสอบ
คำตอบที่ดีกว่าน่าจะใช้ได้กับระบบปฏิบัติการทั่วไปและโปรเซสเซอร์ที่ทันสมัยทั้งหมดด้วยความรุ่งโรจน์ที่ได้รับการสนับสนุนตามสัดส่วนที่กว้าง อย่างไรก็ตามนี่ไม่ใช่ข้อกำหนดของการท้าทาย อย่างน้อยที่สุดคำตอบจะต้องรองรับโปรเซสเซอร์ SMP รุ่นใหม่หนึ่งตัวและระบบปฏิบัติการสมัยใหม่ ฉันจะทดสอบคำตอบที่นำไปสู่ความพร้อมของฮาร์ดแวร์ของฉัน
- หากรายการของคุณจะไม่สร้างผลลัพธ์ที่ต้องการใน i7 5960x ที่รัน Windows 10 v1607 x64 ให้ระบุสภาพแวดล้อมที่ต้องการ
- หากเป็นสิ่งที่ฉันสามารถสร้างซ้ำได้อย่างง่ายดายด้วย VMWare Workstation ให้ระบุรายละเอียด OS และ VM ที่แน่นอน
- หากไม่สามารถผลิตได้ภายใต้เงื่อนไขเหล่านี้ให้บันทึกการจับภาพหน้าจอพร้อมกันของการทดสอบตามที่อธิบายไว้ในส่วนหัวและการบันทึกวิดีโอแบบใช้มือถือของหน้าจอของคุณด้วยการโต้ตอบระหว่างเมาส์และแป้นพิมพ์ของคุณ อุปกรณ์ใช้) มองเห็นได้ชัดเจนและโพสต์วิดีโอทั้งสองพร้อมกับคำตอบของคุณและรวมถึงคำอธิบายว่าทำไมมันถึงใช้งานได้
- อีกทางหนึ่งคือรับผู้ใช้ที่เชื่อถือได้มานาน (ไม่ใช่คุณ) กับฮาร์ดแวร์ที่ตรงกันเพื่อสร้างผลลัพธ์และรับรองให้คุณ
- หากรายการของคุณเป็นภาษาการเขียนโปรแกรมที่แปลกใหม่ที่นักพัฒนาทั่วไปจะไม่ถูกตั้งค่าให้คอมไพล์ / jit / ตีความให้คำแนะนำการตั้งค่า
- หากรายการของคุณขึ้นอยู่กับรุ่นเฉพาะของล่าม JVM / Python / อื่น ๆ ให้ระบุว่า
- หากใช้เวลานานกว่า 10 นาทีในการรัน back-to-back เพื่อรับชุดการทดลองตามลำดับ 10 ครั้งที่ประสบความสำเร็จในการทดสอบของฉันคุณล้มเหลว (ดังนั้นอย่าปล่อยให้สภาพความสำเร็จเป็นปรากฏการณ์ประหลาดโดยเฉพาะอย่างยิ่งถ้าคุณอยู่ใกล้ด้านบน รันไทม์ที่ถูกผูกไว้)