Các nguyên tắc chuồng bồ câu trạng thái mà
Nếu N mục được đặt vào hộp M , với N > M , thì ít nhất một hộp phải chứa nhiều hơn một mục.
Đối với nhiều người, nguyên tắc này có một trạng thái đặc biệt so với các ban hành toán học khác. Như EW Dijkstra đã viết ,
Nó được bao quanh bởi một số bí ẩn. Bằng chứng sử dụng nó thường được coi là một cái gì đó đặc biệt, một cái gì đó đặc biệt khéo léo.
Các thách thức
Mục đích của thử thách này là để minh họa cho nguyên tắc pigeonhole bằng cách sử dụng các biểu diễn nghệ thuật ASCII. Đặc biệt:
- Lấy làm đầu vào
N
(số lượng vật phẩm) vàM
(số lượng hộp),N
không âm vàM
dương.N
có thể nhỏ hơnM
(ngay cả khi nguyên tắc không áp dụng trong trường hợp đó). - Chọn ngẫu nhiên một trong những bài tập có thể của các mục vào hộp. Mỗi bài tập nên có xác suất khác không được chọn.
Tạo một biểu diễn nghệ thuật ASCII của bài tập như sau:
- Có
M
dòng, mỗi dòng tương ứng với một hộp. - Mỗi dòng bắt đầu bằng một ký tự không phải khoảng trắng, chẳng hạn như
|
. - Theo sau nhân vật đó là một nhân vật không phải khoảng trắng khác, chẳng hạn như
#
, lặp đi lặp lại nhiều lần như có các mục trong hộp đó.
- Có
Xem xét ví dụ N = 8
, M = 5
. Nếu assigment chọn các mặt hàng để hộp được 4
, 1
, 0
, 3
, 0
, đại diện là
|####
|#
|
|###
|
Một lần chạy khác nhau (dẫn đến một nhiệm vụ khác nhau) của cùng một chương trình có thể đưa ra
|#
|##
|#
|#
|###
Có một số linh hoạt liên quan đến đại diện; xem bên dưới.
Quy tắc cụ thể
Mã về lý thuyết nên chạy cho bất kỳ giá trị nào của N
và M
. Trong thực tế, nó có thể bị hạn chế bởi kích thước bộ nhớ hoặc giới hạn loại dữ liệu.
Vì việc quan sát đầu ra là không đủ để xác định xem tất cả các bài tập có xác suất khác không , mỗi lần gửi sẽ giải thích cách mã đạt được điều đó, nếu không rõ ràng.
Các biến thể đại diện sau được cho phép:
- Bất kỳ cặp ký tự khác, không khoảng trắng có thể được chọn. Họ phải nhất quán trong suốt quá trình thực hiện chương trình.
- Xoay 90 độ của đại diện được chấp nhận. Một lần nữa, sự lựa chọn phải nhất quán.
- Trailing hoặc khoảng trắng hàng đầu được cho phép.
Như một ví dụ với định dạng biểu diễn khác, vì N = 15
, M = 6
kết quả của hai lần thực hiện chương trình có thể là
VVVVVV
@@@@@@
@@ @@@
@ @@
@
hoặc là
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Tương tự như vậy, N = 5
, M = 7
có thể cung cấp, sử dụng một biến thể của các đại diện,
*
* * * *
UUUUUUU
hoặc là
*** **
UUUUUUU
hoặc là
*
* *
* *
UUUUUUU
Lưu ý cách nguyên tắc không được áp dụng trong trường hợp này, bởi vì N
< M
.
Quy tắc chung
Các chương trình hoặc chức năng được cho phép, trong bất kỳ ngôn ngữ lập trình . Sơ hở tiêu chuẩn bị cấm.
Đầu vào có thể được thực hiện bằng bất kỳ phương tiện hợp lý ; và với bất kỳ định dạng nào, chẳng hạn như một mảng gồm hai số hoặc hai chuỗi khác nhau.
Phương tiện đầu ra và định dạng cũng linh hoạt. Ví dụ, đầu ra có thể là một danh sách các chuỗi hoặc một chuỗi có dòng mới; được trả về dưới dạng đối số đầu ra của hàm hoặc được hiển thị trong STDOUT. Trong trường hợp sau, không cần phải lo lắng về việc ngắt dòng gây ra bởi chiều rộng màn hình bị giới hạn.
Mã ngắn nhất trong byte thắng.