Pracuję nad oprogramowaniem do maszyny, która będzie automatycznie przycinać paznokcie, tak aby użytkownicy mogli po prostu włożyć w nią stopy i uruchomić ją, zamiast robić to ręcznie, gryząc je lub używając obcinaczy do paznokci.
Znaczny procent naszej potencjalnej bazy użytkowników będzie prawdopodobnie pochodzenia żydowskiego i najwyraźniej istnieje tradycja nie przycinania paznokci u nóg ( lub paznokci ) w kolejności sekwencyjnej
Wydaje się, że istnieją odrębne opinie na temat dokładnego stosowania tej tradycji, ale uważamy, że poniższe zasady są wystarczające, aby dostosować się do osób, których praktyki religijne zabraniają przycinania paznokci w celu:
- Żadne dwa sąsiadujące paznokcie nie powinny być przycinane jeden po drugim
- Sekwencja cięcia na lewej stopie nie powinna odpowiadać sekwencji na prawej stopie
- Sekwencja cięcia w dwóch kolejnych seriach nie powinna być taka sama. Sekwencje nie powinny być łatwe do przewidzenia, więc zakodowanie na stałe sekwencji naprzemiennej nie działa.
Oto jak zdecydowaliśmy się ponumerować palce:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
Napisałem kod, aby rozwiązać problem, ale zastosowany algorytm jest nieoptymalny: w rzeczywistości najgorsza wydajność to O (∞) . Sposób działania jest porównywalny z bogosortem . Oto uproszczenie pseudokodu używanego kodu:
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)
Zasadniczo generuje losowe sekwencje i sprawdza, czy spełniają kryteria. Jeśli nie spełnia kryteriów, zaczyna się od nowa. Nie zajmuje to absurdalnie długiego czasu, ale jest bardzo nieprzewidywalne.
Zdaję sobie sprawę, że sposób, w jaki obecnie to robię, jest dość okropny, ale mam problem z wymyśleniem lepszego sposobu. Czy ktoś z was może zaproponować bardziej elegancki i skuteczniejszy algorytm?