여행용 칫솔


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

우리가 취할 수있는 유일한 경로는 아니지만 짧은 경로는 없습니다.

그래서 당신의 도전은 :

  • 치아 번호 인 두 개의 인수를 허용하고 하나에서 다른 것으로 브러시하는 데 가장 짧은 시간을 출력 (또는 반환)하는 전체 프로그램 또는 함수를 작성합니다.
  • 숫자 또는 문자열로 입력하고 원하는 방법으로 허용되는 방법 내에서 출력합니다 .
  • 표준 허점 은 기본적으로 금지되어 있습니다.
  • 이 질문은 이므로 가장 짧은 바이트 수가 이깁니다.
  • 다음은 몇 가지 테스트 사례입니다 ( Thanks Jonathan Allan ).

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

행운을 빕니다!


1
컴퓨터로 돌아 오면 @JonathanAllan이 추가됩니다.
Amphibological

1
"치아에서 치아로 이동하는 데는 0 단위의 시간이 걸립니다." <-더 정확하게 말하면, "한 치아에서 다음 치아로 옆으로 옮기는 데는 0 단위의 시간이 걸린다"는 뜻이라고 생각합니다. (나는 먼저 어떤 치아에서 다른 장치로 1 단위를 옮기는 것을 의미하게되었다. 다음 문장은 혼란
스러웠다

@ sundar 당신이 맞아 편집합니다.
Amphibological

1
@JonathanAllan이 완료했습니다.
Amphibological

답변:



5

자바 스크립트 (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

자바 스크립트 (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 answer 과 거의 비슷한 것처럼 보이 므로 필요한 경우 제거 할 수 있습니다 (여기서는 규칙이 확실하지 않습니다).

설명

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


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두 치아 사이의 거리를 직교 좌표로 찾는 함수를 정의합니다 . 정말 지루한 해결책입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.