도전
문자열이 입력되면 철거 된 버전을 출력합니다.
과정
P
r Pr r
o o o
g g g
r r r rogr r
a -> a -> a -> a -> a -> -> -> -> ->
m m m m m
m m m m m mmar m
i i i i i i i mi m
n n n n gn gn gn gn gni mgni
g g Pg Pg roPg roPg roPgmar roPgmar roPgmar roPgmar
- 끈을 세로로 놓습니다.
- 사이의 임의의 정수를 선택
1
하고(height of the column of characters) - 1
및 임의의 방향 (왼쪽 또는 오른쪽)를. - 해당 문자 수를 그 방향으로 회전하십시오 (공백이 비어 있으면 4 단계로 이동하고 그렇지 않은 경우 2 단계로 돌아가십시오).
- 그 캐릭터들이 중력으로 인해 쓰러지게하십시오.
- 문자 열의
1
높이가 옆에있는 열의 높이보다 최대가 될 때까지 반복 하십시오 (즉, 열을 더 이상 철거 할 수 없게됩니다 ( “2-4 단계”)). 1
하나 이상의 주변 열보다 큰 문자보다 큰 문자 열이 더 있으면 (즉 철거 가능) 더 이상 철거 할 수 없을 때까지 해당 열을 반복 철거하십시오. 철거 가능한 열이 여러 개인 경우 가장 높은 열을 완전히 철거하십시오 (가장 큰 열이있는 경우 가장 왼쪽 열을 완전히 철거하십시오).- 모든 열을 더 이상 철거 할 수 없을 때까지 반복하십시오.
입력에 공백 문자가 있으면 먼저 공백 문자를 모두 철거하십시오.
C
o
d
e -> oC -> -> ...
de
G G G
o o o
l l l
f f defoC
규칙
- 표준 허점은 금지되어 있습니다.
- 후행 및 선행 개행이 허용됩니다.
- 프로그램에서 문자열 / 등가를 인쇄하거나 반환 할 수 있습니다.
- 출력이 결정적이지 않아야합니다 (입력을 철거 할 수없는 경우 제외).
이것은 code-golf 이므로 언어에서 가장 작은 바이트 수를 가진 제출물이 승리합니다!
답변
파이썬 2 , 622 595 573 552 542 534 527 520 515 바이트
from random import*
s=input()
r=range
R=choice
Z=len
L=h=Z(s)
a=[[]for _ in' '*-~h]
S=s[::-1].split()
X=-1,1
for w in S[1:]:
for i in r(Z(w)):a[h-~i*R(X)]+=w[i]
a[h]+=S[0]
while L:
H=[map(Z,a[c-1:c+2])+[c]for c in r(1,h-~h)];D=L=[(min(n,m)-C,i)for n,C,m,i in H if~-C>min(n,m)]
while D:
_,c=min(L);n,C,m=map(Z,a[c-1:c+2]);D=X[n+2>C:1+(C-1>m)]
if D:
d=R(D);l=R(r(1,C-[0,m,n][d]));w,a[c]=a[c][-l:],a[c][:-l]
for i in r(l):a[c-~i*d]+=w[i]
for l in zip(*[l+[' ']*max(H)[1]for l in a if l])[::-1]:print`l`[2::5]