줄을 철거하세요!


12

도전

문자열이 입력되면 철거 된 버전을 출력합니다.

과정

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. 끈을 세로로 놓습니다.
  2. 사이의 임의의 정수를 선택 1하고 (height of the column of characters) - 1및 임의의 방향 (왼쪽 또는 오른쪽)를.
  3. 해당 문자 수를 그 방향으로 회전하십시오 (공백이 비어 있으면 4 단계로 이동하고 그렇지 않은 경우 2 단계로 돌아가십시오).
  4. 그 캐릭터들이 중력으로 인해 쓰러지게하십시오.
  5. 문자 열의 1높이가 옆에있는 열의 높이보다 최대가 될 때까지 반복 하십시오 (즉, 열을 더 이상 철거 할 수 없게됩니다 ( "2-4 단계")).
  6. 1하나 이상의 주변 열보다 큰 문자보다 큰 문자 열이 더 있으면 (즉 철거 가능) 더 이상 철거 할 수 없을 때까지 해당 열을 반복 철거하십시오. 철거 가능한 열이 여러 개인 경우 가장 높은 열을 완전히 철거하십시오 (가장 큰 열이있는 경우 가장 왼쪽 열을 완전히 철거하십시오).
  7. 모든 열을 더 이상 철거 할 수 없을 때까지 반복하십시오.

입력에 공백 문자가 있으면 먼저 공백 문자를 모두 철거하십시오.

C
o

d      
e  ->     oC  ->         ->  ...
       de         
G        G          G
o        o          o
l        l          l
f        f        defoC

규칙

  • 표준 허점은 금지되어 있습니다.
  • 후행 및 선행 개행이 허용됩니다.
  • 프로그램에서 문자열 / 등가를 인쇄하거나 반환 할 수 있습니다.
  • 출력이 결정적이지 않아야합니다 (입력을 철거 할 수없는 경우 제외).

이것은 이므로 언어에서 가장 작은 바이트 수를 가진 제출물이 승리합니다!


1
여기에 무작위가 실제로 필요한지 의심합니다.
Keyu Gan

@KeyuGan 사람들이 고정 된 수의 문자를 선택하고 왼쪽 / 오른쪽을 번갈아 가려야한다면이 문제는 상당히 사소한 것이라고 생각합니다.
JungHwan Min

4
우리는 여전히 4 무작위와 공정한 주사위 롤에 의해 반환이라고 말할 수있다
내 대명사 monicareinstate입니다

@someone 4은 출력을 결정적, 즉 "무작위"가 아닌 것으로 만듭니다. 명시 적으로 규칙을 편집했습니다.
JungHwan Min

@ 누군가 XKCD 때문에 4시에 언급하고 있습니까?
Giacomo Garabello

답변:


5

파이썬 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]

온라인으로 사용해보십시오!



@EriktheOutgolfer 감사합니다 :)
TFeld


h+R(X)*-~i일 수 있습니다 h-~i*R(X).
Jonathan Frech

L=[...];D=L일 수 있습니다 D=L=[...].
Jonathan Frech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.