Gezgin Diş Fırçası


10

Giriş

Bugünün meydan okuması tamamen dişlerle ilgilidir. Özellikle, bir dişten diğerine fırçalama ne kadar sürer. Zorluğunuz, iki dişin yerleri göz önüne alındığında, birinden diğerine fırçalamak için mümkün olan en kısa süreyi çıkarmaktır.

Meydan okuma

Bu meydan okuma için ortalama bir yetişkin insan ağzı düzeni kullanacağız:

İnsan ağzı düzeni.

Bu şemada yaygın olarak kullanılan ISO numaralandırma sistemi gösterilmektedir . Sistem ağzı dört parçaya ayırır ve her birine bir sayı atar: sağ üst (1), sol üst (2), sol alt (3) ve sağ alt (4). Daha sonra her bölümün dişlerini ağzın ortasından 1-8 arasında numaralandırırlar. Bu nedenle, sağ üst taraftaki merkezden dördüncü diş (bölüm 1) 14 numaralı diştir.

Bir diş fırçalamanın 1 birim zaman aldığını varsayalım. Bir dişten diğerine yana doğru hareket etmek 0 birim zaman alır. Ayrıca bir dişten doğrudan üstündeki veya altındaki dişe de geçebilirsiniz, bu da 1 birim zaman alır. Öyleyse diş 14'ten diş 31'e fırçalamak ne kadar sürer? Yukarıdaki şemaya bakarak 7 birim zaman aldığını göreceksiniz. Bunun nasıl hesaplandığı aşağıda açıklanmıştır:

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

Dikkat etmeliyiz ki, bu bizim tek yolumuz değildi, ama daha kısa yollar da yok.

Yani zorluklarınız:

  • Diş sayısı olan iki argümanı kabul eden ve birinden diğerine fırçalamak için en kısa süreyi veren (veya döndüren) tam bir program veya işlev yazacaksınız.
  • Sayı veya karakter dizisi olarak girdi alırsınız ve istediğiniz şekilde çıktı alabilirsiniz ( kabul edilebilir yöntemler dahilinde ).
  • Standart boşluklar varsayılan olarak yasaktır.
  • Bu soru , bu yüzden en kısa bayt kazanır.
  • İşte bazı testcases ( Teşekkürler Jonathan Allan ):

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

İyi şanslar!


1
@JonathanAllan bilgisayarıma geri döndüğümde ekleyecek.
Amfibolojik

1
"Dişten dişe geçmek 0 birim zaman alır." <- Daha doğrusu, "Bir dişten bir sonraki yana doğru hareket etmek 0 birim zaman alır" demek istediniz. (İlk olarak herhangi bir dişten diğerine geçmek anlamına geliyordu, bir sonraki cümleyi kafa karıştırıcı yapan 1 birim alır.)
sundar - Monica'yı eski haline

@ sundar haklısın, düzenleyecek.
Amfibolojik

1
@JonathanAllan bitti.
Amfibolojik

Yanıtlar:


3

Jöle ,  24  20 bayt

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

[14,31]Fırçalama süresini veren iki tamsayı listesini (örneğin 14 ila 31 örnek için) kabul eden monadik bir bağlantı .

Çevrimiçi deneyin!


Önceki 24 byter ağzı inşa etti ve taban 8'i kullandı, girdi basamak listelerinin bir listesiydi:

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

5

JavaScript (ES6), 65 bayt

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

Girişi dize olarak alır.



1

JavaScript (ES6), 67 bayt

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

Girdileri iki adet 2 basamaklı sayı dizisi olarak bekler. 12-> [1, 2]Umarım bu kabul edilebilir.

Çevrimiçi deneyin!

@Chas Brown'un Python cevabına neredeyse bir kopya gibi görünüyor , bu yüzden gerekirse kaldırabilirim (burada sözleşmelerden emin değilim).

açıklama

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'un Python cevabına yakın bir kopya gibi görünüyor, bu yüzden gerekirse kaldırabilirim (buradaki sözleşmelerden emin değilim). " Farklı diller olduklarından ikisi de kalabilir. Aynı dilde iki cevap tam olarak aynı ise, en son gönderilen kişinin cevaplarını silmesi en iyi uygulamadır (her ne kadar iki kişi aynı cevaba sahipse ve birbirinden bağımsız bulsalar da her ikisini de saklamalarına izin verilir; çoğu Ancak daha önce posta gönderen biriyle tamamen aynı yanıtları varsa silin). Ancak farklı dillerde sorun yoktur. PPCG'ye Hoşgeldiniz! :)
Kevin Cruijssen

1

Python 2 ,  80  78 bayt

Muhtemelen burada hala bazı golf fırsatları

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

İsmi açıklanmayan iki tamsayı kabul işlevi, sve efırçalama zamanı döndürür.

Çevrimiçi deneyin!


0

Temiz , 134 128 126 bayt

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

Çevrimiçi deneyin!

$ :: Int Int -> Intİki diş arasındaki mesafeyi Kartezyen koordinatlar olarak bulan fonksiyonu tanımlar . Gerçekten oldukça sıkıcı bir çözüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.