나는 다른 날에 생일 파티를 위해 호박 패치를 걷고 있었고, 소용돌이, 고리 및 파생물과 함께 호박 덩굴이 멋진 패턴을 만드는 것을 보았습니다. 여기서는 ASCII 아트로이를 시뮬레이션 할 것입니다.
(())
\
p--q p-----q
/ \ / \
(()) b--d (())
포도 나무 건설 규칙
\ / - p q b d
캐릭터 로만 구성된 하나의 메인 포도 나무가 있습니다 .- 포도 나무는 화면을 가로 질러 왼쪽에서 오른쪽으로 만 이동합니다. 다시 말해, 가장 왼쪽의 포도 나무 캐릭터에서 시작하는 개미라고 가정 해 봅시다. 메인 덩굴의 다음 인접 캐릭터로 진행할 때 하나의 열을 오른쪽으로 이동 해야합니다 .
- 덩굴이 방향을 바꾸면
p q b d
루프를 시뮬레이션하기 위해 캐릭터 중 하나 가 필요합니다. 은p
1, 동쪽으로 동북 여행 덩굴에 합류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 (())
/
(())