แปรงสีฟันเดินทาง


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

โปรดทราบว่าเขาไม่ใช่เส้นทางเดียวที่เราสามารถทำได้ แต่ไม่มีเส้นทางที่สั้นกว่านี้

ดังนั้นความท้าทายของคุณคือ:

  • คุณจะเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่ยอมรับสองข้อโต้แย้งที่เป็นตัวเลขฟันและผลลัพธ์ (หรือผลตอบแทน) เวลาที่สั้นที่สุดในการแปรงจากที่หนึ่งไปยังอีก
  • คุณป้อนข้อมูลเป็นตัวเลขหรือสตริงและแสดงผลตามที่คุณต้องการ ( ภายในวิธีการที่ยอมรับได้ )
  • ช่องโหว่มาตรฐานจะถูกห้ามโดยค่าเริ่มต้น
  • คำถามนี้คือดังนั้น bytecount ที่สั้นที่สุดจึงชนะ
  • นี่คือตัวอย่างทดสอบ ( ขอบคุณ Jonathan Allan ):

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

โชคดี!


1
@JanathanAllan จะเพิ่มเมื่อฉันกลับไปที่คอมพิวเตอร์ของฉัน
ครึ่งบกครึ่งน้ำ

1
"การย้ายจากฟันซี่หนึ่งใช้เวลา 0 หน่วย" <- แม่นยำยิ่งขึ้นฉันคิดว่าคุณหมายถึง "การย้ายจากฟันซี่หนึ่งไปยังด้านข้างถัดไปนั้นใช้เวลา 0 หน่วย" (ฉันเอามันไปก่อนหมายถึงการย้ายจากฟันใด ๆ ไปยังอีก 1 หน่วยซึ่งทำให้ประโยคถัดไปสับสน)
sundar - Reinstate Monica

@Sundar คุณถูกต้องจะแก้ไข
สะเทินน้ำสะเทินบก

1
@JanathanAllan ทำเสร็จแล้ว
ครึ่งบกครึ่งน้ำ

คำตอบ:


3

เยลลี่ ,  24  20 ไบต์

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

ลิงก์ monadic ยอมรับรายการของจำนวนเต็มสองจำนวน (เช่น[14,31]จาก 14 ถึง 31 ตัวอย่าง) ซึ่งให้เวลาการแปรง

ลองออนไลน์!


24 byter ก่อนหน้านี้สร้างปากและใช้เบส 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

คาดว่าอินพุตเป็นสองอาร์เรย์สององค์ประกอบของตัวเลข 12-> [1, 2]ฉันหวังว่านี่จะเป็นที่ยอมรับ

ลองออนไลน์!

ดูเหมือนกับคำตอบ Python ของ @Chas Brown ที่ใกล้เคียงกันดังนั้นฉันสามารถลบออกได้หากจำเป็น (ไม่แน่ใจว่าจะมีการประชุมที่นี่)

คำอธิบาย

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
" ดูเหมือนซ้ำซ้อนกับคำตอบ Python ของ @Chas Brown ดังนั้นฉันสามารถลบออกได้หากจำเป็น (ไม่แน่ใจในอนุสัญญาที่นี่) " เนื่องจากเป็นภาษาที่ต่างกันทั้งคู่อาจอยู่ เฉพาะในกรณีที่คำตอบสองคำในภาษาเดียวกันนั้นเป็นแนวทางเดียวกันที่ดีที่สุดที่คำตอบหนึ่งโพสต์ล่าสุดจะลบคำตอบของพวกเขา (แม้ว่าคนสองคนที่มีคำตอบเดียวกันแน่นอนและพวกเขาพบว่าเป็นอิสระจากกัน ลบคำตอบถ้ามีเหมือนกันกับคนที่โพสต์เร็วกว่า) แต่ด้วยภาษาที่แตกต่างกันไม่มีปัญหา ยินดีต้อนรับสู่ 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ซึ่งเพิ่งค้นหาระยะห่างระหว่างฟันสองซี่เป็นพิกัดคาร์ทีเซียน ทางออกที่น่าเบื่อจริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.