Unikaj najbardziej stromego zejścia!

19

tło

Kilka miesięcy temu przygoda Twojego życia właśnie się rozpoczęła. Teraz, w tym właśnie momencie (tak, teraz), po miesiącach cierpienia i ciężkiej pracy, ty i grupa przyjaciół stoicie na szczycie świata. Tak, masz rację, jesteś na szczycie Sagarmatha .

Jednak sprawy nie idą tak dobrze, jak byś chciał. Otoczyła cię gęsta mgła, a niesamowicie źle wyglądająca burza nadchodzi tak szybko, jak to możliwe. Po drodze nie naprawiłeś żadnej liny, a twoje ślady stóp były pokryte śniegiem. Jeśli chcesz przeżyć (przynajmniej na dziś), musisz się stąd wydostać tak szybko, jak to możliwe, ale najpierw musisz znaleźć sposób, aby dowiedzieć się, która strona góry jest tą, z której powinieneś zejść.

Na szczęście zabrałeś ze sobą telefon satelitarny, który zmodyfikowałeś przed podróżą, abyś mógł w nim programować i wykonywać programy.

Wyzwanie

Udało ci się pobrać na swój telefon mapę góry w sposób staromodny ASCII-nieczytelny-na-szczycie świata. Twoim zadaniem jest zdecydowanie, która strona góry ma najłatwiejszy zjazd, dzięki czemu możesz zwiększyć swoje szanse na przetrwanie. Aby to zrobić, masz genialny pomysł, aby napisać na telefonie program, który wskaże najłatwiejszą drogę. (Uwaga: Te czynności zostały wykonane przez profesjonalistów. Podczas tej narracji żaden programista nie ucierpiał. Proszę, nie próbuj tego w domu.)

Mapy składają się wyłącznie ze znaków /i \(oraz spacji i znaków nowej linii). Na każdej mapie szczyt góry jest zawsze reprezentowany przez

 /\ 
 \/ 

a z każdej strony ( 1,2,3lub 4) szczytu zawsze znajdziesz „możliwą” drogę w dół góry.

1 /\ 2
3 \/ 4

Trasy są zawsze przedstawiane w następujący sposób:

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

gdzie każda nowa postać jest albo jednym miejscem na lewo / prawo od swojego poprzednika. Znaczenie każdego znaku jest następujące:

  • Jeśli ukośnik / luz jest równoległy do ​​strony szczytu -> liczy się jako „stroma” część.
  • Jeśli ukośnik / ukośnik odwrotny jest prostopadły do ​​strony szczytu -> liczy się jako „płaska” część.

* Dalsze informacje patrz grafika powyżej.

Uwaga : Boki mogą mieć różne długości, a postacie, które tworzą szczyt, również liczą się jako część ich boku. W przypadku losowania możesz wybrać dowolny z nich.

Standardowe luki są niedozwolone.

Wejście

Ciąg reprezentujący mapę góry lub zwykły plik tekstowy zawierający te same informacje.

Zarówno

C:\....\file.txt

lub

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

jako ciąg są poprawnymi danymi wejściowymi.

Wynik

Jako wyjście, należy produkować albo plik w postaci zwykłego tekstu lub przez stdout w reprezentacji profilu ASCII boku o najmniejszej średniej nachylenie stosując _dla części płaskich i /na stromych części wraz ze średnią nachylenie boku (number of "/")/(total chars).

Przykład wyjścia dla powyższej mapy:

       /
   ___/
  /
  AS:0.5

Format nie jest ważny, o ile masz profil i średnią stromość.

Punktacja

Co? Czy chcesz lepszej nagrody niż ratowanie życia swojego i swojego przyjaciela oraz bycie pierwszym programistą, który programował na szczycie świata? Ok ... to jest golf golfowy, więc wygrywa najkrótszy program w bajtach.

Przypadki testowe

Wejście:

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

Wynik:

       /
   ___/
  /
  AS=0.5

Wejście:

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

Wynik:

______/
AS=0.143 (1/7)

Wejście:

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

Wynik:

        /        
       /
      /       
    _/
    AS=0.8
Ioannes
źródło
Na podstawie przykładów wygląda na to, że profil pokazuje ścieżkę od dołu do góry, jeśli czytasz ją od lewej do prawej? Wydaje się to nieco niezwykłe, ponieważ przechodzimy od góry do dołu, ale nie ma problemu, jeśli jest to jasno zdefiniowane w ten sposób.
Reto Koradi
6
@RetoKoradi masz rację. Nie wiem, dlaczego to zrobiłem w ten sposób ... W tej wysokości trudno jest utrzymać porządek w myślach ...
Ioannes
Czy dane wyjściowe powinny również zawierać numer nachylenia, który jest najmniej stromy (1,2,3 lub 4)? W tej chwili wiesz, że jeden z nich jest zdecydowanie zwycięzcą, ale nie który.
Vic,
1
* Podczas tej narracji żaden programista nie został ranny. * Zależy mi. +1
edc65,
3
Podoba mi się, że użyłeś Sagarmāthā :)
Beta Decay

Odpowiedzi:

4

JavaScript (ES6), 303

Przetestuj uruchomienie fragmentu kodu w przeglądarce zgodnej z EcmaScript - na pewno Firefox, prawdopodobnie Chrome. Używanie ciągów szablonów, funkcji strzałek.

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

edc65
źródło