En dik inişten kaçının!


19

Arka fon

Birkaç ay önce, hayatınızın macerası başlamak üzereydi. Şimdi, bu kesin anda (evet, şimdi), aylarca süren acı ve sıkı çalışmanın ardından, siz ve bir grup arkadaş dünyanın tepesinde duruyorsunuz. Evet haklısınız, Sagarmāthā'in zirvesindesiniz .

Ancak, işler istediğiniz kadar iyi gitmiyor. Yoğun bir sis sizi kuşattı ve inanılmaz derecede kötü görünen bir fırtına olabildiğince hızlı geliyor. Yukarı çıkarken hiçbir ipi düzeltmediniz ve ayak izleriniz karla kaplı. Hayatta kalmak istiyorsanız (en azından bugün için), olabildiğince hızlı bir şekilde oradan çıkmanız gerekiyor, ancak önce dağın hangi yüzünün inmeniz gerektiğini bilmenin bir yolunu bulmalısınız.

Neyse ki, yolculuktan önce değiştirdiğiniz uydu telefonunuzu yanınızda getirdiniz, böylece programlarınızı programlayabilir ve yürütebilirsiniz.

Meydan okuma

ASCII-eski-moda-okunamaz-dünyanın en üstünde bir şekilde dağ haritasını telefonunuza indirebilirsiniz. Göreviniz, dağın hangi yüzünün en kolay inişi sunduğuna karar vermektir, böylece hayatta kalma şansınızı artırabilirsiniz. Bunu yapmak için, telefonunuzda hangisinin en kolay yol olduğunu söyleyecek bir programı kodlamak için mükemmel bir fikriniz var. (Feragat: Bu faaliyetler profesyoneller tarafından yapılmıştır. Bu rivayet sırasında hiçbir programcı zarar görmemiştir. Lütfen bunu evde denemeyin.)

Haritalar yalnızca karakterlerden /ve \(artı boşluklar ve yeni satırlar) yapılır. Herhangi bir haritada, dağın zirvesi her zaman tarafından temsil edilir.

 /\ 
 \/ 

ve zirvenin her iki yanından ( 1,2,3veya 4) her zaman dağdan aşağı doğru "mümkün" bir yol bulacaksınız.

1 /\ 2
3 \/ 4

Rotalar her zaman bir sonraki şekilde sunulur:

                      \
  Steep-> /          /
           /        / <-Flat
            /      \
      Flat-> \    \
              /  \ <-Steep
               /\
               \/

burada her yeni karakter selefinin solunda / sağında bir yer. Her karakterin anlamı:

  • Eğik çizgi / boşluk, zirve tarafına paralelse -> 'dik' bir parça olarak sayılır.
  • Eğer eğik çizgi / ters eğik çizgi zirve tarafına dik ise -> 'düz' bir parça olarak sayılır.

* Daha fazla referans için yukarıdaki grafiğe bakınız.

Not : Tarafların farklı uzunlukları olabilir ve zirveyi oluşturan karakterler de taraflarının bir parçası olarak sayılır. Beraberlik durumunda, bunlardan herhangi birini seçebilirsiniz.

Standart boşluklara izin verilmez.

Giriş

Dağın haritasını temsil eden bir dize veya aynı bilgileri içeren düz bir metin dosyası.

ya

C:\....\file.txt

veya

                  \
      /          /
       /        /
        /      \
         \    \
          /  \
           /\
           \/
          \  /
         \    \
        \      \
       \        \
      /          /

dize olarak geçerli girdilerdir.

Çıktı

Çıkış olarak, bir düz metin olarak veya tarafından stdout'u bir dosya ya üretmelidir en küçük ortalama dikliği ile tarafının ASCII profil gösterimi kullanılarak _düz parçalar için ve /dik parçalar için ortalama dikliği ile birlikte tarafının (number of "/")/(total chars).

Yukarıdaki harita için çıktı örneği:

       /
   ___/
  /
  AS:0.5

Profil ve ortalama dikliğe sahip olduğunuz sürece format önemli değildir.

puanlama

Ne? Arkadaşınızın ve hayatınızın kurtarılmasından ve dünyanın en üstünde programlanmış ilk programcı olmaktan daha iyi bir ödül ister misiniz? Tamam ... bu kod golfü, baytlardaki en kısa program kazanıyor.

