Вибірковий набір гарбуза


12

Днями я гуляв по гарбузовому пластиру, щоб побачити день народження, і помітив, як гарбузові лози роблять витончений візерунок, з кружляннями, петлями та відводками. Ми будемо моделювати це з деяким мистецтвом ASCII.

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

Правила будівництва лози

  • Є лише одна головна лоза, складена виключно з \ / - p q b dперсонажів.
  • Виноградна лоза рухається лише зліва направо через екран. Іншими словами, припустимо, ви були мурашкою, починаючи з самого лівого лоза. Просуваючись до наступного суміжного символу на головній лозі, ви повинні переміщати один стовпчик праворуч - ніколи ліворуч.
  • Коли лоза змінює напрямок, p q b dдля імітації петлі потрібен один із символів. pПриєднується лози подорож на північно - схід на схід, то qна схід на південному сході bз південно - сходу на схід і dзі сходу на північний - схід. Зверніть увагу, що "петля" листа з'єднується з горизонтальною лозою, а "стебло" листа підключається до діагоналі.
  • Початок виноградної лози повинен бути одним pабо b(на ваш вибір, не повинен бути випадковим), і починається горизонтально. Кінець лози повинен бути одним qабо d(на ваш вибір, не повинен бути випадковим) і повинен закінчуватися горизонтально.
  • Зауважте, що петлі можна розміщувати безпосередньо поруч з іншими петлями (наприклад, pdце дійсна підрядність виноградної лози), але це може ускладнити розміщення гарбуза пізніше. Ви можете завжди мати один з - / \негайно після циклу (як я це робив у своїх прикладах), але це не потрібно.

Правила гарбуза

  • Гарбузи складаються виключно з (())(саме цієї струни).
  • З основної лози гарбузи прикріплюються відростками. Ці відрізки можна прикріпити лише до p q b dпетель, точно одна \чи /по довжині, і прикріпити до гарбуза, щоб "кінець" відростка знаходився посередині.
  • Вони можуть з'єднуватися вище або нижче основної лози.
  • Виходи можуть з'єднуватися, переходячи до "ліворуч".
  • Лише одна гарбуз може прикріплюватися на одну відросток, і лише одна відростка за петлю.

Випадковість

  • Під час подорожі по горизонталі виноградна лоза має 50% шансу продовжувати горизонтальну, 25% шанс повернути на північний схід і 25% шанс повернути на південний схід.
  • Подорожуючи по діагоналі, лоза має 90% шансу повернути горизонтально і 10% шанс продовжити по діагоналі.
  • Повинно бути достатньо оборотів для підтримки вхідної кількості гарбуза, хоча допускається більше витків.
  • Після побудови лози гарбуз може бути випадковим чином розміщений у будь-якому куточку, ще не зайнятому гарбузом.
  • Гарбуз не може перекривати лозу або інші гарбузи.

Змагання

Враховуючи введене число, виведіть рандомізований патч гарбуза, дотримуючись вищевказаних правил. Виконання коду кілька разів з одним і тим же входом повинно дати різні результати. Усі можливі патчі гарбуза для заданого вхідного номера повинні мати певний (не обов’язково рівний) ненульовий шанс виникнення.

Вхідні дані

Одне ціле число, що nпредставляє кількість гарбуза в патчі, в будь-якому зручному форматі . Для стислості коду, ви можете припустити, що введення є 0 < n < 256.

Вихідні дані

Отриманий патч гарбуза, або надрукований / відображений на екрані, або повернутий у вигляді рядка / рядка-масиву / тощо.

Правила

  • Це тому застосовуються всі звичайні правила для гри в гольф, і найкоротший код (у байтах) виграє.
  • Використовуйте наше стандартне визначення "Випадкове".
  • Прийнятна або повна програма, або функція.
  • Стандартні лазівки заборонені.
  • Провідні та кінцеві пробіли / нові рядки абсолютно необов’язкові.

Приклади

Для введення n = 3, ось кілька валідних прикладів гарбузового патча, що дотримується вищевказаних правил (розділені порожніми новими рядками).

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

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

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

Ось декілька прикладів INVALID для введення даних n = 3із поясненнями #.

    (()) (())
     /    /
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
А тепер спроектуйте 2D мову, використовуючи це як синтаксис. :)
Мартін Ендер

Відповіді:


1

Пітон 2, 819 байт

Бере n як вхід

Завжди розміщуйте гарбуза на «зовнішніх» кутах (випадковим чином ліворуч / праворуч)

Поки лоза будується, додаються гарбузи, і коли там достатньо гарбуза, лоза припиняється.

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

Приклади:

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

З повагою, ви перемагаєте за замовчуванням! : D
AdmBorkBork
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.