Снеси строку!

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
Я бы сомневался, действительно ли здесь необходим случайный
случай
@KeyuGan Я думаю, что вызов был бы довольно тривиальным, если бы людям приходилось выбирать фиксированное количество символов и чередоваться влево / вправо.
JungHwan Мин
4
Мы все еще можем сказать, что 4 - случайное и возвращено справедливым броском игры в кости
мое местоимение monicareinstate
@someone 4сделает вывод детерминированным, то есть не «случайным». Отредактировал правила, чтобы сделать это явным.
JungHwan Мин
@ someone ты имеешь в виду 4 из-за XKCD ?
Джакомо Гарабелло

Ответы:

5

Python 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]

Попробуйте онлайн!

TFeld
источник
527 байт
Эрик Outgolfer
@EriktheOutgolfer Спасибо :)
TFeld
520 байт
овс
h+R(X)*-~iможет быть h-~i*R(X).
Джонатан Фрех
L=[...];D=Lможет быть D=L=[...].
Джонатан Фрех