【发布时间】:2011-10-14 14:21:28
【问题描述】:
我正在开发一种机器的软件,该机器会自动修剪脚趾甲,这样用户就可以简单地将脚放入其中并运行它,而不必通过咬脚趾或使用指甲剪来手动完成。
我们的潜在用户群中很大一部分可能是犹太人,而且很明显,有一个tradition about not trimming toenails (or fingernails) 按顺序排列
对于这一传统的精确应用似乎存在不同意见,但我们认为以下规则足以适应宗教习俗禁止按顺序剪脚趾甲的人:
- 相邻的两个脚趾甲不得连续剪断
- 左脚的切割顺序不应与右脚的顺序匹配
- 两次连续运行的切割顺序不应相同。序列不应轻易预测,因此对交替序列进行硬编码是行不通的。
这就是我们决定给脚趾编号的方式:
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)
基本上,它会生成随机序列并检查它们是否符合条件。如果不符合标准,则重新开始。它不需要很长的时间,但它是非常不可预测的。
我意识到我目前的做法非常糟糕,但我很难想出更好的方法。你们中有人能推荐一个更优雅、更高效的算法吗?
【问题讨论】:
-
这听起来像是一个家庭作业问题。否则,为什么不直接对序列进行硬编码?
-
听说过咬指甲,但是咬脚趾甲?
-
一想到剪趾甲机就很吓人。我希望这确实是功课,而不是等待发生的痛苦悲剧。
-
这里的编程挑战是控制剪脚趾甲的机器,这样它就不会伤害到人。如果有一个程序员能够解决这个问题,那么这个人肯定可以在两分钟内解决这个问题。
-
我喜欢这样一个事实,即有关犹太传统的问题被标记为(语言)不可知论... :-)
标签: algorithm language-agnostic