เขียนโปรแกรมหรือฟังก์ชั่นด้วยฟังก์ชั่นต่อไปนี้:
- โปรแกรม / ฟังก์ชั่นครั้งแรกพยายามที่จะเขียนสตริง
Hello, world!
ไปยังกระแสออกมาตรฐาน (ไม่มีรูปแบบอื่น ๆ ของการส่งออกเป็นที่ยอมรับสำหรับความท้าทายนี้เนื่องจากการมุ่งเน้นเป็นอย่างมากกับ I / O มากกว่าพฤติกรรมเล็กน้อยของโปรแกรมเอง) ขึ้นอยู่กับว่ามันประสบความสำเร็จ:- ถ้ามันประสบความสำเร็จในการส่ง
Hello, world!
ออกโปรแกรม / ฟังก์ชั่นออกโดยไม่มีพฤติกรรมใด ๆ เพิ่มเติม - หากไม่สามารถสร้างเอาต์พุตที่ถูกต้องเนื่องจากข้อผิดพลาดโปรแกรม / ฟังก์ชันจะพยายามเขียนสตริง
Error writing "Hello, world!"
ลงในสตรีมข้อผิดพลาดมาตรฐาน (สำหรับวัตถุประสงค์ของการท้าทายนี้คุณไม่จำเป็นต้องจัดการข้อผิดพลาดเพื่อจัดการข้อผิดพลาดเอง)
- ถ้ามันประสบความสำเร็จในการส่ง
ชี้แจง
โปรแกรม / ฟังก์ชั่นของคุณจะทำงานโดยไม่มีการป้อนข้อมูล (เว้นแต่จะเขียนด้วยภาษาที่ต้องใช้อินพุตในการทำงานซึ่งในกรณีนี้มันจะทำงานด้วยอินพุตที่เป็นไปได้ง่ายที่สุด)
เมื่อสร้างเอาต์พุตคุณอาจสร้างบรรทัดใหม่ขึ้นหนึ่งบรรทัดหากคุณต้องการ แต่การทำเช่นนั้นไม่จำเป็น
คำจำกัดความของ "การเขียนข้อผิดพลาดไปยังเอาต์พุตมาตรฐาน" ที่โปรแกรมของคุณดำเนินการต้องปฏิบัติอย่างน้อยกรณีต่อไปนี้เป็นข้อผิดพลาด:
- เอาต์พุตมาตรฐานไม่มีอยู่ (เช่น
stdout
filehandle ปิดไม่มีไฟล์ descriptor 1 อยู่หรืออย่างไรก็ตามกรณีเหล่านั้นแปลเป็นภาษาและระบบปฏิบัติการที่คุณใช้) - เอาต์พุตมาตรฐานอ้างถึงไฟล์บนดิสก์ที่ไม่มีพื้นที่ว่างเหลือ
- เอาต์พุตมาตรฐานเชื่อมต่อกับโปรแกรมอื่นซึ่งปิดการเชื่อมต่อไปแล้ว
และจะต้องปฏิบัติอย่างน้อยที่สุดกรณีต่อไปนี้เป็นความสำเร็จ (เช่นไม่ใช่ข้อผิดพลาด):
- เอาต์พุตมาตรฐานเชื่อมต่อกับเทอร์มินัลและ
Hello, world!
แสดงบนหน้าจอ - เอาต์พุตมาตรฐานเชื่อมต่อกับไฟล์และ
Hello, world!
เขียนลงในไฟล์
คุณสามารถเลือกรายละเอียดของสิ่งที่นับเป็นข้อผิดพลาดของผลลัพธ์ตราบใดที่มันสอดคล้องกับกฎข้างต้น
- เอาต์พุตมาตรฐานไม่มีอยู่ (เช่น
โปรแกรม / ฟังก์ชั่นของคุณไม่ควรผิดพลาดเมื่อพบข้อผิดพลาดใด ๆ ที่ระบุไว้ข้างต้น ขึ้นอยู่กับคุณว่าคุณต้องการใช้รหัสทางออกอะไร
โปรแกรม / ฟังก์ชันของคุณไม่ควรอธิบายลักษณะของข้อผิดพลาดที่พบในสตรีมข้อผิดพลาดมาตรฐาน มันควรจะพิมพ์สตริงที่ระบุข้างต้น เอาต์พุตภายนอกจากข้อผิดพลาดมาตรฐาน (เช่นคำเตือนของคอมไพเลอร์) นั้นถูกต้องตามกฎหมายถ้ามันถูกสร้างขึ้นโดยไม่มีเงื่อนไขโดยไม่คำนึงว่าจะเกิดข้อผิดพลาดหรือไม่
โปรแกรมของคุณจำเป็นต้องทำงานบนระบบปฏิบัติการเดียว (แม้ว่าจะต้องเป็นระบบที่มีข้อผิดพลาดตามรายการด้านบน) ฉันพยายามทำให้มันเป็นเรื่องปกติพอที่จะทำงานกับระบบปฏิบัติการผู้บริโภคที่ทำงานหลายอย่าง แต่ระบบปฏิบัติการที่อ่อนแออาจ ไม่รวมอยู่ในการท้าทายนี้) หากโปรแกรมของคุณไม่สามารถพอร์ตได้ให้ระบุข้อสมมติฐานที่จำเป็นต้องใช้ในชื่อเรื่องที่คุณส่ง
งานนี้อาจเป็นไปไม่ได้ในทุกภาษา (ไม่ใช่ทุกภาษาอนุญาตให้โปรแกรมจัดการข้อผิดพลาดเอาต์พุตในแบบกำหนดเอง) คุณจะต้องเลือกภาษาที่เป็นไปได้
ตรวจสอบให้แน่ใจว่าโปรแกรม / ฟังก์ชั่นของคุณใช้งานได้! อย่าเชื่อเพียงเอกสารของฟังก์ชั่นห้องสมุดเพื่อทำในสิ่งที่พวกเขาบอกว่าทำ การจัดการข้อผิดพลาดของฟังก์ชั่นการส่งออกอย่างง่ายมักจะกลายเป็นว่าเสียในทางปฏิบัติแม้ว่าฟังก์ชั่นอ้างว่าจัดการกับข้อผิดพลาดในทางทฤษฎี
กรณีทดสอบ
นี่คือวิธีการจำลองเงื่อนไขข้อผิดพลาดแต่ละข้อด้านบนที่ใช้bash
บน Linux (คุณไม่จำเป็นต้องใช้ Linux แต่เป็นไปได้ว่าระบบที่ง่ายที่สุดในการทดสอบนี้):
your_program_here >&- # nonexistent stdout
your_program_here > /dev/full # out of disk space
mkfifo test # note: change "test" to a filename that isn't in use
true < test &
your_program_here > test # connecting to a program that doesn't want input
rm test # clean up the FIFO we used earlier
การทดสอบสองครั้งแรกนั้นไม่แน่นอน อันสุดท้ายไม่ใช่ (ขึ้นอยู่กับสภาพการแข่งขัน); เพื่อจุดประสงค์ในการทดสอบเราขอแนะนำให้เพิ่มความล่าช้าระหว่างการเริ่มต้นโปรแกรมของคุณและเอาท์พุทจริงไปยังเอาต์พุตมาตรฐานเพื่อให้แน่ใจว่าสภาพการแข่งขันได้รับการแก้ไขในลักษณะที่ทำให้เกิดข้อผิดพลาด
เงื่อนไขชัยชนะ
มันคือ รหัสกอล์ฟความท้าทายจึงสั้นกว่าดีกว่า ในฐานะที่เป็น (เกือบ) เสมอเรากำลังวัดความยาวของโปรแกรมเป็นไบต์
sleep 1 < test; (sleep 2; your_program_here) > test
?