Je suis en train de travailler sur le logiciel pour une machine qui va automatiquement ajuster les ongles de pied, de sorte que les utilisateurs peuvent tout simplement mettre les pieds dans et exécuter, au lieu d'avoir à le faire manuellement en les mordant ou à l'aide d'un coupe-ongle.
Un pourcentage important de notre potentiel de base de l'utilisateur sera susceptible d'être Juif, et, évidemment, il y a une tradition de ne pas le parage des ongles (ou les ongles) dans un ordre séquentiel
Il semble que l'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 d'interdire la coupe des ongles de pied dans l'ordre:
- Pas de deux adjacentes ongles doivent être coupés de façon consécutive
- 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 les deux séries consécutives ne doit pas être le même. Les séquences ne devrait pas être facilement prévisible, 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-optimale: en effet, dans le pire des cas, la performance est O(∞). Le fonctionnement est comparable à bogosort. Voici un pseudo-code de la simplification du code 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 s'ils répondent aux critères. Si elle ne remplit pas les critères, il recommence. Il ne faut pas un trop long laps de temps, mais il est très imprévisible.
Je me rends compte que la façon dont je suis en train de faire c'est assez terrible, mais je vais avoir du mal à trouver une meilleure façon. Qui de vous proposer un plus élégant et performant algorithme?