Zniszcz ciąg!

12

Wyzwanie

Biorąc pod uwagę ciąg wejściowy, wypisz jego zburzoną wersję.

Proces

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. Umieść sznurek pionowo.
  2. Wybierz losową liczbę całkowitą pomiędzy 1i (height of the column of characters) - 1losowy kierunek (w lewo lub w prawo).
  3. Obróć tę liczbę znaków w tym kierunku (jeśli te miejsca nie są zajęte, przejdź do kroku 4; jeśli nie, wróć do kroku 2).
  4. Niech te postacie spadną z powodu grawitacji.
  5. Powtarzaj tę czynność, dopóki wysokość kolumny znaków nie będzie co najwyżej 1większa niż wysokość kolumn obok niej (tzn. Niemożliwe będzie dalsze wyburzenie („kroki 2-4”) kolumny).
  6. Jeśli istnieje inna kolumna znaków, która jest więcej niż 1postać wyższa niż jedna lub więcej otaczających ją kolumn (tj. Możliwa do wyburzenia), kilkakrotnie wyburz tę kolumnę, aż nie będzie już możliwa do wyburzenia. Jeśli istnieje wiele kolumn, które można wyburzyć, całkowicie wyburz najwyższą kolumnę (jeśli jest wiele najwyższych kolumn, całkowicie wyburz lewą).
  7. Powtarzaj, aż wszystkie kolumny nie będą już możliwe do wyburzenia.

Jeśli na wejściu znajdują się spacje, zniszcz je najpierw, wszystkie na raz.

C
o

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

Zasady

  • Standardowe luki są zabronione.
  • Dozwolone są końcowe i wiodące znaki nowej linii.
  • Twój program może wydrukować lub zwrócić ciąg / ekwiwalent.
  • Dane wyjściowe muszą być niedeterministyczne (chyba że dane wejściowe nie są możliwe do wyburzenia).

To jest , więc wygrane są zgłoszenia o najmniejszej liczbie bajtów w ich językach!

JungHwan Min
źródło
1
Wątpiłbym,
@KeyuGan Myślę, że wyzwanie byłoby dość trywialne, gdyby ludzie musieli wybrać stałą liczbę znaków i naprzemiennie lewo / prawo.
JungHwan Min
4
Nadal możemy powiedzieć, że 4 jest losowe i
zwraca
@ ktoś 4sprawi, że wynik będzie deterministyczny, tzn. nie będzie „losowy”. Zmodyfikowałem reguły, aby to jednoznacznie wyrazić.
JungHwan Min
@soneone, czy odnosisz się do 4 z powodu XKCD ?
Giacomo Garabello,

Odpowiedzi:

5

Python 2 , 622 595 573 552 542 534 527 520 515 bajtów

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]

Wypróbuj online!

TFeld
źródło
527 bajtów
Erik the Outgolfer
@EriktheOutgolfer Thanks :)
TFeld
h+R(X)*-~imoże być h-~i*R(X).
Jonathan Frech
L=[...];D=Lmoże być D=L=[...].
Jonathan Frech