Démolissez une chaîne!

12

Défi

Étant donné une entrée de chaîne, affichez la version démolie de celle-ci.

Le processus

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. Placez la chaîne verticalement.
  2. Sélectionnez un entier aléatoire entre 1et (height of the column of characters) - 1et une direction aléatoire (gauche ou droite).
  3. Faites pivoter ce nombre de caractères dans cette direction (si ces espaces sont inoccupés, passez à l'étape 4; sinon, revenez à l'étape 2).
  4. Laissez ces personnages tomber à cause de la gravité.
  5. Répétez l'opération jusqu'à ce que la hauteur de la colonne de caractères soit au plus 1supérieure à la hauteur des colonnes adjacentes (c'est-à-dire qu'il devient impossible de démolir davantage ("étapes 2 à 4") la colonne).
  6. S'il y a une autre colonne de caractères dont la 1taille est supérieure à celle d'une ou de plusieurs de ses colonnes environnantes (c'est-à-dire pouvant être démolies), démolissez cette colonne à plusieurs reprises jusqu'à ce qu'elle ne soit plus démolissable. S'il y a plusieurs colonnes pouvant être démolies, démolissez complètement la colonne la plus haute (s'il y a plusieurs colonnes les plus hautes, démolissez complètement la plus à gauche).
  7. Répétez jusqu'à ce que toutes les colonnes ne soient plus démolissantes.

S'il y a des caractères d'espace dans l'entrée, démolissez-les d'abord, tout d'un coup.

C
o

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

Règles

  • Les failles standard sont interdites.
  • Les sauts de ligne de fin et de début sont autorisés.
  • Votre programme peut imprimer ou renvoyer une chaîne / équivalent.
  • La sortie doit être non déterministe (sauf si l'entrée ne peut pas être démolie).

C'est du , donc les soumissions avec le plus petit nombre d'octets dans leurs langues gagnent!

JungHwan Min
la source
1
Je doute que le hasard soit vraiment nécessaire ici
Keyu Gan
@KeyuGan Je pense que le défi serait assez trivial si les gens devaient sélectionner un nombre fixe de caractères et alterner gauche / droite.
JungHwan Min
4
Nous pouvons toujours dire que 4 est aléatoire et retourné par un jet de dés équitable
mon pronom est monicareinstate
@quelqu'un 4rendrait la sortie déterministe, c'est-à-dire non "aléatoire". Modifié les règles pour le rendre explicite.
JungHwan Min
@ quelqu'un parlez-vous à 4 à cause de XKCD ?
Giacomo Garabello

Réponses:

5

Python 2 , 622 595 573 552 542 534 527 520 515 octets

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]

Essayez-le en ligne!

TFeld
la source
527 octets
Erik the Outgolfer
@EriktheOutgolfer Merci :)
TFeld
h+R(X)*-~ipeut être h-~i*R(X).
Jonathan Frech
L=[...];D=Lpeut être D=L=[...].
Jonathan Frech