Избегайте самого крутого спуска!


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ā :)
Beta Decay

Ответы:


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.