Фон
Проблема из двенадцати монет - это классическая головоломка с балансом, обычно используемая в собеседованиях. Загадка впервые появилась в 1945 году и была поставлена моему отцу моим дедом, когда он попросил жениться на моей матери! В загадке двенадцать монет, одна из которых тяжелее или легче других (вы не знаете, какая именно). Проблема состоит в том, чтобы использовать весы трижды, чтобы определить уникальную монету. В некоторых вариантах также необходимо определить, является ли монета тяжелее или легче.
Задача здесь включает в себя решение общей проблемы, связанной с n монетами, с использованием наименьшего количества возможных взвешиваний в худшем случае. Нет необходимости определять, является ли монета тяжелее или легче, только какая она есть. Кроме того, у вас нет доступа к каким-либо дополнительным монетам за пределами данного набора (что, как ни странно, имеет значение).
Оказывается, что k взвешиваний достаточно для (3 ^ k-1) / 2 монет (так что 4 взвешивания в этом варианте могут фактически обработать 13 монет). Кроме того (что удивительно), можно (но не обязательно здесь) заранее выбирать полный набор взвешиваний, вместо того, чтобы будущие взвешивания зависели от прошлых результатов. Для описания двух возможных решений, см. Эту статью и этот ответ Quora .
задача
Напишите функцию или программу, принимая целое число n в качестве входных данных через STDIN, аргумент командной строки или аргумент функции, что решает проблему для n монет, используя наименьшее количество возможных взвешиваний в худшем случае. Программа должна:
- Распечатайте взвешивания в STDOUT в формате,
1,2,3-4,5,6
чтобы указать списки монет на каждой стороне шкалы. Любые не взвешенные монеты не должны упоминаться. Монеты неявно пронумерованы от 1 до n и не должны быть напечатаны в числовом порядке (2,1-3,4
то же самое, что и для1,2-3,4
). - После каждого взвешивания программа должна ожидать ввода через STDIN, который должен быть
<
,=
или>
, указывая, является ли левая сторона весов светлее, такой же или тяжелее правой стороны. - После последнего результата взвешивания программа должна напечатать или вернуть номер уникальной монеты.
- Программа не должна обрабатывать противоречивые результаты ввода от пользователя.
- Программа не должна обращаться с п меньше 3.
Пример выходов
>> 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
счет
Самый короткий код выигрывает. Стандартные правила применяются.