Rastgele Kabak Yaması


12

Geçen gün bir doğum günü partisi için bir kabak yaması boyunca yürüyordum ve balkabağı sarmaşıklarının, kıvrımlar, döngüler ve dallarla şık bir desen oluşturduğunu fark ettim. Bunu burada bazı ASCII sanatlarıyla simüle edeceğiz.

          (())
            \
   p--q      p-----q
  /    \    /       \
(())    b--d       (())

Asma Yapım Kuralları

  • Sadece \ / - p q b dkarakterlerden oluşan sadece bir ana asma vardır .
  • Asma, ekran boyunca sadece soldan sağa doğru hareket eder. Başka bir deyişle, en soldaki asma karakterinden başlayan bir karınca olduğunuzu varsayalım. Ana asmadaki bir sonraki bitişik karaktere ilerlerken, bir sütunu sağa taşımalısınız - asla sola gitmemelisiniz.
  • Asma yön değiştirdiğinde, p q b dbir döngüyü simüle etmek için karakterlerden biri gerekir. p, Doğuda kuzeydoğusunda seyahat üzüm katılır qgüneydoğu doğu için, bgüneydoğudan doğuya ve ddoğudan kuzeydoğusundaki. Mektubun “halkası” nın yatay asmaya ve harfin “sapı” diyagonaline bağlandığına dikkat edin.
  • Asmanın başlangıcı biri ( pveya bseçiminiz rastgele olmak zorunda değildir) olmalı ve yatay olarak başlamalıdır. Asmanın sonu bir qveya olmalıdır d(seçiminiz rastgele olmak zorunda değildir) ve yatay olarak bitmelidir.
  • İlmeklerin diğer iliklere hemen bitişik olarak yerleştirilebileceğini (ör pd., Asmanın geçerli bir alt dizisidir), ancak balkabağının daha sonra yerleştirilmesini zorlaştırabileceğini unutmayın. Her zaman - / \bir döngüden hemen sonra (örneklerde yaptığım gibi) birine sahip olmak isteyebilirsiniz , ancak gerekli değildir.

Kabak Kuralları

  • Kabaklar sadece (())(bu tam ip) oluşur.
  • Ana asmadan, kabaklar dalılarla tutturulur. Bu sürgünler sadece p q b dilmeklere tutturulabilir , tam olarak bir \veya /uzunluğundadır ve balkabağına bağlanır, böylece sürgünün "ucu" ortada olur.
  • Ana asmanın üstüne veya altına bağlanabilirler.
  • Sürgünler "sola" giderek bağlanabiliyor.
  • Her atış için sadece bir kabak ve döngü başına sadece bir atış ekleyebilir.

Rastgelelik

  • Yatay olarak seyahat ederken, asma yatay olarak devam etme şansı% 50, kuzeydoğuya dönme şansı% 25 ve güneydoğuya dönme şansı% 25'dir.
  • Çapraz olarak seyahat ederken, asma yatay olarak% 90 ve çapraz olarak devam etme şansı% 10'dur.
  • Kabakların giriş sayısını desteklemek için yeterli dönüşler olmalıdır, ancak daha fazla dönüşe izin verilir.
  • Asma inşa edildiğinde, kabaklar zaten bir kabak tarafından işgal edilmemiş herhangi bir köşeye rastgele yerleştirilebilir.
  • Kabaklar asma veya diğer kabakların üstüne binemez.

Meydan okuma

Bir giriş numarası verildiğinde, yukarıdaki kurallara uyarak rastgele bir kabak yaması üretin. Kodun aynı girişle birden çok kez çalıştırılması farklı sonuçlar vermelidir. Belirli bir giriş numarası için tüm olası kabak yamalarının sıfır olmayan bir şekilde meydana gelme şansı olmalıdır (zorunlu olarak eşit değildir).

Giriş

Herhangi bir uygun formattan yamadaki kabak sayısını temsil eden tek bir tam sayı . Kodun kısalığı için, girdinin olduğunu varsayabilirsiniz .0 < n < 256

Çıktı

Ortaya çıkan kabak yaması, ekrana basılı / ekrana getirilmiş veya bir dize / dize dizisi / vb. Olarak döndürülmüştür.

