가장 가파른 하강을 피하십시오! /

배경

몇 달 전, 당신의 인생의 모험은 막 시작되었습니다. 지금,이 정확한 순간에 (그래, 지금), 수개월의 고난과 노력 끝에, 여러분과 친구 그룹이 세계 정상에 서 있습니다. 네, 그렇습니다, 당신은 Sagarmāthā 의 정상에 있습니다 .

그러나 원하는대로 일이 진행되지 않습니다. 짙은 안개가 당신을 둘러싸고 있으며 엄청나게 나쁜 폭풍우가 가능한 한 빨리오고 있습니다. 도중에 밧줄을 고정하지 않았으며 발자국은 눈으로 덮여 있습니다. (적어도 오늘은) 살아남 으려면 최대한 빨리 그곳을 벗어나야하지만 먼저 산의 어느면이 내려 가야하는지 알 수있는 방법을 찾아야합니다.

운 좋게도 여행 전에 수정 한 전화 를 가져 왔 으므로 프로그램을 프로그래밍하고 실행할 수 있습니다.

도전

당신은 당신의 전화로 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



답변

자바 스크립트 (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>


답변