무작위 호박 패치

나는 다른 날에 생일 파티를 위해 호박 패치를 걷고 있었고, 소용돌이, 고리 및 파생물과 함께 호박 덩굴이 멋진 패턴을 만드는 것을 보았습니다. 여기서는 ASCII 아트로이를 시뮬레이션 할 것입니다.

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

포도 나무 건설 규칙

  • \ / - p q b d캐릭터 로만 구성된 하나의 메인 포도 나무가 있습니다 .
  • 포도 나무는 화면을 가로 질러 왼쪽에서 오른쪽으로 만 이동합니다. 다시 말해, 가장 왼쪽의 포도 나무 캐릭터에서 시작하는 개미라고 가정 해 봅시다. 메인 덩굴의 다음 인접 캐릭터로 진행할 때 하나의 열을 오른쪽으로 이동 해야합니다 .
  • 덩굴이 방향을 바꾸면 p q b d루프를 시뮬레이션하기 위해 캐릭터 중 하나 가 필요합니다. 은 p1, 동쪽으로 동북 여행 덩굴에 합류 q남동쪽 동쪽를 들어, b남동쪽에서 동쪽으로, 그리고 d동쪽에서 북동에. 문자의 “루프”는 가로 덩굴에 연결되고 문자의 “줄무늬”는 대각선에 연결됩니다.
  • 포도 나무의 시작은 p또는 b(당신의 선택, 무작위 일 필요는 없음) 중 하나이어야하며 수평으로 시작합니다. 포도 나무의 끝은 하나 q또는 d(당신의 선택, 무작위 일 필요는 없음)이어야하고 수평으로 끝나야합니다.
  • 루프는 다른 루프에 바로 인접하여 배치 될 수 있지만 (예 : pd포도 나무의 유효한 하위 문자열 임) 나중에 호박을 배치하기가 더 어려울 수 있습니다. - / \루프 직후에 (내 예제에서와 같이) 항상 하나를 원할 수도 있지만 필수는 아닙니다.

호박 규칙

  • 호박은 (())(이 정확한 줄) 로만 구성 됩니다.
  • 주요 덩굴에서 호박은 파생물로 붙어 있습니다. 이 파생물은 p q b d루프 에만 부착 할 수 있고 정확히 하나 \또는 /길이이며 호박에 부착하여 파생물의 “끝”이 중간에 오도록합니다.
  • 그들은 주요 포도 나무 위 또는 아래에 연결할 수 있습니다.
  • 파생물은 “왼쪽”으로 연결될 수 있습니다.
  • 오프 슛당 하나의 호박 만, 루프 당 하나의 오프 슛 만 부착 할 수 있습니다.

무작위성

  • 가로로 여행 할 때 포도 나무는 가로로 50 %, 북동으로 25 %, 남동으로 25 %의 확률을가집니다.
  • 대각선으로 여행 할 때 포도 나무는 90 %의 확률로 수평으로 돌고 10 %의 확률로 대각선으로 계속됩니다.
  • 더 많은 회전이 허용되지만 호박의 입력 수를 지원하기에 충분한 회전이 있어야합니다.
  • 덩굴이 만들어지면 호박은 이미 호박이 차지하지 않는 구석에 무작위로 놓을 수 있습니다.
  • 호박은 덩굴이나 다른 호박과 겹칠 수 없습니다.

도전

입력 번호가 주어지면 위의 규칙에 따라 무작위 호박 패치를 출력하십시오. 동일한 입력으로 코드를 여러 번 실행하면 다른 결과가 나타납니다. 주어진 입력 번호에 대해 가능한 모든 호박 패치는 반드시 0이 아닌 가능성이 있어야합니다.

입력

편리한 형식n 의 패치에서 호박 수를 나타내는 단일 정수 입니다 . 간결한 코드를 위해 입력이이라고 가정 할 수 있습니다 0 < n < 256.

산출

결과 호박 패치는 화면에 인쇄 / 표시되거나 문자열 / 문자열 배열 등으로 반환됩니다.

규칙

  • 이것은 이므로 대한 모든 일반적인 규칙이 적용되고 가장 짧은 코드 (바이트)가 이깁니다.
  • “무작위” 의 표준 정의 를 사용하십시오 .
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 선행 / 후행 공백 / 개행은 모두 완전히 선택 사항입니다.

input의 경우 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.



답변

파이썬 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         (())
                                                                                              /
                                                                                            (())


답변