Рандомизированная тыквенная нашивка

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

Вот некоторые НЕВЕРНЫЕ примеры для ввода 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.
AdmBorkBork
источник
7
А теперь создайте 2D-язык, используя это в качестве синтаксиса. :)
Мартин Эндер

Ответы:

1

Python 2, 819 байт

Принимает в nкачестве ввода

Всегда размещает pumkpins на «внешних» углах (случайным образом влево / вправо)

Пока строится лоза, добавляются тыквы, и когда там достаточно тыкв, лоза останавливается.

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         (())                
                                                                                              /                              
                                                                                            (())                             
TFeld
источник
Поздравляю, вы выиграли по умолчанию! : D
AdmBorkBork