tło
Problem dwunastu monet to klasyczna łamigłówka równowagi powszechnie stosowana podczas rozmów kwalifikacyjnych. Układanka pojawiła się po raz pierwszy w 1945 roku i została postawiona ojcu przez mojego dziadka, gdy poprosił o rękę mojej matki! W łamigłówce znajduje się dwanaście monet, z których jedna jest cięższa lub lżejsza od pozostałych (nie wiadomo, która). Problem polega na tym, aby trzykrotnie użyć wagi do ustalenia unikalnej monety. W niektórych odmianach konieczne jest również określenie, czy moneta jest cięższa, czy lżejsza.
Zadanie polega tutaj na rozwiązaniu ogólnego problemu dotyczącego n monet, przy użyciu jak najmniejszej wagi w najgorszym przypadku. Nie jest konieczne ustalanie, czy moneta jest cięższa, czy lżejsza, tylko która to jest. Co więcej, nie masz dostępu do żadnych dodatkowych monet poza danym zestawem (co, co ciekawe, robi różnicę).
Okazuje się, że k ważeń jest wystarczających dla maksymalnie (3 ^ k-1) / 2 monet (więc 4 ważenia w tej odmianie mogą faktycznie obsługiwać 13 monet). Co więcej (i nieoczekiwanie) jest możliwe (ale nie wymagane tutaj) wybranie pełnego zestawu ważeń z wyprzedzeniem, zamiast tego, aby przyszłe ważenia zależały od wcześniejszych wyników. Aby zapoznać się z opisem dwóch możliwych rozwiązań, zobacz ten artykuł i tę odpowiedź Quora .
Zadanie
Napisz funkcję lub program, przyjmując liczbę całkowitą n jako dane wejściowe za pośrednictwem STDIN, argument wiersza poleceń lub argument funkcji, który rozwiązuje problem dla n monet przy użyciu jak najmniejszej liczby ważeń w najgorszym przypadku. Program powinien:
- Wydrukuj ważenia do STDOUT w formacie
1,2,3-4,5,6
wskazującym listy monet po każdej stronie wagi. Nie należy wymieniać żadnych monet, które nie są ważone. Monety są domyślnie ponumerowane od 1 do n i nie muszą być drukowane w kolejności numerycznej (tak2,1-3,4
samo jak w przypadku1,2-3,4
). - Po każdym ważeniu program powinien czekać na dane wejściowe przez STDIN, które powinny być
<
,=
lub>
, wskazując, czy lewa strona wagi jest jaśniejsza, taka sama lub cięższa niż prawa strona. - Po ostatnim wyniku ważenia program powinien wydrukować lub zwrócić numer unikalnej monety.
- Program nie musi obsługiwać niespójnych wyników wprowadzanych przez użytkownika.
- Program nie musi obsługiwać n mniej niż 3.
Przykładowe dane wyjściowe
>> 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
Punktacja
Najkrótszy kod wygrywa. Obowiązują standardowe zasady.