코드 골프 아스키 아트 미니 골프


13

소개

미니 골프를 치자! 골프 공은로 표시되고 .구멍 은로 표시됩니다 O. 당신은 모든 구멍에 하나의 구멍을 만들고 싶어하지만 당신은 퍼팅에 좋지 않습니다. 실제로, 당신은 대각선으로 시도를 거부합니다! 위, 아래 및 양쪽에만.

당신은 여분의 범퍼를 배치하여 속임수를 계획 \하고 /그래서 당신은 하나의 샷에 공을 넣을 수 있습니다. 이 그림과 같이 공이 범퍼에서 직각으로 튀어 오릅니다.

골프

당신의 샷을 호출해야합니다! 어떤 방향으로 가고 있는지 알려주십시오.


구멍

1 : 첫 번째 구멍은 간단합니다. 여기에 범퍼가 필요하지 않습니다.

입력:

.         O

산출:

right
.         O

2 : 또 하나의 기본, 짧은 차례. 공이 범퍼에서 구멍으로 쳐집니다.

입력:

     .
O

산출:

left
/    .
O

또는

down
     .
O    /

3 : 일부 구멍에는 이미 범퍼가 있습니다!

입력:

.   \O

산출:

right
.   \O
    \/

또는

right
   / \
.  /\O

4 : 일부 구멍은 지나치게 복잡합니다!

입력:

    /  \  \    /
   /  . \  \  /
  /  /\/   /\ \  /
 /  /     /  \ \/
/  /   /\ \  /  \  /
\  \  /  \ \/    \/ 
      \  /          /
  /\   \//\ \      /
 /  \   /  \ \     \/
 \  /\  \  /  \     \
  \/  \  \/    \ O/  \
      /         \/

출력 : (가능한 하나의 솔루션, 더 존재)

down
    /  \  \    /
   /  . \  \  /
  /  /\/   /\ \  /
 /  /     /  \ \/
/  /   /\ \  /  \  /
\  \  /  \ \/    \/ 
/     \  /          /
  /\   \//\ \      /
\/  \   /  \ \     \/
 \  /\  \  /  \  /  \
  \/  \  \/    \ O/  \
      /  \      \/
                \   /

규칙

  • 입력 에 미니 골프 홀이다 STDIN.
  • 출력은 당신이 볼과에 새로 배치 범퍼와 미니 골프 구멍을 명중 방향이다 STDOUT.
  • 기존 범퍼는 이동할 수 없습니다.
  • 구멍을 해결하기 위해 여러 개의 범퍼를 추가 할 수 있습니다.
  • 범퍼를 놓을 수있는 유효한 위치가 있다고 가정하면 코스를 한 퍼팅으로 해결할 수 있습니다.
  • 출력 구멍이 입력보다 클 수 있습니다.
  • 입력은 후행 공백으로 채워질 수 있지만 이렇게하면 답을 지정하십시오.
  • 출력은 올바르게 보이지만 선행 또는 후행 공백이있을 수 있습니다.
  • 당신의 프로그램은 유효한 홀에서 작동해야합니다. 테스트 케이스도 게시하십시오!

채점

이것은 입니다. 점수는 프로그램의 문자 수입니다. 최저 점수가 이깁니다!


1
다음 예제에서 방향 (위, 왼쪽, 오른쪽, 아래)이 잘못되었다고 확신합니다. # 2 example 2 right, # 3 example 1 down, # 3 example 2 up. 그래도 재미있는 도전입니다!
Doorknob

@Doorknob 감사합니다! .당신이 치는 공이고 O구멍입니다. # 2 예제 1을 엉망으로 만들었지 만 지금은 좋아야합니다.
hmatt1

답변:


6

자바 스크립트 (ES6)-651 바이트

