Code-Golf Ascii Art Mini-Golf


13

Giới thiệu

Hãy chơi một số môn đánh gôn nhỏ! Quả bóng golf được đại diện bởi a .và lỗ bởi a O. Bạn muốn có một lỗ trên một lỗ trên mỗi lỗ, nhưng bạn không giỏi đặt. Trong thực tế, bạn từ chối cố gắng đặt chéo! Chỉ lên, xuống, và sang hai bên.

Bạn có kế hoạch gian lận bằng cách đặt thêm cản \/vì vậy bạn có thể đưa bóng vào trong với một cú đánh. Quả bóng bật ra khỏi cản ở góc bên phải, như trong hình này.

Golf

Hãy nhớ gọi cú đánh của bạn! Hãy cho chúng tôi biết bạn đang đi theo hướng nào.


Hố

1: Lỗ đầu tiên thật dễ dàng, một cú sút thẳng! Không có cản cần thiết để đặt ở đây.

Đầu vào:

.         O

Đầu ra:

right
.         O

2: Một cái cơ bản khác, một lượt ngắn. Bóng được đập ra khỏi cản vào lỗ.

Đầu vào:

     .
O

Đầu ra:

left
/    .
O

hoặc là

down
     .
O    /

3: Một số lỗ đã có cản!

Đầu vào:

.   \O

Đầu ra:

right
.   \O
    \/

hoặc là

right
   / \
.  /\O

4: Một số lỗ quá phức tạp!

Đầu vào:

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

Đầu ra: (một giải pháp khả thi, tồn tại nhiều hơn)

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

Quy tắc

  • Đầu vào là lỗ golf mini trên STDIN.
  • Đầu ra là hướng bạn đánh bóng và lỗ golf mini với cản trước mới được đặt STDOUT.
  • Cản trước hiện tại không thể được di chuyển.
  • Bạn có thể thêm bất kỳ số lượng cản để giải quyết một lỗ.
  • Giả sử có những vị trí hợp lệ cho các bộ đệm được đặt sẽ cho phép khóa học được giải quyết trong một putt.
  • Lỗ ra có thể lớn hơn đầu vào.
  • Đầu vào có thể được đệm với khoảng trắng ở cuối, nhưng vui lòng ghi rõ trong câu trả lời của bạn nếu bạn làm điều này.
  • Đầu ra phải nhìn chính xác, nhưng có thể có khoảng trắng ở đầu hoặc cuối.
  • Chương trình của bạn sẽ làm việc cho bất kỳ lỗ hợp lệ. Hãy gửi bài kiểm tra của bạn quá!

Chấm điểm

Đây là . Điểm của bạn là số lượng nhân vật trong chương trình của bạn. Điểm số thấp nhất chiến thắng!


1
Tôi khá chắc chắn rằng các hướng (lên, trái, phải, xuống) đều sai trong các ví dụ sau: # 2 ví dụ 2 nên right, # 3 ví dụ 1 nên downvà # 3 ví dụ 2 nên up. Thử thách thú vị, mặc dù!
Doorknob

@Doorknob cảm ơn! .là quả bóng bạn đang đánh và Olà lỗ. Tôi đã nhầm lẫn trên # 2 ví dụ 1 nhưng bây giờ họ sẽ tốt.
hmatt1

Câu trả lời:


6

Javascript (ES6) - 651 byte

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)}

Tạo một hàm Gchấp nhận một chuỗi (sân gôn) làm đầu vào và trả về giải pháp đặt yêu cầu. Chuỗi đầu vào có thể có hoặc không có các dòng đầu, dòng cuối và khoảng trắng theo sau. Đầu ra sẽ không có khoảng trắng hàng đầu hoặc dấu.

Mã mở rộng là:

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 );
}

Người giải quyết hoạt động dựa trên tiền đề rằng bất kỳ đường đi nào từ quả bóng (lỗ) sẽ

  1. dẫn trở lại bóng (lỗ) một lần nữa
  2. dẫn đến lỗ (bóng)
  3. thoát khỏi khóa học

Chúng tôi theo dõi đường đi của quả bóng theo cả bốn hướng. Nếu chúng ta tìm thấy trường hợp 3, vấn đề được giải quyết. Nếu chúng ta tìm thấy trường hợp 2, chúng ta sẽ đánh dấu vị trí thoát của quả bóng. Nếu tất cả bốn hướng dẫn đến trường hợp 1, chúng tôi sẽ chuyển đổi không gian không bội đầu tiên dọc theo bất kỳ quỹ đạo nào thành một bội (nếu vấn đề có thể giải quyết được, một không gian như vậy luôn được đảm bảo tồn tại) và thử lại. Chiếc ốp lưng mà chúng tôi chuyển đổi sẽ có cùng loại với chiếc ốp lưng cuối cùng mà quỹ đạo của chúng tôi gặp phải *. Nếu quả bóng vẫn bị mắc kẹt trong một vòng lặp, chúng tôi lặp lại quá trình nhiều lần nếu cần. Nếu vấn đề có thể giải quyết được, quy trình này được đảm bảo để cuối cùng dẫn đến kết quả 2 hoặc 3.

(* Lưu ý rằng nếu chúng ta chỉ đơn giản chuyển đổi sang một bội thu cố định [giả sử \], sẽ tồn tại những trường hợp cực kỳ khó khăn nhưng vẫn có thể xảy ra khi một giải pháp tồn tại nhưng chúng ta sẽ không tìm thấy nó.)

Chúng tôi thực hiện một dấu vết tương tự từ lỗ, dẫn đến kết quả 2 hoặc kết quả 3.

Nếu cả dấu vết bóng và dấu vết lỗ đều dẫn đến kết quả 2, chúng ta đặt các bộ đệm ở ngoại vi của khóa học liên kết hai điểm thoát (thực tế, các bộ đệm ngoại vi này được đặt bất kể kết quả theo dõi, để rút ngắn mã). Điều này hoàn thành giải pháp.

Các trường hợp thử nghiệm và đầu ra

Trong

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

Ngoài

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

Trong

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

Ngoài

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

Trong

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

Ngoài

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

Thất bại trong trường hợp thử nghiệm này:"/\\/\\\n\\.//\n// \\\n\\/ \no \\/"
Anders Kaseorg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.