旅行牙刷


10

介绍

今天的挑战完全是牙齿。具体来说,从一颗牙齿刷到另一颗牙齿需要多长时间。您面临的挑战是,鉴于两颗牙齿的位置,从第一根到第二根要刷牙的时间最短。

挑战

对于这一挑战,我们将使用成年人口的布局:

人嘴的布局。

该图显示了广泛使用的ISO编号系统。系统将嘴巴分为四个部分,并分别为它们分配一个数字:右上(1),左上(2),左下(3)和右下(4)。然后,他们从嘴中开始从1-8编号每个部分的牙齿。因此,从右上角中央起第四个牙齿(第1部分)是牙齿编号14。

假设刷一颗牙齿花费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

请注意,他不是我们唯一可以走的路,但是没有更短的路。

因此,您面临的挑战是:

  • 您将编写一个完整的程序或函数,该程序或函数接受两个参数,即牙齿编号,并输出(或返回)从一个刷到另一个刷的最短时间。
  • 您可以将输入作为数字或字符串,然后按需要输出(在可接受的方法内)。
  • 默认情况下,标准漏洞是禁止的。
  • 这个问题是,所以最短的字节数取胜。
  • 以下是一些测试用例(感谢Jonathan Allan):

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

祝好运!


1
当我回到计算机时,@ JonathanAllan将添加。
血液学

1
“从一个牙齿移动到另一个牙齿需要0个时间单位。” <-更准确地说,我认为您的意思是“从一颗牙齿到另一颗牙齿的横向移动需要0单位时间”。(我首先把它的意思是从任何牙齿转移到任何其他牙齿都需要1个单位,这使下句话变得令人困惑。)
sundar-恢复莫妮卡

@sundar,您说对了,将进行编辑。
血液流变学

1
@JonathanAllan做完了。
血液流变学

Answers:



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位数的数字数组。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答案几乎是重复的,因此如有必要,我可以将其删除(不确定此处的约定)。 ”由于它们是不同的语言,两者都可能保留。仅当两个使用相同语言的答案完全相同时,最佳做法是最后发布的一个答案删除他们的答案(尽管如果两个人的答案完全相同,并且彼此独立发现,则可以保留两个答案;大多数会不过,如果他们的答案与发布时间较早的人的答案完全相同,请删除他们的答案)。但是使用不同的语言没有问题。欢迎来到PPCG!:)
Kevin Cruijssen

1

Python 2中 80  78个字节

也许这里还有一些打高尔夫球的机会

lambda s,e,l=(range(11)+range(0,-9,-1))*2:abs(l[s%30]-l[e%30]+s/30*2-e/30*2)+1

一个接受两个整数的未命名函数,s并且e返回刷洗时间。

在线尝试!


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 -> Int,该函数仅将两个牙齿之间的距离作为笛卡尔坐标来查找。确实很无聊的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.