자바 스크립트 (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 );
}
솔버는 공 (구멍)으로부터의 모든 경로가
- 다시 공 (구멍)으로 리드
- 구멍으로 이어지다 (공)
- 코스를 종료
우리는 네 방향 모두에서 공의 경로를 추적합니다. 사례 3을 찾으면 문제가 해결 된 것입니다. 사례 2를 찾으면 공의 출구 위치를 표시합니다. 4 가지 방향이 모두 사례 1 인 경우 모든 궤도를 따라 첫 번째 비 범퍼 공간을 범퍼로 변환하고 (문제가 해결 가능한 경우 이러한 공간이 항상 보장됨) 다시 시도하십시오. 우리가 변환 한 범퍼는 궤도에서 마지막으로 발생한 범퍼와 동일한 유형을 갖습니다 *. 볼이 여전히 루프에 붙어 있으면 필요한만큼 프로세스를 반복합니다. 문제를 해결할 수있는 경우이 절차는 결과 2 또는 3으로 이어질 수 있습니다.
(* 우리가 단순히 고정 범퍼로 변환하면 (예를 들어, \
), 해결책이 존재하지만 해결책을 찾지 못할 가능성 이 매우 높지만 그럼에도 불구하고 가능한 경우가 있습니다.)
우리는 홀에서 유사한 추적을 수행하여 결과 2 또는 결과 3으로 이어집니다.
볼 트레이스와 홀 트레이스가 결과 2를 초래하는 경우, 두 출구 포인트를 연결하는 코스 주변에 범퍼를 배치합니다 (실제로 이러한 주변 범퍼는 트레이스 결과에 관계없이 코드를 단축하기 위해 배치됩니다). 이것으로 솔루션이 완성되었습니다.
테스트 케이스 및 출력
에
/ \ / \ /\
\\ / \ \
/ / o /
/ \ /
\ . \ \ \\
/ / \ \
\ /
\ /
\ /\ / \/ //\
밖
right
/ / \
/ \ / \ /\
\\ / \ \
/ / o /
/ \ /
\ . \ \ \\
/ / \ \
\ / /
\ /
\ /\ / \/ //\
\ /
에
/ \ / / / \ / \ / \\ /
\ \ / \ // \ \ / /\ \
/ \ // \ // \ \ \ / / \\ \
\ / \ / \ \ / / \\ / / //
/ / /\ \\ // / \ / \ / \\ \ \
\ \ \ \ // \ / / \ \ / / /
/ \ / / / \ / \ /\ / \ /
\ /\ //\ .\ \ \ //\ / \ / \ /
/ \/ \ /\ //\ / \ / o// \ / \
/ / \ / \ / \\ / \ / \ \ \
/ / / \ / \ // \ / \/ /\/
/ \ / \ / \\ / \ /\ / \
/ \/ \ / \/ \ / \ /\\
/ /\\ //\ / \ /\ /\ / / \ / \/
밖
left
/ \
/ \ / / / \ / \ / \\ /
\ \ / \ // \ \ / /\ \
/ \ // \ // \ \ \ / / \\ \
\ / \ / \ \ / / \\ / / //
/ / /\ \\ // / \ / \ / \\ \ \
\ \ \ \ // \ / / \ \ / / /
/ \ / / / \ / \ /\ / \ /
\ /\ //\ .\ \ \ //\ / \ / \ /
/ \/ \ /\ //\ / \ / o// \ / \
/ / \ / \ / \\ / \ / \ \ \
/ / / \ / \ // \ / \/ /\/
/ \ / \ / \\ / \ /\ / \
/ \/ \ / \/ \ / \ /\\
/ /\\ //\ / \ /\ /\ / / \ / \/
\ \ /
에
/\/ \
\ \ \
\ \\ \ o
\ .\ \
\ / /
\ /
밖
down
/ \ /\
/\/\\
\ \\ \
\ \\ \ o
\ .\ \
\ / /
\ /
\ /
right
, # 3 example 1down
, # 3 example 2up
. 그래도 재미있는 도전입니다!