首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码-高尔夫艺术迷你高尔夫

问代码-高尔夫艺术迷你高尔夫
EN

Code Golf用户
提问于 2014-09-10 02:54:12
回答 1查看 836关注 0票数 13

Intro

我们去打迷你高尔夫吧!高尔夫球用.表示,洞用O表示。你想在每个洞上打一个洞,但你不擅长投球。事实上,你拒绝尝试把对角线!只有上、下、下两面。

你计划通过放置额外的保险杠\和/来作弊,这样你就可以一次击球就能把球放进去。球以直角从保险杠上反弹,如图所示。

记得打你的枪!告诉我们你要往哪个方向走。

孔

他说:第一个洞很简单,直射!不需要把保险杠放在这里。

输入:

代码语言:javascript
复制
.         O

输出:

代码语言:javascript
复制
right
.         O

他说:另一个基本的问题,一个短暂的转折。球从保险杠上打到洞里。

输入:

代码语言:javascript
复制
     .
O

输出:

代码语言:javascript
复制
left
/    .
O

或

代码语言:javascript
复制
down
     .
O    /

他说:有些洞已经有保险杠了!

输入:

代码语言:javascript
复制
.   \O

输出:

代码语言:javascript
复制
right
.   \O
    \/

或

代码语言:javascript
复制
right
   / \
.  /\O

他说:有些洞太复杂了!

输入:

代码语言:javascript
复制
    /  \  \    /
   /  . \  \  /
  /  /\/   /\ \  /
 /  /     /  \ \/
/  /   /\ \  /  \  /
\  \  /  \ \/    \/ 
      \  /          /
  /\   \//\ \      /
 /  \   /  \ \     \/
 \  /\  \  /  \     \
  \/  \  \/    \ O/  \
      /         \/

产出:(一种可能的解决方案,更多的存在)

代码语言:javascript
复制
down
    /  \  \    /
   /  . \  \  /
  /  /\/   /\ \  /
 /  /     /  \ \/
/  /   /\ \  /  \  /
\  \  /  \ \/    \/ 
/     \  /          /
  /\   \//\ \      /
\/  \   /  \ \     \/
 \  /\  \  /  \  /  \
  \/  \  \/    \ O/  \
      /  \      \/
                \   /

规则

  • 输入是STDIN上的迷你高尔夫洞.
  • 输出的方向,你击中球和迷你高尔夫洞与新放置的保险杠在STDOUT上。
  • 现有保险杠不能移动。
  • 你可以添加任意数量的保险杠来解决一个洞。
  • 假设有有效的位置来放置保险杠,这样就可以在一次推杆中解决这个问题。
  • 输出孔可能大于输入。
  • 输入可能被填充尾随空格,但如果您这样做,请在您的回答中指定。
  • 输出必须看起来正确,但可以有前导或尾随空格。
  • 你的程序应该适用于任何有效的漏洞。请随意张贴您的测试用例也!

评分

我是密码-高尔夫。你的分数是你的程序中的字符数。最低分获胜!

EN

回答 1

Code Golf用户

回答已采纳

发布于 2014-09-10 10:47:50

Javascript (ES6) - 651字节

代码语言:javascript
复制
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,该函数接受字符串(高尔夫球场)作为输入,并返回所请求的推送解决方案。输入字符串可能有或可能没有前导线、尾行和尾随空格。输出将没有前导或尾随空格。

扩展代码是:

代码语言:javascript
复制
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,问题就解决了。如果我们找到第二个案子,我们就标记球的出口位置。如果所有四个方向都导致了情况1,我们将沿任何轨迹的第一个非保险杠空间转换为保险杠(如果问题是可解决的,这样的空间总是存在的),然后再试一次。我们转换成的保险杠将具有与我们所遇到的最后一个保险杠相同的类型。如果球仍然卡在一个循环中,我们会根据需要多次重复这个过程。如果问题是可以解决的,这个过程最终会导致结果2或3。

(*请注意,如果我们简单地将其转换为固定的保险杠说,\,则存在极其人为的但可能存在的情况,即存在解决方案,但我们将找不到它。)

我们从洞中执行类似的跟踪,导致结果2或结果3。

如果球迹和洞迹都导致结果2,我们在连接两个出口点的过程的外围放置保险杠(实际上,这些外围保险杠被放置在不考虑跟踪结果的情况下,以缩短代码)。这就完成了解决方案。

测试用例与输出

In

代码语言:javascript
复制
   /   \   / \ /\    
   \\      /    \  \ 
       /     / o   / 
   /   \       /     
   \   .  \  \    \\ 
       /  /     \ \  
       \          /  
           \      /  
 \ /\     /  \/  //\

Out

代码语言:javascript
复制
right
/   /               \
   /   \   / \ /\    
   \\      /    \  \ 
       /     / o   / 
   /   \       /     
   \   .  \  \    \\ 
       /  /     \ \  
       \          / /
           \      /  
 \ /\     /  \/  //\ 
\                   /

In

代码语言:javascript
复制
  / \   / /    /  \    / \  /  \\ /
\   \ /  \  // \    \   /   /\   \
/ \   // \  //   \ \   \ /  / \\ \
 \  / \    /   \  \  / / \\ / /  //
/ /   /\ \\ //  / \   /  \ / \\ \ \
\   \  \ \ // \ /  /    \ \  /  / /
/ \ /   /  / \     / \ /\   /  \  /
\ /\  //\   .\  \ \ //\ /  \  / \ /
/ \/ \ /\ //\   /   \   / o// \ / \
/   / \    / \ / \\ / \   / \   \ \
/ /   / \  / \ //   \    / \/  /\/
   / \   / \  /   \\  / \    /\ / \
/ \/   \   /   \/  \   /  \    /\\
/ /\\ //\  / \  /\ /\   /  / \ / \/

Out

代码语言:javascript
复制
left
/                                   \
   / \   / /    /  \    / \  /  \\ / 
 \   \ /  \  // \    \   /   /\   \  
 / \   // \  //   \ \   \ /  / \\ \  
  \  / \    /   \  \  / / \\ / /  // 
 / /   /\ \\ //  / \   /  \ / \\ \ \ 
 \   \  \ \ // \ /  /    \ \  /  / / 
 / \ /   /  / \     / \ /\   /  \  / 
 \ /\  //\   .\  \ \ //\ /  \  / \ / 
 / \/ \ /\ //\   /   \   / o// \ / \ 
 /   / \    / \ / \\ / \   / \   \ \ 
 / /   / \  / \ //   \    / \/  /\/  
    / \   / \  /   \\  / \    /\ / \ 
 / \/   \   /   \/  \   /  \    /\\  
 / /\\ //\  / \  /\ /\   /  / \ / \/ 
\         \                         /

In

代码语言:javascript
复制
/\/ \      
\  \ \     
 \ \\ \   o
  \ .\ \   
   \ / /   
    \ /    

Out

代码语言:javascript
复制
down
/   \      /\
 /\/\\       
 \ \\ \      
  \ \\ \   o 
   \ .\ \    
    \ / /    
     \ /     
\           /
票数 6
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/37551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档