Kod Golf Ascii Sanat Mini Golf


13

giriş

Biraz mini golf oynayalım! Golf topu a .ve delik a ile temsil edilir O. Her delikte bir delik açmak istiyorsunuz, ama koymakta iyi değilsiniz. Aslında, çapraz koymayı denemeyi reddediyorsunuz! Sadece yukarı, aşağı ve her iki tarafa.

Ekstra tamponlar yerleştirerek hile yapmayı planlıyorsunuz \ve /böylece tek atışla topu koyabilirsiniz. Top, bu resimde gösterildiği gibi tamponlardan dik açılı olarak sıçrar.

Golf

Atışını aramayı unutma! Bize hangi yönü koyduğunuzu söyleyin.


delikler

1: İlk delik kolay, düz bir atış! Buraya yerleştirmek için tampon gerekmiyor.

Giriş:

.         O

Çıktı:

right
.         O

2: Başka bir temel, kısa bir dönüş. Top tampondan deliğe çarptı.

Giriş:

     .
O

Çıktı:

left
/    .
O

veya

down
     .
O    /

3: Bazı deliklerde tamponlar zaten var!

Giriş:

.   \O

Çıktı:

right
.   \O
    \/

veya

right
   / \
.  /\O

4: Bazı delikler aşırı karmaşık!

Giriş:

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

Çıktı: (olası bir çözüm, daha fazlası var)

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

kurallar

  • Giriş üzerindeki mini golf delik STDIN.
  • Çıktı Topu ve üzerinde yeni verilen tamponlar ile mini golf delik vurmak yöndür STDOUT.
  • Mevcut tamponlar hareket ettirilemez.
  • Bir deliği çözmek için istediğiniz sayıda tampon ekleyebilirsiniz.
  • Tamponların yerleştirilmesi için, parkurun bir putt'ta çözülmesine izin verecek geçerli yerler olduğunu varsayın.
  • Çıkan delik girişten daha büyük olabilir.
  • Giriş, sondaki boşlukla doldurulmuş olabilir, ancak bunu yaparsanız lütfen cevabınızda belirtin.
  • Çıktı doğru görünmelidir, ancak önde veya arkada boşluk olabilir.
  • Programınız geçerli herhangi bir delik için çalışmalıdır. Test durumlarınızı da göndermekten çekinmeyin!

puanlama

Bu . Puanınız programınızdaki karakter sayısıdır. En düşük puan kazanır!


1
Aşağıdaki örneklerde yönlerin (yukarı, sol, sağ, aşağı) yanlış olduğundan eminim: # 2 örnek 2 olmalı right, # 3 örnek 1 olmalı downve # 3 örnek 2 olmalıdır up. Yine de ilginç bir meydan okuma!
Kapı tokmağı

@ Doonono teşekkürler! .vurduğunuz top ve Odelik. 2. örnek 1'i berbat ettim ama şimdi iyi olmalılar.
hmatt1

Yanıtlar:


6

Javascript (ES6) - 651 bayt

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

GBir dizeyi (golf sahası) giriş olarak kabul eden ve istenen koyma çözümünü döndüren bir işlev oluşturur . Giriş dizesi, önde gelen satırlara, sondaki satırlara ve sondaki boşluklara sahip olabilir veya olmayabilir. Çıktının önünde veya sonunda boşluk olmaz.

Genişletilmiş kod:

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

Çözücü, toptan (delikten) herhangi bir yolun

  1. tekrar topa (deliğe) götür
  2. deliğe yol açmak
  3. kursdan çık

Topun yolunu dört yönde de izliyoruz. Durum 3'ü bulursak, sorun çözülür. Durum 2'yi bulursak, topun çıkış yerini işaretleriz. Dört yönün tümü de 1. durumda ortaya çıkarsa, herhangi bir yörünge boyunca ilk tampon olmayan alanı bir tampona dönüştürürüz (sorun çözülebilirse, böyle bir alanın her zaman var olması garanti edilir) ve tekrar deneyin. Dönüştürdüğümüz tampon, yolumuzun karşılaştığı son tamponla aynı türe sahip olacak *. Top hala bir halkada sıkışmışsa, işlemi gerektiği kadar tekrarlarız. Sorun çözülebilirse, bu prosedürün sonunda 2 veya 3 sonucuna yol açacağı garanti edilir.

(* Basit bir şekilde sabit bir tampona dönüştürürsek [diyelim ki \], bir çözümün var olduğu son derece tartışmalı ama yine de olası durumlar var, ancak onu bulamayacağız.)

Delikten benzer bir iz çıkarırız, sonuç 2 veya sonuç 3'e yol açar.

Hem top izi hem de delik izi sonuç 2 ile sonuçlanırsa, iki çıkış noktasını bağlayan tamponları parkurun çevresine yerleştiririz (aslında, bu çevre tamponları, kodu kısaltmak için iz sonuçlarından bağımsız olarak yerleştirilir). Bu çözümü tamamlar.

Test Kutuları ve Çıktıları

İçinde

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

Dışarı

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

İçinde

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

Dışarı

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

İçinde

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

Dışarı

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

Bu test durumunda başarısız oluyor:"/\\/\\\n\\.//\n// \\\n\\/ \no \\/"
Anders Kaseorg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.