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