我正在为会自动修剪脚趾甲的机器开发软件,以便用户可以简单地将脚放进去并运行它,而不必通过咬伤或使用指甲钳手动进行操作。
我们潜在用户群中有很大一部分可能是犹太人,而且很明显,有一种传统是不按顺序修剪脚趾甲(或指甲)
对于这种传统的确切应用,似乎存在不同意见,但是我们认为以下规则足以容纳宗教信仰禁止按趾甲切割的人:
- 不应连续切割两个相邻的脚趾甲
- 左脚的切割顺序应与右脚的切割顺序不匹配
- 连续两次切割的切割顺序不应相同。序列不应该容易预测,因此对交替序列进行硬编码是行不通的。
这就是我们决定给脚趾编号的方式:
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)
基本上,它会生成随机序列并检查它们是否符合条件。如果不符合条件,则重新开始。它并不需要很长的时间,但是这是非常不可预测的。
我意识到我目前的工作方式非常糟糕,但是我在想出更好的方法时遇到了麻烦。你们中的任何人都可以提出一种更优雅,更高效的算法吗?