Sto lavorando al software per una macchina che taglierà automaticamente le unghie dei piedi, in modo che gli utenti possano semplicemente metterci i piedi dentro ed eseguirlo invece di doverlo fare manualmente mordendole o usando un tagliaunghie.
Una percentuale considerevole della nostra potenziale base di utenti sarà probabilmente ebrea e, evidentemente, esiste una tradizione sul non tagliare le unghie dei piedi ( o le unghie ) in ordine sequenziale
Sembra esserci un'opinione dissenziente sull'applicazione precisa di questa tradizione, ma riteniamo che le seguenti regole siano sufficienti per accogliere le persone le cui pratiche religiose vietano di tagliare le unghie dei piedi in ordine:
- Non devono essere tagliate due unghie adiacenti
- La sequenza di taglio sul piede sinistro non dovrebbe corrispondere alla sequenza sul piede destro
- La sequenza di taglio su due cicli consecutivi non dovrebbe essere la stessa. Le sequenze non dovrebbero essere facilmente prevedibili, quindi l'hardcoding di una sequenza alternata non funziona.
Ecco come abbiamo deciso di numerare le dita dei piedi:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
Ho scritto del codice per risolvere il problema, ma l'algoritmo utilizzato non è ottimale: infatti, la prestazione nel caso peggiore è O (∞) . Il modo in cui funziona è paragonabile a bogosort . Ecco una semplificazione dello pseudocodice del codice effettivamente utilizzato:
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)
Fondamentalmente, genera sequenze casuali e controlla se soddisfano i criteri. Se non soddisfa i criteri, ricomincia. Non ci vuole una quantità di tempo ridicolmente lunga, ma è molto imprevedibile.
Mi rendo conto che il modo in cui lo sto facendo attualmente è piuttosto terribile, ma ho problemi a trovare un modo migliore. Qualcuno di voi può suggerire un algoritmo più elegante e performante?