Je travaille sur le logiciel d'une machine qui coupe automatiquement les ongles des pieds, afin que les utilisateurs puissent simplement y mettre leurs pieds et l'exécuter au lieu d'avoir à le faire manuellement en les mordant ou en utilisant un coupe-ongles.
Un pourcentage important de notre base d'utilisateurs potentiels sera probablement juif et, de toute évidence, il existe une tradition de ne pas couper les ongles des pieds ( ou des ongles ) dans un ordre séquentiel.
Il semble y avoir une opinion dissidente sur l'application précise de cette tradition, mais nous pensons que les règles suivantes sont suffisantes pour accueillir les personnes dont les pratiques religieuses interdisent de couper les ongles dans l'ordre:
- Pas deux ongles adjacents ne doivent être coupés consécutivement
- La séquence de coupe sur le pied gauche ne doit pas correspondre à la séquence sur le pied droit
- La séquence de coupe sur deux passages consécutifs ne doit pas être la même. Les séquences ne devraient pas être facilement prévisibles, donc coder en dur une séquence alternée ne fonctionne pas.
C'est ainsi que nous avons décidé de numéroter les orteils:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
J'ai écrit du code pour résoudre le problème, mais l'algorithme utilisé est sous-optimal: en fait, le pire des cas est O (∞) . Son fonctionnement est comparable à celui du bogosort . Voici une simplification du pseudocode du code réel utilisé:
function GenerateRandomSequence
sequence = Array[5]
foreach (item in sequence)
item = RandomNumberBetween(1,5)
return sequence
function GetToenailCuttingOrder
while (true)
sequence = GenerateRandomSequence()
if (!AllItemsAreUnique(sequence))
continue
if (NoTwoAdjacentItemsHaveConsecutiveNumbers(sequence))
return sequence
do
leftFootSequence = GetToenailCuttingOrder()
rightFootSequence = GetToenailCuttingOrder()
until (leftFootSequence != rightFootSequence &&
leftFootSequence != leftFootSequenceFromLastRun &&
rightFootSequence != rightFootSequenceFromLastRun)
Fondamentalement, il génère des séquences aléatoires et vérifie si elles répondent aux critères. S'il ne répond pas aux critères, il recommence. Cela ne prend pas un temps ridiculement long, mais c'est très imprévisible.
Je me rends compte que la façon dont je le fais actuellement est assez terrible, mais j'ai du mal à trouver une meilleure solution. L'un de vous peut-il suggérer un algorithme plus élégant et plus performant?