私は、足の爪を自動的にトリミングするマシンのソフトウェアに取り組んでいます。そのため、ユーザーは自分の足をその中に入れて実行するだけで、手動でかむことや爪切りを使用する必要はありません。
潜在的なユーザーベースのかなりの割合がユダヤ人である可能性が高く、明らかに、足指の爪(または指の爪)を順番どおりにトリミングしないという伝統があります。
この伝統の正確な適用については反対意見があるようですが、次のルールは、宗教的な慣習により爪を順番に切ることを禁止している人々に対応するのに十分だと思います。
- 隣接する2つの足指の爪を連続して切断しないでください
- 左足の切断順序は右足の順序と一致してはなりません
- 2つの連続したランの切断順序は同じであってはなりません。シーケンスは簡単には予測できないため、交互のシーケンスをハードコーディングしても機能しません。
これは、つま先に番号を付けることを決定した方法です。
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)
基本的に、ランダムなシーケンスを生成し、それらが基準を満たしているかどうかをチェックします。基準を満たしていない場合は、最初からやり直します。途方もなく長い時間はかかりませんが、非常に予測不可能です。
現在のやり方はかなりひどいことに気づきましたが、もっと良い方法を思い付くのに苦労しています。よりエレガントで高性能なアルゴリズムを提案できる人はいますか?