G=s=>{Q='\\';S=[[]];n=L=1;s.split(N='\n').map(t=>{j=S[L++]=[];l=t.length;n=n>l?n:l;k=1;t.split('').map(T=>{j[k++]=T})});S[O=L++]=[];n++;for(r=0;r<L;r++)for(c=0;c<=n;c++){v=S[r][c];if(!v)S[r][c]=' ';if(v=='.'){x=c;y=r}if(v=='o'){X=c;Y=r}}f=M=>{J=M?'.':'o';K=M?'o':'.';R=0;for(D=0;1;D++){R=D&4;D=D&3;c=e=D;g=M?X:x;h=M?Y:y;while(c!=K){c=S[h+=[-1,0,1,0][e]][g+=[0,1,0,-1][e]];e=c=='/'?(B=c,e^1):c==Q?(B=c,3-e):e;E=h*(h-O)?g*(g-n)?0:2:1;if(R&&c==' '){S[h][g]=Q;R=D=0;c=K}if(c==J||E){E&&(S[h][g]=(E+M)%2?Q:'/');H=M?E?H:(e+2)&3:D;return}}}};f(0);f(1);S[0][0]=S[O][n]='/';S[0][n]=S[O][0]=Q;return['up','right','down','left'][H]+N+S.map(t=>t.join('')).join(N)}

G문자열 (골프 코스)을 입력으로 받아들이고 요청 된 퍼팅 솔루션을 반환 하는 함수 를 만듭니다 . 입력 문자열에는 선행 줄, 후행 줄 및 후행 공백이있을 수도 있고 없을 수도 있습니다. 출력에는 선행 또는 후행 공백이 없습니다.

확장 된 코드는 다음과 같습니다.

G = s => {
    Q = '\\';
    S = [[]];
    n = L = 1;
    s.split( N = '\n' ).map( t => {
        j = S[L++] = [];
        l = t.length;
        n = n > l ? n : l;
        k = 1;
        t.split('').map( T => {
            j[k++] = T;
        } );
    } );
    S[O = L++] = [];
    n++;
    for( r = 0; r < L; r++ )
        for( c = 0; c <= n; c++ ) {
            v = S[r][c];
            if( !v )
                S[r][c] = ' ';
            if( v == '.' ) {
                x = c;
                y = r;
            }
            if( v == 'o' ) {
                X = c;
                Y = r;
            }
        }
    f = M => {
        J = M ? '.' : 'o';
        K = M ? 'o' : '.';
        R = 0;
        for( D = 0; 1; D++ ) {
            R = D & 4;
            D = D & 3;
            c = e = D;
            g = M ? X : x;
            h = M ? Y : y;
            while( c != K ) {
                c = S[h += [-1,0,1,0][e]][g += [0,1,0,-1][e]];
                e = c == '/' ? (B=c,e^1) : c == Q ? (B=c,3-e) : e;
                E = h*(h-O) ? g*(g-n) ? 0 : 2 : 1;
                if( R && c == ' ' ) {
                    S[h][g] = B;
                    R = D = 0;
                    c = K;
                }
                if( c == J || E ) {
                    E && (S[h][g] = (E+M)%2 ? Q : '/');
                    H = M ? E ? H : (e+2)&3 : D;
                    return;
                }
            }
        }
    };
    f(0);
    f(1);
    S[0][0] = S[O][n] = '/';
    S[0][n] = S[O][0] = Q;
    return ['up','right','down','left'][H] + N + S.map( t => t.join('') ).join( N );
}

솔버는 공 (구멍)으로부터의 모든 경로가

  1. 다시 공 (구멍)으로 리드
  2. 구멍으로 이어지다 (공)
  3. 코스를 종료

