Bàn chải đánh răng du lịch


10

Giới thiệu

Thử thách hôm nay là tất cả về răng. Cụ thể, mất bao lâu để chải từ răng này sang răng khác. Thử thách của bạn là, đưa ra vị trí của hai chiếc răng, đưa ra khoảng thời gian ngắn nhất có thể để chải từ lần đầu tiên đến lần thứ hai.

Thử thách

Đối với thử thách này, chúng tôi sẽ sử dụng cách bố trí miệng người trưởng thành trung bình:

Bố trí miệng người.

Sơ đồ này cho thấy hệ thống đánh số ISO được sử dụng rộng rãi . Hệ thống chia miệng thành bốn phần và gán cho chúng một số: phía trên bên phải (1), phía trên bên trái (2), phía dưới bên trái (3) và phía dưới bên phải (4). Sau đó, họ đánh số răng của từng phần từ giữa miệng ra từ 1-8. Do đó, răng thứ tư từ trung tâm ở phía trên bên phải (phần 1) là răng số 14.

Giả sử đánh răng một lần mất 1 đơn vị thời gian. Di chuyển từ một răng sang một bên kế tiếp mất 0 đơn vị thời gian. Bạn cũng có thể chuyển từ răng sang răng trực tiếp bên trên hoặc bên dưới nó, cũng mất 1 đơn vị thời gian. Vậy bạn mất bao lâu để chải từ răng 14 đến răng 31? Bằng cách nhìn vào sơ đồ trên, bạn sẽ thấy nó mất 7 đơn vị thời gian. Đây là cách tính toán:

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

Lưu ý rằng đây không phải là tuyến đường duy nhất chúng tôi có thể đi, nhưng không có tuyến đường nào ngắn hơn.

Vì vậy, thách thức của bạn là:

  • Bạn sẽ viết một chương trình hoặc hàm đầy đủ chấp nhận hai đối số là số răng và đầu ra (hoặc trả về) thời gian ngắn nhất để chải từ cái này sang cái kia.
  • Bạn thực hiện lấy đầu vào dưới dạng số hoặc chuỗi và xuất bao giờ bạn muốn ( trong các phương thức có thể chấp nhận ).
  • Các sơ hở tiêu chuẩn bị cấm theo mặc định.
  • Câu hỏi này là , vì vậy, chiến thắng của người chơi ngắn nhất.
  • Dưới đây là một số thử nghiệm ( Cảm ơn Jonathan Allan ):

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

Chúc may mắn!


1
@Jonathan ALLan sẽ thêm khi tôi quay lại máy tính của mình.
Lưỡng cư

1
"Chuyển từ răng sang răng mất 0 đơn vị thời gian." <- Chính xác hơn, tôi nghĩ bạn có nghĩa là "Di chuyển từ răng này sang răng bên cạnh mất 0 đơn vị thời gian". (Trước tiên tôi lấy nó có nghĩa là di chuyển từ bất kỳ chiếc răng nào sang bất kỳ đơn vị nào khác mất 1 đơn vị, khiến cho câu tiếp theo trở nên khó hiểu.)
sundar - Tái lập lại

@sundar bạn nói đúng, sẽ chỉnh sửa.
Lưỡng cư

1
@Jonathan Allan đã xong.
Lưỡng cư

Câu trả lời:


3

Thạch ,  24  20 byte

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

Một liên kết đơn âm chấp nhận danh sách hai số nguyên (ví dụ: từ ví dụ [14,31]từ 14 đến 31) mang lại thời gian đánh răng.

Hãy thử trực tuyến!


24 byter trước đó đã xây dựng miệng và sử dụng cơ sở 8, đầu vào là một danh sách các danh sách các chữ số:

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

5

JavaScript (ES6), 65 byte

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

Lấy đầu vào dưới dạng chuỗi.



1

JavaScript (ES6), 67 byte

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

Yêu cầu đầu vào là hai mảng 2 phần tử chữ số. 12-> [1, 2]Tôi hy vọng điều này được chấp nhận.

Hãy thử trực tuyến!

Trông giống như một bản sao gần giống với câu trả lời Python của @Chas Brown , vì vậy tôi có thể xóa nó nếu cần thiết (không chắc chắn về các quy ước ở đây).

Giải trình

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
" Trông giống như một bản sao gần giống với câu trả lời Python của @Chas Brown, vì vậy tôi có thể xóa nó nếu cần thiết (không chắc chắn về các quy ước ở đây). " Vì chúng là hai ngôn ngữ khác nhau có thể tồn tại. Chỉ khi hai câu trả lời trong cùng một ngôn ngữ giống hệt nhau thì đó là cách tốt nhất mà câu trả lời cuối cùng xóa câu trả lời của họ (mặc dù nếu hai người có cùng một câu trả lời và họ thấy nó độc lập với nhau thì họ mới được phép giữ cả hai; xóa câu trả lời của họ nếu họ có chính xác như một người đăng sớm hơn). Nhưng với các ngôn ngữ khác nhau thì không có vấn đề gì. Chào mừng đến với PPCG! :)
Kevin Cruijssen

1

Python 2 ,  80  78 byte

Có lẽ một số cơ hội chơi golf ở đây vẫn còn

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

Một hàm không tên chấp nhận hai số nguyên setrả về thời gian đánh răng.

Hãy thử trực tuyến!


0

Sạch , 134 128 126 byte

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

Hãy thử trực tuyến!

Xác định hàm $ :: Int Int -> Int, chỉ tìm khoảng cách giữa hai răng là tọa độ Descartes. Giải pháp khá nhàm chán thực sự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.