Каков оптимальный еврейский алгоритм стрижки ногтей на ногах?

Я работаю над программным обеспечением для машины, которая будет автоматически обрезать ногти на ногах, чтобы пользователи могли просто положить в нее ноги и запустить ее вместо того, чтобы делать это вручную, кусая их или кусачками для ногтей.

Значительный процент нашей потенциальной базы пользователей, вероятно, будут евреями, и, очевидно, существует традиция не стричь ногти на ногах ( или ногти ) в последовательном порядке

Похоже, существует особое мнение о точном применении этой традиции, но мы считаем, что следующих правил достаточно, чтобы приспособить людей, чьи религиозные обычаи запрещают стрижку ногтей на ногах, по порядку:

  • Никакие два соседних ногтя не должны обрезаться последовательно
  • . Последовательность резания на левой ступне не должна совпадать с последовательностью на правой ступне
  • Последовательность резания на двух последовательных проходах не должна быть одинаковой. Последовательности не должны быть легко предсказуемыми, поэтому жесткое кодирование чередующихся последовательностей не работает.

Вот как мы решили пронумеровать пальцы:

5 4 3 2 1  1 2 3 4 5
Left foot  Right foot

Я написал код для решения проблемы, но используемый алгоритм не оптимален: фактически, производительность в худшем случае составляет O (∞) . Принцип его работы сравним с богосортом .Вот упрощенный псевдокод фактически используемого кода:

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)

По сути, он генерирует случайные последовательности и проверяет, соответствуют ли они критериям. Если он не соответствует критериям, все начинается заново. Это не занимает до смешного много времени, но очень непредсказуемо.

Я понимаю, что то, что я делаю сейчас, довольно ужасно, но у меня возникли проблемы с поиском лучшего способа. Может ли кто-нибудь из вас предложить более элегантный и производительный алгоритм?

117
задан Community 13 April 2017 в 12:42
поделиться