Lý lịch
Vấn đề mười hai đồng xu là một câu đố cân bằng cổ điển thường được sử dụng trong các cuộc phỏng vấn việc làm. Câu đố xuất hiện lần đầu tiên vào năm 1945 và được ông tôi đặt cho bố tôi khi ông yêu cầu cưới mẹ tôi! Trong câu đố có mười hai đồng xu, một trong số đó nặng hơn hoặc nhẹ hơn những đồng xu khác (bạn không biết cái nào). Vấn đề là sử dụng thang cân bằng ba lần để xác định đồng tiền duy nhất. Trong một số biến thể, cũng cần xác định xem đồng xu nặng hơn hay nhẹ hơn.
Nhiệm vụ ở đây liên quan đến việc giải quyết vấn đề chung liên quan đến n xu, sử dụng trọng lượng ít nhất có thể trong trường hợp xấu nhất. Không cần thiết phải xác định xem đồng xu nặng hơn hay nhẹ hơn, chỉ có nó là đồng xu nào. Hơn nữa, bạn không có quyền truy cập vào bất kỳ đồng tiền bổ sung nào ngoài bộ đã cho (điều này, thật tò mò, tạo ra sự khác biệt).
Hóa ra trọng lượng k là đủ cho tối đa (3 ^ k-1) / 2 đồng xu (vì vậy 4 lần cân trong biến thể này thực sự có thể xử lý 13 đồng xu). Hơn nữa (và đáng ngạc nhiên), có thể (nhưng không bắt buộc ở đây) để chọn toàn bộ cân trước, thay vì cân trong tương lai phụ thuộc vào kết quả trong quá khứ. Để biết mô tả về hai giải pháp có thể, hãy xem bài viết này và câu trả lời Quora này .
Bài tập
Viết hàm hoặc chương trình, lấy số nguyên n làm đầu vào thông qua STDIN, đối số dòng lệnh hoặc đối số hàm, để giải quyết vấn đề cho n xu bằng cách sử dụng số lượng ít nhất có thể trong trường hợp xấu nhất. Chương trình nên:
- In trọng lượng sang STDOUT theo định dạng
1,2,3-4,5,6
để chỉ ra danh sách các đồng tiền ở mỗi bên của thang đo. Bất kỳ đồng tiền không được cân không nên được đề cập. Các đồng tiền được đánh số ngầm định từ 1 đến n và không cần phải in theo thứ tự số (2,1-3,4
tương tự như vậy1,2-3,4
). - Sau mỗi chương trình nặng nên chờ đợi vào một đầu vào thông qua STDIN, mà nên
<
,=
hay>
, cho thấy dù ở phía bên trái của quy mô là nhẹ hơn, giống nhau, hoặc nặng hơn bên phải. - Sau kết quả cân cuối cùng, chương trình sẽ in hoặc trả về số lượng đồng xu duy nhất.
- Chương trình không cần xử lý đầu vào kết quả không nhất quán từ người dùng.
- Chương trình không cần xử lý n dưới 3.
Ví dụ đầu ra
>> 3
1-2
>> =
1-3
>> <
3
# using Quora algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
1,2,5-3,4,6
>> >
3-4
>> <
3
# using paper algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
2,6,7,9-3,8,10,11
>> >
6,8,10,12-4,5,7,11
>> =
3
Chấm điểm
Mã ngắn nhất sẽ thắng. Quy tắc chuẩn áp dụng.