旅する歯ブラシ


10

前書き

今日の課題はすべて歯についてです。具体的には、ある歯から別の歯へのブラッシングにかかる​​時間。あなたの課題は、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つのブラシから別のブラシに出力する(または返す)完全なプログラムまたは関数を記述します。
  • 入力を数値または文字列として受け取り、希望する方法で(許容可能なメソッド内で)出力します。
  • 標準の抜け穴はデフォルトで禁止されています。
  • この質問はなので、最短のバイト数が優先されます。
  • ここにいくつかのテストケースがあります(Jonathan Allanに感謝します):

    14, 21 => 5
    14, 44 => 3
    14, 14 => 1
    33, 37 => 5
    

幸運を!


1
@JonathanAllanは、コンピューターに戻ったときに追加されます。
— Amphibological 2007

1
「歯から歯への移動には0単位の時間がかかります。」<-より正確には、「1つの歯から次の歯に横に移動するのにかかる時間は0単位」という意味だと思います。(私は最初に、どの歯から他の歯への移動も1ユニットを取ることを意味していたため、次の文は混乱を招きました。)
— sundar-Reonica Monica

@sundar正しい、編集します。
— Amphibological 2007

1
@JonathanAllan完了しました。
— 2018

回答:


3

ゼリー、 24  20 バイト

d30%20ị2¦⁵R;C$¤)ạ/Ḅ‘

2つの整数のリストを受け入れるモナディックリンク(たとえば[14,31]、14から31の例の場合)。これにより、ブラッシング時間が得られます。

オンラインでお試しください!


以前の24ビッターは口を構築し、ベース8を使用しました。入力は数字のリストのリストでした。

8R;C$C+⁴U,+ɗ⁴
ḅ8¢œiⱮạ/Ḅ‘

5

JavaScript(ES6)、65バイト

f=([s,t],[u,v])=>s<3^u<3?f(s+t,5-u+v)+2:s-u?t-+-v:t<v?++v-t:++t-v

for(i=1;i<5;i++)for(j=1;j<9;j++){let o=document.createElement("option");o.text=""+i+j;s.add(o);t.add(o.cloneNode(true));}
<div onchange=o.textContent=f(s.value,t.value)><select id=s></select><select id=t></select><pre id=o>1

入力を文字列として受け取ります。



1

JavaScript(ES6)、67バイト

([a,b],[x,y])=>(u=(a==x)+3*!(a+x-5))?Math.abs(b-y)+u:2*!(a-x&1)+b+y

入力は数字の2つの2要素配列として期待されます。12->[1, 2]これが許容できることを願っています。

オンラインでお試しください!

@Chas BrownのPythonの回答とほぼ重複しているように見えるので、必要に応じて削除できます(ここの規則は不明です)。

説明

var g =
([a,b], [x,y]) =>
    (u = (a == x)                // if same quadrant of mouth
     + 3 * !(a + x - 5))         // or strictly traversing vertically (e.g. 1 to 4, or 2 to 3)
        ? Math.abs(b - y) + u    // absolute difference plus additional units of time
        : 2 * !(a - x & 1)       // = 2 if traversing diagonally
            + b + y

2
「@Chas BrownのPythonの回答とほぼ重複しているように見えるので、必要に応じて削除できます(ここでの規則がわからない)。」異なる言語であるため、両方とも残る可能性があります。同じ言語の2つの回答がまったく同じである場合にのみ、最後に投稿した回答が最後に回答を削除することがベストプラクティスです(ただし、2人の回答がまったく同じで、お互いに独立していることがわかった場合、両方を保持することが許可されます。ただし、より早く投稿した人とまったく同じ場合は、回答を削除してください)。しかし、異なる言語で問題はありません。PPCGへようこそ!:)
— Kevin Cruijssen、2018


0

クリーン、134の 128 126バイト

import StdEnv
@n=hd[i\\i<-[0..]&k<-[18,17..11]++[21..28]++[48,47..41]++[31..38]|n==k]rem 16
$a b=abs(@a- @b)+a/30bitxor b/30+2

オンラインでお試しください!

$ :: Int Int -> Int2つの歯の間の距離をデカルト座標として検索する関数を定義します。本当に退屈なソリューションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.