노란 나무로 갈라진 두 개의 도로 (3 부)


10

참고 : 이것은 이전의 도전 과제 인 노란 나무 (2 부)로 분기 된 두 개의 도로를 기반으로 합니다. 그 질문의 인기와 두 개의 도로가 노란 나무로 갈라져서 (1 부) , 나는 3 분의 1 을 만들고 싶었습니다. 그러나 첫 번째 2는 너무 쉬웠습니다 (첫 번째에는 2 바이트 대답, 두 번째에는 15 바이트 대답) 그래서 더 복잡한 것을 만들었습니다 ...

영감

이 도전은 Robert Frost의 유명한 시인 The Road Not Taken 에서 영감을 얻었습니다 .

두 개의 도로가 노란 나무로 갈라져서
죄송합니다. 둘 다 여행 할 수 없었습니다.
그리고 한 명의 여행자가되어서 오랫동안 서있었습니다.
그리고
덤불에서 구부러진 곳 까지 가능한 한 내려다 보았습니다 .

... 2 단락이 잘립니다 ...

나는 한숨을 쉬며
어딘가에 이것을 말해 줄 것이다. 그래서
두 개의 도로가 나무로 갈라져 나갔다. 그리고 나는 —
덜 여행 한 길을 택했다.
그리고 그것은 모든 차이를 만들었다.

두 번째 행부터 마지막 ​​행까지 주목하십시오 I took the one less traveled by,.

뒷이야기

당신은 길을 걷고있는 맹인 모험가를 돕기 위해 배정되었고 The Road Not Taken 에서 영감을 받았습니다 . 모험가가 도로에서 포크에 접근하고 덜 여행하는 길을 가고 싶습니다. 모험가가 실제로 어디에 있는지 찾아서 모험가에게 방향을 알려야합니다.

도전

당신의 목표는 도로가 분기되는지도에서 가장 적게 여행 한 도로를 찾는 것입니다. 지도는 개행 문자 (또는 \n원하는 경우)를 포함하는 문자열 이며 너비와 높이를 알 수 없습니다. 지도에서 도로는 0에서 9 까지의 숫자 로 구성 되고 교차로는 #s로 구성됩니다. 현재 진행중인 도로와 다른 도로에서 가장 많이 이동 한 도로와 맹인 모험가를 위해 덜 이동 한 도로를 찾아야합니다. 당신의지도에 숲은 공백으로 표시됩니다. 간단한지도는 다음과 같습니다.

2   2
 1 0 
  #  
  2  
  2  

이지도는 폭 5와 높이 5입니다. 도로가 어떻게 Y 모양으로 분기되는지 확인하십시오. Y는 어떤 방향으로도 향할 수 있으므로 "회전 된"맵을 이해할 수 있어야합니다.

어떤 #수단

지도가 분기되는 곳에가 있습니다 #. 이것은 경로의 점수에 영향을 미치지 않습니다.

숫자가 실제로 의미하는 것

각 경로 (숫자 라인, 구부러 질 수 있음)에는 점수가 있습니다. 패스의 점수는 숫자를 합산하여 결정되므로 첫 번째 예의 경우 첫 번째 경로 (왼쪽 위부터 시계 방향)는 2 + 1 = 3, 두 번째는 2 + 0 = 2, 세 번째는 2 + 2 = 4입니다. 도로에는 대각선으로 연결된 숫자가 포함될 수 있습니다.

당신이 어디에 있는지 찾기

가장 높은 점수를받은 경로에 있습니다. 다른 두 경로는 더 많이 이동 한 도로와 덜 이동 한 도로입니다. 가장 낮은 점수를 받은 도로를 찾아야합니다 .

여행자에게 어디로 가야하는지 알려주기

여행자에게 "왼쪽"또는 "오른쪽"으로 가라고 지시해야합니다. 방향은 여행자의 관점에서 나온 것임을 명심하십시오 (그는 포크를 향하고 있습니다).

지도 예

  14
9#  
  04

