Một nhóm đã quyết định rằng mỗi buổi sáng ai đó nên mang bánh sừng bò cho mọi người. Không nên cùng một người mỗi lần, vì vậy cần có một hệ thống để xác định lượt tiếp theo của ai. Mục đích của câu hỏi này là để xác định một thuật toán để quyết định lượt của nó sẽ mang bánh sừng bò vào ngày mai.
Những ràng buộc, giả định và mục tiêu:
- Ai sẽ mang bánh sừng bò vào buổi chiều hôm trước.
- Vào bất kỳ ngày nào, một số người vắng mặt. Thuật toán phải chọn ai đó sẽ có mặt vào ngày hôm đó. Giả sử rằng tất cả sự vắng mặt được biết trước một ngày, vì vậy người mua bánh sừng bò có thể được xác định vào chiều hôm trước.
- Nhìn chung, hầu hết mọi người có mặt vào hầu hết các ngày.
- Vì lợi ích của sự công bằng, mọi người nên mua bánh sừng bò nhiều lần như những người khác. (Về cơ bản, giả sử rằng mọi thành viên trong nhóm đều có cùng số tiền để chi cho bánh sừng bò.)
- Sẽ thật tốt nếu có một số yếu tố ngẫu nhiên, hoặc ít nhất là cảm nhận được sự ngẫu nhiên, để làm giảm bớt sự nhàm chán của một danh sách. Đây không phải là một hạn chế cứng: nó là một đánh giá thẩm mỹ nhiều hơn. Tuy nhiên, cùng một người không nên được chọn hai lần liên tiếp.
- Người mang bánh sừng bò nên biết trước. Vì vậy, nếu người P mang bánh sừng bò vào ngày D, thì thực tế này nên được xác định vào một ngày trước đó, nơi người P có mặt. Ví dụ, nếu người bán bánh sừng bò luôn được xác định ngày hôm trước, thì đó phải là một trong những người có mặt ngày hôm trước.
- Số lượng thành viên trong nhóm đủ nhỏ để tài nguyên lưu trữ và tính toán có hiệu quả không giới hạn. Ví dụ, thuật toán có thể dựa vào một lịch sử đầy đủ về người đã mang bánh sừng bò khi trong quá khứ. Lên đến vài phút tính toán trên PC nhanh mỗi ngày sẽ ổn.
Đây là mô hình của một vấn đề trong thế giới thực, vì vậy bạn có thể tự do thách thức hoặc tinh chỉnh các giả định nếu bạn nghĩ rằng họ mô hình hóa kịch bản tốt hơn.
Nguồn gốc 1: Tìm hiểu xem ai sẽ mua bánh sừng bò của Florian Margaine.
Nguồn gốc 2: Tìm hiểu ai sẽ mua bánh sừng bò của Gilles.
Câu hỏi này giống với phiên bản của Gilles và đã được đăng lại trên Lập trình viên dưới dạng thử nghiệm để xem các cộng đồng khác nhau giải quyết thách thức lập trình như thế nào.