Я работаю над программным обеспечением для машины, которая автоматически обрезает ногти на ногах, чтобы пользователи могли просто вставлять свои ноги в нее и запускать ее вместо того, чтобы вручную делать это, кусая их или используя кусачки для ногтей.
Значительный процент нашей потенциальной базы пользователей, вероятно, будет евреем и, по-видимому, существует традиция не обрезать ногти на ногах (или ногти) в последовательном порядке
Похоже, что существует особое мнение о точном применении этой традиции, но мы считаем, что для того, чтобы разместить людей, чья религиозная практика запрещает вырезать ногти на ногах, необходимо соблюдать следующие правила:
- Два соседних ногтя не должны быть разрезаны последовательно
- Последовательность резания на левой ноге не должна соответствовать последовательности на правой ноге
- Последовательность резания на двух последовательных прогонах не должна быть одинаковой. Последовательности не должны быть легко предсказуемыми, поэтому жесткое кодирование чередующейся последовательности не работает.
Вот как мы решили указать пальцы ног:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
Я написал код для решения проблемы, но используемый алгоритм является субоптимальным: на самом деле производительность худшего случая O (∞). Способ его работы сопоставим с bogosort. Ниже приведено упрощение псевдокода фактического используемого кода:
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)
В принципе, он генерирует случайные последовательности и проверяет, соответствуют ли они критериям. Если он не соответствует критериям, он начинается. Это не занимает смехотворно много времени, но это очень непредсказуемо.
Я понимаю, что то, как я сейчас это делаю, довольно ужасно, но у меня проблемы с лучшими способами. Может ли кто-нибудь из вас предложить более элегантный и эффективный алгоритм?