Знесіть струну!


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 Min

4
Ми все ще можемо сказати, що 4 є випадковим і повертається чесною кісткою
моя займенник monicareinstate

@someone 4зробить результат детермінованим, тобто не "випадковим". Відредагував правила, щоб зробити це явним.
JungHwan Min

@someone ви посилаєтесь на 4 через XKCD ?
Джакомо Гарабелло

Відповіді:


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).
Джонатан Фрех

L=[...];D=Lможе бути D=L=[...].
Джонатан Фрех
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.