Hintergrund
Das Zwölf-Münzen-Problem ist ein klassisches Balance-Puzzle, das häufig in Vorstellungsgesprächen verwendet wird. Das Rätsel erschien zum ersten Mal im Jahr 1945 und wurde meinem Vater von meinem Großvater gestellt, als er darum bat, meine Mutter zu heiraten! In dem Puzzle gibt es zwölf Münzen, von denen eine entweder schwerer oder leichter als die anderen ist (Sie wissen nicht, welche). Das Problem besteht darin, eine Waage dreimal zu verwenden, um die eindeutige Münze zu bestimmen. In einigen Varianten muss auch festgestellt werden, ob die Münze schwerer oder leichter ist.
Hier geht es darum, das allgemeine Problem mit n Münzen zu lösen und im ungünstigsten Fall möglichst wenig zu wiegen. Es muss nicht festgestellt werden, ob die Münze schwerer oder leichter ist, sondern nur, um welche es sich handelt. Darüber hinaus haben Sie keinen Zugriff auf zusätzliche Münzen außerhalb des angegebenen Satzes (was merkwürdigerweise einen Unterschied macht).
Es zeigt sich, dass k-Wägungen für bis zu (3 ^ k-1) / 2 Münzen ausreichen (4 Wägungen in dieser Variante können also tatsächlich 13 Münzen verarbeiten). Darüber hinaus ist es (und überraschenderweise) möglich (hier jedoch nicht erforderlich), den vollständigen Satz von Wägungen im Voraus auszuwählen, anstatt dass zukünftige Wägungen von früheren Ergebnissen abhängen. Beschreibungen von zwei möglichen Lösungen finden Sie in diesem Dokument und in dieser Quora-Antwort .
Aufgabe
Schreiben Sie eine Funktion oder ein Programm, indem Sie eine Ganzzahl n über STDIN, ein Befehlszeilenargument oder ein Funktionsargument als Eingabe verwenden. Dadurch wird das Problem für n Münzen mit den geringstmöglichen Gewichten im ungünstigsten Fall gelöst . Das Programm sollte:
- Drucken Sie die Wägungen im Format auf STDOUT
1,2,3-4,5,6
, um die Münzlisten auf jeder Seite der Waage anzuzeigen. Nicht gewogene Münzen sollten nicht erwähnt werden. Die Münzen implizit aus 1 nummeriert sind n und nicht in numerischer Reihenfolge gedruckt werden müssen (so2,1-3,4
ist die gleiche wie zu1,2-3,4
). - Nachdem jeder das Programm mit einem Gewicht an einem Eingang über STDIN warten sollte, was sein sollte
<
,=
oder>
, das anzeigt , ob die linke Seite der Skala ist leichter, gleich, oder schwerer als die rechte Seite. - Nach dem letzten Wägeresultat sollte das Programm die Nummer der einzelnen Münze drucken oder zurückgeben.
- Das Programm muss keine inkonsistenten Ergebnisseingaben des Benutzers verarbeiten.
- Das Programm muss nicht handhaben n weniger als 3.
Beispielausgaben
>> 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
Wertung
Kürzester Code gewinnt. Es gelten Standardregeln.