Test senaryoları

Giriş:

                  \
      /          /
       /        /
        /      \
         \    \
          /  \
           /\
           \/
          \  /
         \    \
        \      \
       \        \
      /          /

Çıktı:

       /
   ___/
  /
  AS=0.5

Giriş:

                  /
      \          /
       /        /
        \      /
         \    /
          /  /
           /\
           \/
          \  /
         \    \
        \      \
       \        \
      /          /
     / 
    / 

Çıktı:

______/
AS=0.143 (1/7)

Giriş:

           /        \
            \      \
             /    /
              /  \
               /\
               \/
              \  /
             \    /
            \      /
           /        \

Çıktı:

        /        
       /
      /       
    _/
    AS=0.8

Örneklere göre, soldan sağa okursanız profil aşağıdan yukarıya doğru yolu gösteriyor mu? Yukarıdan aşağıya doğru hareket ettiğimiz için biraz sıra dışı görünüyor, ancak bu şekilde açıkça tanımlanırsa sorun yok.
Reto Koradi

6
@ RetoKoradi haklısın. Neden böyle yaptığımı bilmiyorum ... Bilirsiniz, düşüncelerinizi düzenli tutmak zor ...
Ioannes

Çıktı ayrıca en az dik olan eğim sayısını da içermeli mi (1,2,3 veya 4)? Durduğu gibi, bunlardan birinin kesinlikle kazanan olduğunu, ancak hangisinin olmadığını biliyorsunuz.
Vic

1
* Bu rivayet sırasında hiçbir programcı zarar görmedi. * Umurumda. +1
edc65

3
Sagarmāthā :)
Beta Decay

Yanıtlar:


4

JavaScript (ES6), 303

Parçacık darbesini EcmaScript uyumlu bir tarayıcıda çalıştırmayı test edin - kesinlikle Firefox, muhtemelen Chrome. Şablon dizelerini kullanma, ok fonksiyonları.

// Golfed, no indentenation, all newlines are significant

f=s=>(s=`
${s}
`.split`
`,s.map((r,i)=>~(q=r.search(/\/\\/))&&(y=i,x=q),x=y=0),z=[],[0,2,0,2].map((d,i)=>{t=x+i%2,u=y+i/2|0,b=s[u][t];for(p=[''],n=l=0;(c=s[u][t])>' ';++l,t+=d-1,u+=(i&2)-1)c==b?p.push(p[n++].replace(/./g,' ',w='/')):w='_',p=p.map((r,i)=>(i<n?' ':w)+r);z=z[0]<(p[0]=n/l)?z:p}),z.join`
`)

// Less golfed

U=s=>(
  s=(`\n${s}\n`).split`\n`,
  x = y = 0,
  s.map((r,i)=>~(q=r.search(/\/\\/))&&(y=i,x=q)),
  z=[],
  [0,2,0,2].map((d,i) => {
    t = x+i%2,
    u = y+i/2|0,
    b = s[u][t];
    for(p=[''], n=l=0; (c=s[u][t])>' '; ++l, t += d-1, u +=(i&2)-1)
      c == b
        ? p.push(p[n++].replace(/./g,' ',w='/'))
        : w='_',
      p = p.map((r,i) => (i<n?' ':w)+r);
    z = z[0]<(p[0]=n/l)?z:p
  }),
  z.join`\n`
)

// TEST
// redirect console into the snippet body
console.log=x=>O.innerHTML+=x+'\n'

maps=[ // as javascript string literals, each baskslasch has to be repeated
`                  \\
      /          /
       /        /
        /      \\
         \\    \\
          /  \\
           /\\
           \\/
          \\  /
         \\    \\
        \\      \\
       \\        \\
      /          /`,
`                  /
      \\          /
       /        /
        \\      /
         \\    /
          /  /
           /\\
           \\/
          \\  /
         \\    \\
        \\      \\
       \\        \\
      /          /
     / 
    / `,
`           /        \\
            \\      \\
             /    /
              /  \\
               /\\
               \\/
              \\  /
             \\    /
            \\      /
           /        \\`]

maps.forEach(m=>console.log(m + '\n'+ f(m) +'\n'))
<pre id=O></pre>

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.