前書き
今日の課題はすべて歯についてです。具体的には、ある歯から別の歯へのブラッシングにかかる時間。あなたの課題は、2つの歯の位置を考えると、最初から2番目の歯まで磨くのに可能な最短時間で出力することです。
チャレンジ
この課題では、平均的な成人の人間の口のレイアウトを使用します。
この図は、広く使用されているISO番号付けシステムを示しています。システムは口を4つの部分に分割し、それぞれに番号を割り当てます。右上(1)、左上(2)、左下(3)、右下(4)です。次に、各セクションの歯に口の中央から1〜8の番号を付けます。したがって、右上側の中央から4番目の歯(セクション1)は、歯番号14です。
1本の歯を磨くのに1単位時間かかると仮定しましょう。1つの歯から次の歯に横に移動するには、0単位の時間がかかります。歯からその真上または真下の歯まで交差することもできます。これにも1単位の時間がかかります。では、14番歯から31番歯までブラッシングするのにどのくらいかかりますか?上の図を見ると、7単位の時間がかかることがわかります。計算方法は次のとおりです。
Action : Unit of time
Brushing tooth 14 : 1 unit
Brushing tooth 13 : 1 unit
Brushing tooth 12 : 1 unit
Brushing tooth 11 : 1 unit
Brushing tooth 21 : 1 unit
Cross to bottom of mouth : 1 unit
Brushing tooth 31 : 1 unit
------------------------------
Total: 7 units
私たちがたどることができたのは彼だけではありませんが、それより短い経路はありません。
だからあなたの挑戦は:
- 歯の番号である2つの引数を受け取り、最短の時間で1つのブラシから別のブラシに出力する(または返す)完全なプログラムまたは関数を記述します。
- 入力を数値または文字列として受け取り、希望する方法で(許容可能なメソッド内で)出力します。
- 標準の抜け穴はデフォルトで禁止されています。
- この質問はcode-golfなので、最短のバイト数が優先されます。
ここにいくつかのテストケースがあります(Jonathan Allanに感謝します):
14, 21 => 5 14, 44 => 3 14, 14 => 1 33, 37 => 5
幸運を!
