Code-Golf Ascii Art Minigolf

13

Intro

Lass uns Minigolf spielen! Der Golfball wird durch a .und das Loch durch a dargestellt O. Sie möchten ein Loch in ein Loch bekommen, aber Sie sind nicht gut im Putten. In der Tat weigern Sie sich, diagonal zu setzen! Nur nach oben, unten und zu beiden Seiten.

Sie planen zu schummeln, indem Sie zusätzliche Stoßstangen platzieren \und /so den Ball mit einem Schlag einwerfen. Der Ball springt rechtwinklig von den Stoßfängern ab (siehe Abbildung).

Golf

Denken Sie daran, Ihren Schuss zu nennen! Sagen Sie uns, in welche Richtung Sie gehen.


Löcher

1: Das erste Loch ist einfach, ein gerader Schuss! Hier müssen keine Stoßstangen platziert werden.

Eingang:

.         O

Ausgabe:

right
.         O

2: Ein weiteres grundlegendes, eine kurze Wendung. Der Ball wird von der Stoßstange ins Loch geschlagen.

Eingang:

     .
O

Ausgabe:

left
/    .
O

oder

down
     .
O    /

3: Einige Löcher haben bereits Stoßstangen!

Eingang:

.   \O

Ausgabe:

right
.   \O
    \/

oder

right
   / \
.  /\O

4: Einige Löcher sind zu komplex!

Eingang:

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

Ausgabe: (eine mögliche Lösung, mehr existiert)

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

Regeln

  • Der Eingang gibt das Minigolfloch an STDIN.
  • Die Ausgabe ist die Richtung, in die Sie den Ball schlagen, und das Minigolf-Loch mit neu platzierten Stoßstangen STDOUT.
  • Bestehende Stoßstangen können nicht verschoben werden.
  • Sie können eine beliebige Anzahl von Stoßfängern hinzufügen, um ein Loch zu lösen.
  • Angenommen, es gibt gültige Positionen für die zu platzierenden Stoßstangen, an denen der Kurs in einem Putt gelöst werden kann.
  • Das ausgegebene Loch ist möglicherweise größer als das eingegebene Loch.
  • Die Eingabe kann mit nachgestellten Leerzeichen aufgefüllt werden. Bitte geben Sie dies in Ihrer Antwort an.
  • Die Ausgabe muss korrekt aussehen, kann jedoch einen führenden oder nachfolgenden Leerraum enthalten.
  • Ihr Programm sollte für jede gültige Lücke funktionieren. Zögern Sie nicht, auch Ihre Testfälle zu posten!

Wertung

Das ist . Ihre Punktzahl ist die Anzahl der Zeichen in Ihrem Programm. Die niedrigste Punktzahl gewinnt!

hmatt1
quelle
1
Ich bin mir ziemlich sicher, dass die Richtungen (oben, links, rechts, unten) in den folgenden Beispielen falsch sind: # 2 Beispiel 2 sollte sein right, # 3 Beispiel 1 sollte sein downund # 3 Beispiel 2 sollte sein up. Eine interessante Herausforderung!
Türklinke
@Doorknob danke! .ist der Ball, den Sie schlagen, und Oist das Loch. Ich habe # 2, Beispiel 1, durcheinander gebracht, aber sie sollten jetzt gut sein.
hmatt1

Antworten:

6

Javascript (ES6) - 651 Bytes

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

Erstellt eine Funktion G, die eine Zeichenfolge (Golfplatz) als Eingabe akzeptiert und die angeforderte Putting-Lösung zurückgibt. Die Eingabezeichenfolge kann führende Zeilen, nachfolgende Zeilen und nachfolgende Leerzeichen enthalten oder nicht. Die Ausgabe enthält keine führenden oder nachfolgenden Leerzeichen.

Erweiterter Code lautet:

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

Der Löser geht davon aus, dass jeder Weg von der Kugel (dem Loch) derselbe ist

  1. Führe zurück zum Ball (Loch)
  2. zum Loch führen (Kugel)
  3. Verlasse den Kurs

Wir verfolgen den Weg des Balls in alle vier Richtungen. Wenn wir Fall 3 finden, ist das Problem gelöst. Wenn wir Fall 2 finden, markieren wir den Austrittsort des Balls. Wenn alle vier Richtungen in Fall 1 resultieren, konvertieren wir den ersten Nicht-Stoßfängerraum entlang einer beliebigen Flugbahn in einen Stoßfänger (wenn das Problem lösbar ist, ist ein solcher Raum immer garantiert vorhanden) und versuchen es erneut. Der Stoßfänger, zu dem wir konvertieren, hat den gleichen Typ wie der letzte Stoßfänger, auf den unsere Flugbahn gestoßen ist *. Wenn der Ball immer noch in einer Schleife steckt, wiederholen wir den Vorgang so oft wie nötig. Ist das Problem lösbar, führt dieses Verfahren garantiert zu den Ergebnissen 2 oder 3.

(* Beachten Sie, dass, wenn wir einfach auf einen festen Stoßfänger umrüsten [sagen wir, \], es extrem ausgedachte, aber dennoch mögliche gibt Fälle gibt, in denen es eine Lösung gibt, die wir jedoch nicht finden können.)

Wir führen eine ähnliche Spur vom Loch aus, die entweder zu Ergebnis 2 oder zu Ergebnis 3 führt.

Wenn sowohl die Kugelspur als auch die Lochspur zu Ergebnis 2 führen, platzieren wir Stoßfänger an der Peripherie des Platzes, die die beiden Austrittspunkte verbinden (tatsächlich werden diese Stoßfänger unabhängig von den Trace-Ergebnissen platziert, um den Code zu verkürzen). Damit ist die Lösung abgeschlossen.

Testfälle und Ausgänge

Im

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

aus

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

Im

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

aus

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

Im

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

aus

down
/   \      /\
 /\/\\       
 \ \\ \      
  \ \\ \   o 
   \ .\ \    
    \ / /    
     \ /     
\           /
COTO
quelle
Fehler in diesem Testfall:"/\\/\\\n\\.//\n// \\\n\\/ \no \\/"
Anders Kaseorg