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


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.