Я працюю над програмним забезпеченням для машини, яка автоматично обрізає нігті ніг, так що користувачі можуть просто покласти ноги в неї і запустити її замість того, щоб робити це вручну, кусаючи їх або використовуючи стрижки нігтів.
Значний відсоток нашої потенційної бази користувачів, ймовірно, єврейський, і, очевидно, існує традиція не підстригати нігті нігтів ( або нігті ) в послідовному порядку
Здається, не існує думки щодо точного застосування цієї традиції, але ми вважаємо, що наступні правила є достатніми для розміщення людей, релігійна практика яких забороняє різати нігті на ногах для того, щоб:
- Жодних суміжних нігтів ніг не слід обрізати послідовно
- Послідовність різання на лівій нозі не повинна відповідати послідовності на правій нозі
- Послідовність різання протягом двох послідовних циклів не повинна бути однаковою. Послідовності не повинні бути легко передбачуваними, тому жорстке кодування змінної послідовності не працює.
Ось так ми вирішили нумерувати пальці ніг:
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)
В основному, він генерує випадкові послідовності та перевіряє, чи відповідають вони критеріям. Якщо він не відповідає критеріям, він починається заново. Це не займає смішно багато часу, але це дуже непередбачувано.
Я усвідомлюю, що те, що я зараз роблю, є досить жахливим, але у мене виникають проблеми придумати кращий шлях. Чи може хтось із вас запропонувати більш елегантний та витончений алгоритм?