कोड-गोल्फ अस्की आर्ट मिनी-गोल्फ


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 उदाहरण 2 होना चाहिए right, # 3 उदाहरण 1 होना चाहिए down, और # 3 उदाहरण 2 होना चाहिए up। दिलचस्प चुनौती, हालांकि!
दरवाज़े

@Doorknob धन्यवाद! .गेंद आप मार रहे हैं और Oछेद है। मैंने # 2 उदाहरण 1 पर गड़बड़ की लेकिन उन्हें अब अच्छा होना चाहिए।
hmatt1

जवाबों:


6

जावास्क्रिप्ट (ईएस 6) - 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 मिलता है, तो हम गेंद के निकास स्थान को चिह्नित करते हैं। यदि सभी चार दिशाओं का परिणाम 1 होता है, तो हम पहले गैर-बम्पर स्थान को किसी भी प्रक्षेप पथ के साथ एक बम्पर में परिवर्तित करते हैं (यदि समस्या हल होती है, तो ऐसी जगह हमेशा मौजूद रहने की गारंटी होती है) और फिर से प्रयास करें। जिस बम्पर को हम परिवर्तित करते हैं, वह उसी प्रकार का होगा जैसा कि पिछले बम्पर हमारे प्रक्षेपवक्र का सामना करना पड़ा है *। यदि गेंद अभी भी एक लूप में फंस गई है, तो हम प्रक्रिया को आवश्यकतानुसार कई बार दोहराते हैं। यदि समस्या हल करने योग्य है, तो यह प्रक्रिया अंततः 2 या 3 के परिणाम की गारंटी देती है।

(* ध्यान दें कि अगर हम केवल एक निश्चित बम्पर में परिवर्तित होते हैं [कहते हैं \], तो वहाँ बहुत ही वंचित लेकिन फिर भी संभव मामले मौजूद हैं जहां एक समाधान मौजूद है लेकिन हम इसे खोजने में विफल रहेंगे।)

हम छेद से एक समान ट्रेस करते हैं, जिसके परिणामस्वरूप परिणाम 2 या परिणाम 3 हैं।

यदि दोनों बॉल ट्रेस और होल ट्रेस परिणाम 2 में परिणाम करते हैं, तो हम दो निकास बिंदुओं को जोड़ने वाले पाठ्यक्रम की परिधि पर बंपर लगाते हैं (वास्तव में, इन परिधि बंपर को ट्रेस परिणामों की परवाह किए बिना रखा जाता है, कोड को छोटा करने के लिए)। इससे समाधान पूरा होता है।

परीक्षण के मामले और आउटपुट

में

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

बाहर

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

में

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

बाहर

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

में

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

बाहर

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

इस परीक्षण के मामले में "/\\/\\\n\\.//\n// \\\n\\/ \no \\/"
असफल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.