Contexte
Le problème des douze pièces est un puzzle d'équilibre classique couramment utilisé dans les entretiens d'embauche. Le puzzle est apparu pour la première fois en 1945 et a été posé à mon père par mon grand-père quand il a demandé à épouser ma mère! Dans le puzzle, il y a douze pièces, dont l'une est soit plus lourde ou plus légère que les autres (vous ne savez pas laquelle). Le problème est d'utiliser une balance trois fois pour déterminer la pièce unique. Dans certaines variantes, il est également nécessaire d'identifier si la pièce est plus lourde ou plus légère.
La tâche consiste ici à résoudre le problème général impliquant n pièces, en utilisant le moins de pesées possible dans le pire des cas. Il n'est pas nécessaire d'identifier si la pièce est plus lourde ou plus légère, seulement laquelle. De plus, vous n'avez pas accès à des pièces supplémentaires en dehors de l'ensemble donné (ce qui, curieusement, fait une différence).
Il s'avère que k pesées sont suffisantes pour jusqu'à (3 ^ k-1) / 2 pièces (donc 4 pesées dans cette variation peuvent réellement gérer 13 pièces). De plus (et de manière surprenante), il est possible (mais pas obligatoire ici) de sélectionner l'ensemble complet des pesées à l'avance, plutôt que de faire dépendre les pesées futures des résultats passés. Pour une description de deux solutions possibles, consultez cet article et cette réponse Quora .
Tâche
Écrivez une fonction ou un programme, en prenant un entier n en entrée via STDIN, un argument de ligne de commande ou un argument de fonction, ce qui résout le problème pour n pièces en utilisant le moins de pesées possible dans le pire des cas. Le programme devrait:
- Imprimez les pesées dans STDOUT au format
1,2,3-4,5,6
pour indiquer les listes de pièces de chaque côté de la balance. Les pièces non pesées ne doivent pas être mentionnées. Les pièces sont implicitement numérotées de 1 à n et n'ont pas besoin d'être imprimées dans l'ordre numérique (2,1-3,4
c'est la même chose que pour1,2-3,4
). - Après chaque pesée, le programme doit attendre une entrée via STDIN, qui doit être
<
,=
ou>
, indiquant si le côté gauche de la balance est plus léger, identique ou plus lourd que le côté droit. - Après le dernier résultat de pesée, le programme doit imprimer ou renvoyer le numéro de la pièce unique.
- Le programme n'a pas besoin de gérer les entrées de résultats incohérentes de l'utilisateur.
- Le programme n'a pas besoin de gérer n moins de 3.
Exemples de sorties
>> 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
Notation
Le code le plus court gagne. Des règles standard s'appliquent.
la source