Patch Labu Acak

12

Saya sedang berjalan melalui patch labu hari lain untuk pesta ulang tahun, dan melihat tanaman merambat labu membuat pola yang bagus, dengan berputar, loop, dan cabang. Kita akan mensimulasikan itu di sini dengan beberapa seni ASCII.

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

Aturan Konstruksi Vine

  • Hanya ada satu pokok anggur, hanya terdiri dari \ / - p q b dkarakter.
  • Pohon anggur hanya bergerak dari kiri ke kanan melintasi layar. Dengan kata lain, anggaplah Anda adalah semut yang memulai karakter anggur paling kiri. Saat Anda maju ke karakter yang berdekatan berikutnya pada pokok anggur, Anda harus memindahkan satu kolom ke kanan - tidak pernah ke kiri.
  • Ketika anggur berubah arah, salah satu p q b dkarakter diperlukan untuk mensimulasikan loop. The pbergabung tanaman merambat bepergian timur laut ke timur, yang quntuk timur ke tenggara, yang bdari tenggara ke timur, dan ddari timur ke timur laut. Perhatikan bahwa "lingkaran" surat itu terhubung ke pohon anggur horizontal, dan "batang" surat itu terhubung ke diagonal.
  • Awal anggur harus salah satu patau b(pilihan Anda, tidak harus acak), dan mulai secara horizontal. Akhir anggur harus salah satu qatau d(pilihan Anda, tidak harus acak), dan harus berakhir secara horizontal.
  • Perhatikan bahwa loop dapat ditempatkan berbatasan langsung dengan loop lainnya (misalnya, pdadalah substring yang valid dari anggur), tetapi itu mungkin membuatnya lebih sulit untuk menempatkan labu nanti. Anda mungkin ingin selalu memiliki salah satu - / \setelah loop (seperti yang saya lakukan dalam contoh saya), tetapi itu tidak diperlukan.

Aturan Labu

  • Labu hanya terdiri dari (())(string ini).
  • Dari pokok anggur, labu diikat oleh cabang. Cabang ini hanya dapat dilampirkan ke p q b dloop, tepatnya satu \atau /panjangnya, dan melekat pada labu sehingga "ujung" cabang adalah di tengah.
  • Mereka dapat terhubung di atas atau di bawah pokok anggur.
  • Cabang dapat terhubung ke "kiri."
  • Hanya satu labu dapat melampirkan per cabang, dan hanya satu cabang per loop.

Keserampangan

  • Saat bepergian secara horizontal, anggur memiliki kemungkinan 50% untuk melanjutkan secara horizontal, 25% kemungkinan untuk berbelok ke timur laut, dan 25% kemungkinan untuk berbelok ke tenggara.
  • Saat bepergian secara diagonal, pohon anggur memiliki peluang 90% untuk memutar horisontal dan 10% kemungkinan melanjutkan secara diagonal.
  • Harus ada putaran yang cukup untuk mendukung jumlah input labu, meskipun lebih banyak putaran diizinkan.
  • Setelah anggur dibuat, labu dapat ditempatkan secara acak di sudut mana pun yang belum ditempati labu.
  • Labu tidak bisa tumpang tindih dengan sulur atau labu lainnya.

Tantangan

Diberikan nomor input, hasilkan patch labu acak mengikuti aturan di atas. Menjalankan kode beberapa kali dengan input yang sama akan menghasilkan hasil yang berbeda. Semua tambalan labu yang mungkin untuk nomor input yang diberikan harus memiliki beberapa (tidak selalu sama) peluang yang tidak nol terjadi.

Memasukkan

Integer tunggal nmewakili jumlah labu di tambalan, dalam format apa pun yang nyaman . Untuk singkatnya kode, Anda dapat menganggap inputnya 0 < n < 256.

Keluaran

Patch labu yang dihasilkan, baik dicetak / ditampilkan ke layar atau dikembalikan sebagai string / string-array / etc.

Aturan

  • Ini adalah sehingga semua aturan biasa untuk bermain golf berlaku, dan kode terpendek (dalam byte) menang.
  • Gunakan definisi standar kami tentang "Acak."
  • Program atau fungsi lengkap dapat diterima.
  • Celah standar dilarang.
  • Whitespace / newlines terkemuka dan tertinggal semuanya sepenuhnya opsional.

Contohnya

Untuk input n = 3, berikut adalah beberapa contoh VALID tambalan labu mengikuti aturan di atas (dipisahkan oleh baris baru kosong).

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

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

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

Berikut adalah beberapa contoh INVALID untuk input n = 3, dengan penjelasan #.

    (()) (())
     /    /
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.
AdmBorkBork
sumber
7
Dan sekarang desain bahasa 2D menggunakan ini sebagai sintaks. :)
Martin Ender

Jawaban:

1

Python 2, 819 byte

Dibawa nsebagai input

Selalu letakkan pumkpin di 'luar' sudut (acak kiri / kanan)

Sementara tanaman anggur dibangun, labu ditambahkan, dan ketika labu cukup ada, anggur berhenti.

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

Contoh:

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         (())                
                                                                                              /                              
                                                                                            (())                             
TFeld
sumber
Selamat, Anda menang secara default! : D
AdmBorkBork