Уникайте найкрутішого спуску!


19

Фон

Кілька місяців тому пригода у вашому житті тільки-но почалася. Тепер, в цю точну хвилину (так, зараз), після місяців страждань і важкої праці, ви з групою друзів стоїте на вершині світу. Так, ти маєш рацію, ти на саміті Сагармата .

Однак справи йдуть не так добре, як хотілося б. Густий туман оточив вас, і неймовірно поганий шторм іде якнайшвидше. Ви не зафіксували жодної мотузки на підйомі, і ваші сліди були вкриті снігом. Якщо ви хочете вижити (принаймні на сьогоднішній день), вам потрібно вийти звідти якомога швидше, але ви ОБОВ'ЯЗКОВО спочатку знайти спосіб дізнатися, яке обличчя гори - це те, до якого слід спуститися.

На щастя, ви принесли з собою свій супутній телефон, який ви змінили перед поїздкою, щоб ви могли програмувати та виконувати програми в ньому.

Виклик

Ви змогли завантажити на свій телефон карту гори в ASCII старомодно-нечитабельно-на-вершині світу. Ваше завдання - визначити, яке обличчя гори представляє найлегший спуск, щоб ви могли збільшити шанси вижити. Для цього у вас є геніальна ідея кодувати програму на своєму телефоні, яка підкаже, який найпростіший шлях вниз. (Відмова: Цими заходами займалися професіонали. Жоден програміст не постраждав під час цієї розповіді. Будь ласка, не намагайтеся цього робити вдома.)

Карти складаються лише з символів /та \(плюс пробіли та нові рядки). На будь-якій карті вершина гори завжди представлена ​​символом

 /\ 
 \/ 

і з кожної зі сторін ( 1,2,3або 4) вершини ви завжди знайдете "можливий" шлях вниз по горі.

1 /\ 2
3 \/ 4

Маршрути завжди представлені наступним чином:

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

де кожен новий символ є або одним місцем ліворуч / праворуч від свого попередника. Значення кожного персонажа:

  • Якщо коса нахил / люфт паралельна стороні саміту -> вважається "крутою" частиною.
  • Якщо коса коса риса нахилу / косою рисою перпендикулярна до верхньої частини -> вважається "плоскою" частиною.

* Для подальшого ознайомлення див. Графіку вище.

Примітка . Сторони можуть мати різну довжину, і символи, що складають вершину, також вважаються частиною їхньої сторони. У разі жеребкування ви можете вибрати будь-який з них.

Стандартні лазівки заборонені.

Вхідні дані

Рядок, що представляє карту гори або звичайний текстовий файл, що містить ту саму інформацію.

Або

C:\....\file.txt

або

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

як рядок є допустимими входами.

Вихідні дані

Як вихід, ви повинні робити або файл в текстовому або на стандартний висновок в ASCII профілю уявлення боку з найменшою середньої крутизни , використовуючи _для плоских деталей і /для крутих частин разом з середньою крутизною в сторону (number of "/")/(total chars).

Приклад виводу для карти вище:

       /
   ___/
  /
  AS:0.5

Формат не важливий, якщо у вас профіль і середня крутизна.

Оцінка балів

Що? Ви хочете кращої нагороди, ніж врятувати життя свого та свого друга і бути першим програмістом, який коли-небудь програмував на вершині світу? Гаразд ... це код гольфу, тому найкоротша програма в байтах виграє.

Тестові справи

Вхід:

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

Вихід:

       /
   ___/
  /
  AS=0.5

Вхід:

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

Вихід:

______/
AS=0.143 (1/7)

Вхід:

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

Вихід:

        /        
       /
      /       
    _/
    AS=0.8

Виходячи з прикладів, схоже, що профіль показує шлях внизу до верхнього напрямку, якщо ви читаєте його зліва направо? Здається дещо незвично, оскільки ми рухаємося зверху вниз, але немає проблем, якщо це чітко визначено таким чином.
Рето Кораді

6
@RetoKoradi ви праві. Я не знаю, чому я це зробив саме так ... Ви знаєте, на цій висоті важко тримати свої думки в порядку ...
Іоанн

Чи слід також включати число схилу, який є найменш крутим (1,2,3 або 4)? Як відомо, ви знаєте, що один з них, безумовно, переможець, але не той.
Вік

1
* Жоден програміст не постраждав під час цієї розповіді. * Мені не байдуже. +1
edc65

3
Мені подобається, що ти використовував Sagarmāthā :)
бета-розпад

Відповіді:


4

JavaScript (ES6), 303

Тест запуску фрагмента удару в сумісному браузері EcmaScript - безумовно, Firefox, можливо, Chrome. Використовуючи рядки шаблону, функції стрілок.

// 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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.