Estou trabalhando no software para uma máquina que cortará automaticamente as unhas dos pés, para que os usuários possam simplesmente colocar os pés nela e executá-la em vez de ter que fazer isso manualmente, mordendo-as ou usando um cortador de unhas.
Uma porcentagem considerável de nossa base de usuários em potencial provavelmente será judia e, evidentemente, há uma tradição de não aparar as unhas dos pés ( ou unhas ) em ordem sequencial
Parece haver opinião divergente sobre a aplicação precisa dessa tradição, mas pensamos que as seguintes regras são suficientes para acomodar pessoas cujas práticas religiosas proíbem cortar as unhas dos pés na ordem:
- Duas unhas adjacentes não devem ser cortadas consecutivamente
- A sequência de corte do pé esquerdo não deve corresponder à sequência do pé direito
- A sequência de corte em duas execuções consecutivas não deve ser a mesma. As sequências não devem ser facilmente previsíveis, portanto, codificar uma sequência alternada não funciona.
É assim que decidimos numerar os dedos dos pés:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
Eu escrevi um código para resolver o problema, mas o algoritmo usado é abaixo do ideal: na verdade, o desempenho do pior caso é O (∞) . A forma como funciona é comparável ao bogosort . Aqui está uma simplificação de pseudocódigo do código real usado:
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)
Basicamente, ele gera sequências aleatórias e verifica se atendem aos critérios. Se não atender aos critérios, é reiniciado. Não leva um tempo ridiculamente longo, mas é muito imprevisível.
Percebo que a maneira como estou fazendo isso é terrível, mas estou tendo problemas para encontrar uma maneira melhor. Algum de vocês pode sugerir um algoritmo mais elegante e de desempenho?