kurallar

  • Bu bu nedenle için tüm olağan kurallar geçerlidir ve en kısa kod (bayt cinsinden) kazanır.
  • Standart "Rastgele" tanımımızı kullanın .
  • Tam bir program veya işlev kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Öncü ve sondaki boşluk / yeni satırlar tamamen isteğe bağlıdır.

Örnekler

Girdi için n = 3, yukarıdaki kurallara (boş satırlarla ayrılmış) uyan bir kabak yamasının bazı VALID örnekleri.

          (())
            \
   p--q      p-----q
  /    \    /       \
(())    b--d       (())

(()) (())
  \   /
   b-q (())
      \ /
       b-q

p-----------------------q (())
                       / \ /
                     (()) b-q
                           /
                         (())

Aşağıda, n = 3açıklamalarla birlikte bazı INVALID örnekleri verilmiştir #.

    (()) (())
     /    /
p---q----q
 \
(())
# The vine continued horizontally after a loop was placed.

(()(())
  \ /
   p---q
        \
       (())
# The pumpkins are both overlapping and sprouting from the same loop.

p----------------q
 \      \         \
(())   (())      (())
# The pumpkin is attached to the middle of the vine, not at a loop.

7
Ve şimdi bunu sözdizimi olarak kullanarak bir 2D dil tasarlayın. :)
Martin Ender

Yanıtlar:


1

Python 2, 819 bayt

Alır ngirdi olarak

Pumkpinleri daima köşelerin 'dışına' yerleştirir (rastgele sola / sağa)

Asma inşa edilirken kabaklar eklenir ve yeterli miktarda kabak olduğunda asma durur.

r=lambda:__import__('random').random()
s=1
v=[s]*4
U=[-9]
D=[-9]
i=input()
while len(U)+len(D)<i+2:s=[[0,1][r()<.9],[[0,2][r()<.5],1][r()<.5],[2,1][r()<.9]][s];exec['',[['','U+=[len(v)]'][U[-1]<len(v)-7],'',['','D+=[len(v)]'][D[-1]<len(v)-7]][v[-1]-s+1]][r()<.8];v+=[s]*[1,2][v[-1]!=s]
v+=[1]*5
m=M=s=0
for i in v:s+=i-1;m=[m,s][m>s];M=[M,s][M<s]
R=[[' ']*(M-m+5)for x in v]
m=-m+2
R[2][m]='p'
for x in range(3,len(v)-3):X=v[x-1];R[x][m]='/d p-b q\\'[v[x]*3+X];m+=v[x]-1
R[-3][m]='q'
M=[len(a)-len(a.lstrip())for a in map(''.join,R)]
R=map(list,zip(*R))
B,L,a='-/U'
K="\\"*4
W="""exec("for p in "+a+"[1:]:x=M[p];b=r()<.5;exec('R[x"+B+"1][p'+['+1]=\\""+L+"\\"','-1]=\\""+K+"\\"'][b]);i=p-[0,3][b];l='(';exec('R[x"+B+"2][i]=l;i+=1;'*2+'l=\\")\\";')*2")"""
exec W+";B,a='+D';L,K=K,L;"+W
for x in R:print''.join(map(str,x))

Örnekler:

n=4

                (())   
                 /     
                p---q  
 (())          /       
   \       p--d        
  p-q     /    \       
     \   /    (())     
      b-d              
       \               
      (())             

n=20

                            (())                                                                                             
                              \                                                                                              
                            p--q                                                                                             
                           /    \                                                                                            
                          /      b--q                                                                                        
           (())     p----d      /    \                                                                                       
  (())       \     /          (())    b-q (())                                                                               
    \         p---d                      \  \                                                                                
  p--q       /     \                      b--q                                                                               
      \     /     (())                   /    \                        (())                                           (())   
       b---d                           (())    b-q                       \                                             /     
        \                                         \          (())         p-q                                         p---q  
       (())                                        \           \         /   \                                       /       
                                                    b-----------q     p-d     b-q                            (())p--d        
                                                                 \   /       /   \                            / /    \       
                                                                  b-d      (())   b-q   (())  (())   p-q     p-d    (())     
                                                                   /                 \   /      \   /   \   /                
                                                                 (())                 b-q        p-d     b-d                 
                                                                                       \ \      /         \                  
                                                                                      (())b----d         (())                
                                                                                              /                              
                                                                                            (())                             

Tebrikler, varsayılan olarak kazanırsınız! : D
AdmBorkBork
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.