我们去打迷你高尔夫吧!高尔夫球用.表示,洞用O表示。你想在每个洞上打一个洞,但你不擅长投球。事实上,你拒绝尝试把对角线!只有上、下、下两面。
你计划通过放置额外的保险杠\和/来作弊,这样你就可以一次击球就能把球放进去。球以直角从保险杠上反弹,如图所示。

记得打你的枪!告诉我们你要往哪个方向走。
他说:第一个洞很简单,直射!不需要把保险杠放在这里。
输入:
. O输出:
right
. O他说:另一个基本的问题,一个短暂的转折。球从保险杠上打到洞里。
输入:
.
O输出:
left
/ .
O或
down
.
O /他说:有些洞已经有保险杠了!
输入:
. \O输出:
right
. \O
\/或
right
/ \
. /\O他说:有些洞太复杂了!
输入:
/ \ \ /
/ . \ \ /
/ /\/ /\ \ /
/ / / \ \/
/ / /\ \ / \ /
\ \ / \ \/ \/
\ / /
/\ \//\ \ /
/ \ / \ \ \/
\ /\ \ / \ \
\/ \ \/ \ O/ \
/ \/产出:(一种可能的解决方案,更多的存在)
down
/ \ \ /
/ . \ \ /
/ /\/ /\ \ /
/ / / \ \/
/ / /\ \ / \ /
\ \ / \ \/ \/
/ \ / /
/\ \//\ \ /
\/ \ / \ \ \/
\ /\ \ / \ / \
\/ \ \/ \ O/ \
/ \ \/
\ /STDIN上的迷你高尔夫洞.STDOUT上。我是密码-高尔夫。你的分数是你的程序中的字符数。最低分获胜!
发布于 2014-09-10 10:47:50
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,问题就解决了。如果我们找到第二个案子,我们就标记球的出口位置。如果所有四个方向都导致了情况1,我们将沿任何轨迹的第一个非保险杠空间转换为保险杠(如果问题是可解决的,这样的空间总是存在的),然后再试一次。我们转换成的保险杠将具有与我们所遇到的最后一个保险杠相同的类型。如果球仍然卡在一个循环中,我们会根据需要多次重复这个过程。如果问题是可以解决的,这个过程最终会导致结果2或3。
(*请注意,如果我们简单地将其转换为固定的保险杠说,\,则存在极其人为的但可能存在的情况,即存在解决方案,但我们将找不到它。)
我们从洞中执行类似的跟踪,导致结果2或结果3。
如果球迹和洞迹都导致结果2,我们在连接两个出口点的过程的外围放置保险杠(实际上,这些外围保险杠被放置在不考虑跟踪结果的情况下,以缩短代码)。这就完成了解决方案。
/ \ / \ /\
\\ / \ \
/ / o /
/ \ /
\ . \ \ \\
/ / \ \
\ /
\ /
\ /\ / \/ //\right
/ / \
/ \ / \ /\
\\ / \ \
/ / o /
/ \ /
\ . \ \ \\
/ / \ \
\ / /
\ /
\ /\ / \/ //\
\ / / \ / / / \ / \ / \\ /
\ \ / \ // \ \ / /\ \
/ \ // \ // \ \ \ / / \\ \
\ / \ / \ \ / / \\ / / //
/ / /\ \\ // / \ / \ / \\ \ \
\ \ \ \ // \ / / \ \ / / /
/ \ / / / \ / \ /\ / \ /
\ /\ //\ .\ \ \ //\ / \ / \ /
/ \/ \ /\ //\ / \ / o// \ / \
/ / \ / \ / \\ / \ / \ \ \
/ / / \ / \ // \ / \/ /\/
/ \ / \ / \\ / \ /\ / \
/ \/ \ / \/ \ / \ /\\
/ /\\ //\ / \ /\ /\ / / \ / \/left
/ \
/ \ / / / \ / \ / \\ /
\ \ / \ // \ \ / /\ \
/ \ // \ // \ \ \ / / \\ \
\ / \ / \ \ / / \\ / / //
/ / /\ \\ // / \ / \ / \\ \ \
\ \ \ \ // \ / / \ \ / / /
/ \ / / / \ / \ /\ / \ /
\ /\ //\ .\ \ \ //\ / \ / \ /
/ \/ \ /\ //\ / \ / o// \ / \
/ / \ / \ / \\ / \ / \ \ \
/ / / \ / \ // \ / \/ /\/
/ \ / \ / \\ / \ /\ / \
/ \/ \ / \/ \ / \ /\\
/ /\\ //\ / \ /\ /\ / / \ / \/
\ \ //\/ \
\ \ \
\ \\ \ o
\ .\ \
\ / /
\ / down
/ \ /\
/\/\\
\ \\ \
\ \\ \ o
\ .\ \
\ / /
\ /
\ /https://codegolf.stackexchange.com/questions/37551
复制相似问题