หลักรังนกพิราบระบุว่า
หากมีการใส่รายการNลงในกล่องMโดยมีN > Mอย่างน้อยหนึ่งกล่องจะต้องมีมากกว่าหนึ่งรายการ
สำหรับหลาย ๆ คนหลักการนี้มีสถานะพิเศษเมื่อเทียบกับการคำนวณทางคณิตศาสตร์อื่น ๆ ในฐานะที่เป็น EW Dijkstra เขียน ,
มันถูกล้อมรอบไปด้วยความลึกลับบางอย่าง บทพิสูจน์ที่ใช้มันมักถูกมองว่าเป็นสิ่งที่พิเศษ
ความท้าทาย
จุดประสงค์ของการท้าทายนี้คือเพื่อแสดงให้เห็นถึงหลักการของนกพิราบในช่องว่างโดยใช้การแทนด้วยศิลปะ ASCII โดยเฉพาะ:
- ใช้เป็นอินพุต
N
(จำนวนรายการ) และM
(จำนวนกล่อง) โดยN
ไม่ลบและM
บวกN
อาจมีขนาดเล็กกว่าM
(แม้ว่าหลักการไม่ได้ใช้ในกรณีนั้น) - สุ่มเลือกหนึ่งในการกำหนดรายการที่เป็นไปได้ให้กับกล่อง แต่ละการมอบหมายควรมีความน่าจะเป็นที่ไม่เป็นศูนย์ในการเลือก
สร้างการแทนค่า ASCII art ของการมอบหมายดังนี้:
- มี
M
เส้นแต่ละเส้นตรงกับกล่อง |
แต่ละบรรทัดเริ่มต้นด้วยตัวอักษรที่ไม่ใช่ช่องว่างเช่น- การติดตามตัวละครนั้นเป็นอีกตัวที่ไม่ใช่ช่องว่างเช่น
#
ซ้ำหลายครั้งเนื่องจากมีรายการในกล่องนั้น
- มี
พิจารณาตัวอย่างเช่น,N = 8
M = 5
หาก assigment เลือกของรายการที่จะเป็นกล่อง4
, 1
, 0
, 3
, 0
ตัวแทนคือ
|####
|#
|
|###
|
การทำงานที่แตกต่างกัน (ส่งผลให้มีการมอบหมายต่างกัน) ของโปรแกรมเดียวกันอาจให้
|#
|##
|#
|#
|###
มีความยืดหยุ่นบางอย่างเกี่ยวกับการเป็นตัวแทน; ดูด้านล่าง
กฎเฉพาะ
รหัสควรทำงานในทางทฤษฎีสำหรับค่าใด ๆของและN
M
ในทางปฏิบัติอาจถูก จำกัด ด้วยขนาดหน่วยความจำหรือข้อ จำกัด ชนิดข้อมูล
เนื่องจากการสังเกตผลลัพธ์ไม่เพียงพอที่จะตัดสินว่าการมอบหมายทั้งหมดมีความน่าจะเป็นที่ไม่เป็นศูนย์หรือไม่การส่งแต่ละครั้งควรอธิบายว่ารหัสประสบความสำเร็จได้อย่างไรหากไม่ชัดเจน
อนุญาตให้ใช้รูปแบบการนำเสนอต่อไปนี้:
- สามารถเลือกคู่ของอักขระที่ไม่ใช่ช่องว่างที่แตกต่างกันได้ พวกเขาจะต้องสอดคล้องกันในการทำงานของโปรแกรม
- การหมุนที่ใช้ในการแสดง 90 องศาเป็นที่ยอมรับได้ ตัวเลือกจะต้องสอดคล้องกันอีกครั้ง
- อนุญาตให้ใช้ช่องว่างต่อท้ายหรือนำหน้า
เป็นตัวอย่างที่มีรูปแบบการแสดงที่แตกต่างกันสำหรับN = 15
, M = 6
ผลของการประหารชีวิตสองของโปรแกรมที่อาจจะ
VVVVVV
@@@@@@
@@ @@@
@ @@
@
หรือ
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
ในทำนองเดียวกันN = 5
, M = 7
จะให้ใช้รูปแบบของการแสดงอีก
*
* * * *
UUUUUUU
หรือ
*** **
UUUUUUU
หรือ
*
* *
* *
UUUUUUU
หมายเหตุว่าหลักการที่ไม่สามารถใช้ได้ในกรณีนี้เพราะ<N
M
กฎทั่วไป
โปรแกรมหรือฟังก์ชั่นที่ได้รับอนุญาตในการเขียนโปรแกรมภาษา ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
การป้อนข้อมูลสามารถนำมาโดยใด ๆวิธีการที่เหมาะสม ; และในรูปแบบใด ๆ เช่นอาร์เรย์ของตัวเลขสองตัวหรือสองสตริงที่แตกต่างกัน
วิธีการส่งออกและรูปแบบยังมีความยืดหยุ่น ตัวอย่างเช่นเอาต์พุตสามารถเป็นรายการของสตริงหรือสตริงที่มีบรรทัดใหม่ ส่งคืนเป็นอาร์กิวเมนต์เอาต์พุตของฟังก์ชันหรือแสดงใน STDOUT ในกรณีหลังไม่จำเป็นต้องกังวลเกี่ยวกับการตัดบรรทัดที่เกิดจากความกว้างของหน้าจอที่ จำกัด
รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