Code-Golf Ascii Art Mini-Golf


13

Intro

Giochiamo al mini-golf! La pallina da golf è rappresentata da a .e il buco da a O. Vuoi fare un buco in uno su ogni buco, ma non sei bravo a metterlo. In effetti, ti rifiuti di provare a mettere in diagonale! Solo su, giù e su entrambi i lati.

Hai intenzione di imbrogliare posizionando paraurti extra \e /così puoi mettere la palla con un solo colpo. La palla rimbalza dai paraurti ad angolo retto, come mostrato in questa immagine.

Golf

Ricorda di chiamare il tuo tiro! Dicci quale direzione stai mettendo.


fori

1: la prima buca è facile, un tiro dritto! Non è necessario posizionare i paraurti qui.

Ingresso:

.         O

Produzione:

right
.         O

2: Un altro di base, un giro breve. La palla viene colpita dal paraurti nella buca.

Ingresso:

     .
O

Produzione:

left
/    .
O

o

down
     .
O    /

3: Alcuni fori hanno già i paraurti!

Ingresso:

.   \O

Produzione:

right
.   \O
    \/

o

right
   / \
.  /\O

4: Alcuni fori sono eccessivamente complessi!

Ingresso:

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

Output: (una possibile soluzione, ne esiste più)

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

Regole

  • L' ingresso è la buca da mini golf STDIN.
  • L' output è la direzione in cui colpisci la palla e la buca da mini-golf con i paraurti appena posizionati STDOUT.
  • I paraurti esistenti non possono essere spostati.
  • È possibile aggiungere un numero qualsiasi di paraurti per risolvere un buco.
  • Supponiamo che ci siano posizioni valide per il posizionamento dei paraurti che consentano di risolvere il percorso in un colpo solo.
  • Il foro emesso può essere più grande dell'input.
  • L'input può essere riempito con uno spazio bianco finale, ma per favore specifica nella tua risposta se lo fai.
  • L'output deve essere corretto, ma può contenere spazi vuoti iniziali o finali.
  • Il tuo programma dovrebbe funzionare per qualsiasi buca valida. Sentiti libero di pubblicare anche i tuoi casi di test!

punteggio

Questo è . Il tuo punteggio è il numero di caratteri nel tuo programma. Il punteggio più basso vince!


1
Sono abbastanza sicuro che le direzioni (su, sinistra, destra, giù) siano sbagliate nei seguenti esempi: l'esempio n. 2 dovrebbe essere right, l'esempio n. 3 dovrebbe essere downe l'esempio n. 3 dovrebbe essere up. Sfida interessante, però!
Maniglia della porta

@Doorknob grazie! .è la palla che stai colpendo ed Oè la buca. Ho incasinato l'esempio n. 2, ma ora dovrebbero andare bene.
hmatt1,

Risposte:


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

Crea una funzione Gche accetta una stringa (campo da golf) come input e restituisce la soluzione di put richiesta. La stringa di input può avere o meno linee iniziali, linee finali e spazi vuoti finali. L'output non avrà spazi bianchi iniziali o finali.

Il codice espanso è:

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

Il solutore opera sul presupposto che qualsiasi percorso dalla palla (buco) lo farà

  1. ricondurre nuovamente alla palla (buca)
  2. portare alla buca (palla)
  3. esci dal corso

Tracciamo il percorso della palla in tutte e quattro le direzioni. Se troviamo il caso 3, il problema è risolto. Se troviamo il caso 2, segniamo la posizione di uscita della palla. Se nel caso 1 risultano tutte e quattro le direzioni, convertiamo il primo spazio non paraurti lungo una traiettoria in un paraurti (se il problema è risolvibile, tale spazio è sempre garantito per esistere) e riprovare. Il paraurti in cui convertiamo avrà lo stesso tipo dell'ultimo paraurti rilevato dalla nostra traiettoria *. Se la palla è ancora bloccata in un ciclo, ripetiamo il processo tutte le volte che è necessario. Se il problema è risolvibile, si garantisce che questa procedura alla fine porterà al risultato 2 o 3.

(* Nota che se ci convertiamo semplicemente in un paraurti fisso [diciamo, \], esistono casi estremamente forzati ma comunque possibili in cui esiste una soluzione ma non riusciremo a trovarla.)

Eseguiamo una traccia simile dal buco, portando al risultato 2 o risultato 3.

Se sia la traccia della palla che la traccia del foro risultano nel risultato 2, posizioniamo i paraurti sulla periferia del percorso che collegano i due punti di uscita (in effetti, questi paraurti periferici vengono posizionati indipendentemente dai risultati della traccia, per abbreviare il codice). Questo completa la soluzione.

Casi di prova e uscite

Nel

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

Su

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

Nel

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

Su

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

Nel

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

Su

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

Non riesce in questo caso di prova:"/\\/\\\n\\.//\n// \\\n\\/ \no \\/"
Anders Kaseorg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.