우리는 네 방향 모두에서 공의 경로를 추적합니다. 사례 3을 찾으면 문제가 해결 된 것입니다. 사례 2를 찾으면 공의 출구 위치를 표시합니다. 4 가지 방향이 모두 사례 1 인 경우 모든 궤도를 따라 첫 번째 비 범퍼 공간을 범퍼로 변환하고 (문제가 해결 가능한 경우 이러한 공간이 항상 보장됨) 다시 시도하십시오. 우리가 변환 한 범퍼는 궤도에서 마지막으로 발생한 범퍼와 동일한 유형을 갖습니다 *. 볼이 여전히 루프에 붙어 있으면 필요한만큼 프로세스를 반복합니다. 문제를 해결할 수있는 경우이 절차는 결과 2 또는 3으로 이어질 수 있습니다.

(* 우리가 단순히 고정 범퍼로 변환하면 (예를 들어, \), 해결책이 존재하지만 해결책을 찾지 못할 가능성 이 매우 높지만 그럼에도 불구하고 가능한 경우가 있습니다.)

우리는 홀에서 유사한 추적을 수행하여 결과 2 또는 결과 3으로 이어집니다.

볼 트레이스와 홀 트레이스가 결과 2를 초래하는 경우, 두 출구 포인트를 연결하는 코스 주변에 범퍼를 배치합니다 (실제로 이러한 주변 범퍼는 트레이스 결과에 관계없이 코드를 단축하기 위해 배치됩니다). 이것으로 솔루션이 완성되었습니다.

테스트 케이스 및 출력

   /   \   / \ /\    
   \\      /    \  \ 
       /     / o   / 
   /   \       /     
   \   .  \  \    \\ 
       /  /     \ \  
       \          /  
           \      /  
 \ /\     /  \/  //\

right
/   /               \
   /   \   / \ /\    
   \\      /    \  \ 
       /     / o   / 
   /   \       /     
   \   .  \  \    \\ 
       /  /     \ \  
       \          / /
           \      /  
 \ /\     /  \/  //\ 
\                   /

  / \   / /    /  \    / \  /  \\ /
\   \ /  \  // \    \   /   /\   \
/ \   // \  //   \ \   \ /  / \\ \
 \  / \    /   \  \  / / \\ / /  //
/ /   /\ \\ //  / \   /  \ / \\ \ \
\   \  \ \ // \ /  /    \ \  /  / /
/ \ /   /  / \     / \ /\   /  \  /
\ /\  //\   .\  \ \ //\ /  \  / \ /
/ \/ \ /\ //\   /   \   / o// \ / \
/   / \    / \ / \\ / \   / \   \ \
/ /   / \  / \ //   \    / \/  /\/
   / \   / \  /   \\  / \    /\ / \
/ \/   \   /   \/  \   /  \    /\\
/ /\\ //\  / \  /\ /\   /  / \ / \/

left
/                                   \
   / \   / /    /  \    / \  /  \\ / 
 \   \ /  \  // \    \   /   /\   \  
 / \   // \  //   \ \   \ /  / \\ \  
  \  / \    /   \  \  / / \\ / /  // 
 / /   /\ \\ //  / \   /  \ / \\ \ \ 
 \   \  \ \ // \ /  /    \ \  /  / / 
 / \ /   /  / \     / \ /\   /  \  / 
 \ /\  //\   .\  \ \ //\ /  \  / \ / 
 / \/ \ /\ //\   /   \   / o// \ / \ 
 /   / \    / \ / \\ / \   / \   \ \ 
 / /   / \  / \ //   \    / \/  /\/  
    / \   / \  /   \\  / \    /\ / \ 
 / \/   \   /   \/  \   /  \    /\\  
 / /\\ //\  / \  /\ /\   /  / \ / \/ 
\         \                         /

/\/ \      
\  \ \     
 \ \\ \   o
  \ .\ \   
   \ / /   
    \ /    

down
/   \      /\
 /\/\\       
 \ \\ \      
  \ \\ \   o 
   \ .\ \    
    \ / /    
     \ /     
\           /

이 테스트 사례에서 실패 :"/\\/\\\n\\.//\n// \\\n\\/ \no \\/"
Anders Kaseorg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.