Ich arbeite an der Software für eine Maschine, die automatisch die Zehennägel schneidet, sodass Benutzer einfach ihre Füße hineinlegen und sie ausführen können, anstatt sie manuell durch Beißen oder Verwenden von Nagelknipsern ausführen zu müssen.
Ein beträchtlicher Prozentsatz unserer potenziellen Nutzerbasis wird wahrscheinlich jüdisch sein, und es gibt offensichtlich eine Tradition, Zehennägel ( oder Fingernägel ) nicht in sequentieller Reihenfolge zu schneiden
Es scheint abweichende Meinungen über die genaue Anwendung dieser Tradition zu geben, aber wir glauben, dass die folgenden Regeln ausreichen, um Menschen unterzubringen, deren religiöse Praktiken das Schneiden von Zehennägeln verbieten:
- Es sollten keine zwei benachbarten Zehennägel nacheinander geschnitten werden
- Die Schnittsequenz am linken Fuß sollte nicht mit der Sequenz am rechten Fuß übereinstimmen
- Die Schnittsequenz bei zwei aufeinanderfolgenden Läufen sollte nicht gleich sein. Die Sequenzen sollten nicht leicht vorhersehbar sein, daher funktioniert die Hardcodierung einer alternierenden Sequenz nicht.
So haben wir beschlossen, die Zehen zu nummerieren:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
Ich habe Code geschrieben, um das Problem zu lösen, aber der verwendete Algorithmus ist nicht optimal: Tatsächlich ist die schlechteste Leistung O (∞) . Die Art und Weise, wie es funktioniert, ist vergleichbar mit Bogosort . Hier ist eine Pseudocode-Vereinfachung des tatsächlich verwendeten Codes:
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)
Grundsätzlich werden zufällige Sequenzen generiert und geprüft, ob diese die Kriterien erfüllen. Wenn es die Kriterien nicht erfüllt, beginnt es von vorne. Es dauert nicht lächerlich lange, ist aber sehr unvorhersehbar.
Mir ist klar, dass die Art und Weise, wie ich es derzeit mache, ziemlich schrecklich ist, aber ich habe Probleme, einen besseren Weg zu finden. Kann jemand von euch einen eleganteren und performanteren Algorithmus vorschlagen?