출력 : "오른쪽"(여행자는 9도로에 있습니다. 0 + 4 <1 + 4

  9  
  9  
  9  
  9  
  9  
  #  
 8 8 
 8 8 
88 88
8   7

출력 : "왼쪽"(여행자는 99999도로에 있습니다. 8 + 8 + 8 + 8 + 8> 8 + 8 + 8 + 8 + 7

02468      
     #98765
13579      

출력 : "오른쪽"(여행자는 98765도로에 있습니다. 0 + 2 + 4 + 6 + 8 <1 + 3 + 5 + 7 + 9)

4 2
4 2
 # 
 4 
 4 
 2 
 2 

출력 : "오른쪽"(여행자는 4422도로에 있습니다. 4 + 4> 2 + 2)

 9   
 9   
 9   
 #   
8 7  
8  7 
8   7

"왼쪽"출력 (여행자는 999도로에 있습니다. 8 + 8 + 8> 7 + 7 + 7

알아야 할 사항 :

  • 각 줄을 같은 길이로 만들기 위해 공백으로지도를 채 웁니다.
  • STDOUT / console / file에 문자열 left또는을 출력하고 right선택적으로 후행 줄 바꿈을 따라야합니다.
  • 개행, \ns 또는 배열 / 행 목록을 포함하는 문자열로 입력을 받아야합니다 (각 행은 문자열 임). 해당 입력을 넣는 위치 에는 함수, 명령 행 인수, 파일 또는 STDIN이 한 번에 한 행 또는 이와 유사해야합니다. 변수는 허용 가능한 입력 장치가 아닙니다 (함수 매개 변수가 아닌 한). JS 및 기타 언어의 함수 표현식은 변수에 지정되어야합니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!
  • 금지 된 표준 허점

가정 할 수있는 것

  • 입력하신 내용이 유효합니다. 다음과 같은 것은 테스트되지 않습니다.
0 0 0
 0 0
  #
 0 0
  • 패스 점수는 연결되지 않습니다.
  • 입력은 언어의 문자열 제한보다 작은 너비 또는 높이의 길이 일 수 있습니다.
  • 두 경로 사이에는 항상 최소한 하나의 공백이 있어야합니다.
  • 경로에는 구부러짐, 회전 등이있을 수 있습니다. 고속도로가 아닌 도로입니다.

질문이 있습니까? 의견과 행복한 골프에서 아래에 문의하십시오!


의지 # 항상 수평 중앙에?
David Archibald

12
샌드 박스 를 사용할 때가되었다고 생각합니다 . 그리고 새로운 영감을 얻을 수도 있습니다. 이 속도에서는 흥미로운 도전 시리즈를 만드는 것보다시를 홍보하는 것처럼 느껴집니다. 특히 당신은 모든 것을 제외하고시를 게시하기 때문에. 우리는 이미 처음부터 그것을 보았습니다. 충분합니다.
mbomb007

4
보기. 나는 당신의 도전을 좋아했지만 단순히 어려움을 추가 한 다음 pt 2에서 하나를 수락하지 않고 3을 게시하는 것은 너무 빠릅니다. 2로 편집하면 약간 의 회전 변경, 절대 출력 등이 충분합니다 .
David Archibald

2
그것은 이전의 것과는 매우 다른 도전이며, 나는 그것을 좋아합니다. 우리는 Y 모양을 당연한 것으로 취할 수 있습니다 (하나의 경로는 항상 한쪽 가장자리에서 끝나고 다른 하나는 끝 가장자리에서 끝납니다)?
dnep

1
@dnep 네 맞아요.
programmer5000

답변:


4

D , 348 321 312 302 바이트

import std.stdio,std.algorithm,std.regex,std.range;void h(R,U)(R s,U r){U[2]c;foreach(L;s.map!(a=>a.array.split)){U l=L.length-1;r>1?r=l^r-2:0;l?c[]+=l*L.map!sum.array[]:c;}write(c[r]>c[!r]?"right":"left");}void main(){auto s=stdin.byLineCopy.array;!s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);}

언 골프

import std.stdio,std.algorithm,std.regex,std.range;

void h(R,U)(R s, U reverse) {
    U[2] counts;
    /* Now that all paths are up/down, every line we need to count up has
       precisely two space-delimited parts to sum up. */
    foreach (line; s.map!(a=>a.array.split)) {
        U len = line.length - 1;
        reverse > 1 ? reverse = len ^ reverse - 2 : 0;
        len ? counts[] += len * line.map!sum.array[] : counts;
    }

    /* Switch left/right as needed based on our orientation */
    write(counts[reverse] > counts[!reverse] ? "right" : "left");
}

void main() {
    /* Treat the input as a matrix of integers */
    auto s = stdin.byLineCopy.array;

    /* If moving left/right intead of up/down, transpose */
    !s.join.match(`\d \d`)?h(s.transposed,2UL):h(s,3UL);
}

온라인으로 사용해보십시오!


첫 번째 답변자가 된 것을 축하합니다! 당신이 이길 수 있습니다 ... 당신은 D에 연결할 수 있습니까?
programmer5000

2

파이썬 2, 304 바이트

온라인으로 사용해보십시오

A=input()
S=str(A)[2:-2].replace("', '",'')
i=S.index('#')
r=len(A[0])
w=1
a=i/r
if' '<S[i-r]:w=-w;A=A[::w];a=len(A)+~a
if' '<S[i+1]:A=zip(*A[::-1]);a=i%r
if' '<S[i-1]:A=zip(*A)[::-1];a=len(A)-i%r-1
s=0
for c in' '.join(map(''.join,A[0:a])).split():s+=sum(map(int,c));s=-s
print['left','right'][::w][s>0]

이 프로그램은 도로의 방향을 추론하고이 과제의 2 부에서 내 솔루션을 사용하도록 위로 향하도록 회전시킵니다.


2 바이트로 맞았습니다! 좌절에 대해 이야기하십시오!
caird coinheringaahing

@ user00001 그렇기 때문에 내가 많이 울었습니다
Dead Possum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.