Zerstöre eine Schnur!

12

Herausforderung

Geben Sie bei einer Zeichenfolgeeingabe die abgerissene Version aus.

Der Prozess

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. Legen Sie die Zeichenfolge vertikal.
  2. Wählen Sie eine zufällige Ganzzahl zwischen 1und (height of the column of characters) - 1und eine zufällige Richtung (links oder rechts).
  3. Drehen Sie diese Anzahl von Zeichen in diese Richtung (wenn diese Leerzeichen nicht belegt sind, fahren Sie mit Schritt 4 fort; andernfalls fahren Sie mit Schritt 2 fort).
  4. Lassen Sie diese Charaktere aufgrund der Schwerkraft fallen.
  5. Wiederholen, bis die Höhe der Zeichenspalte höchstens 1größer ist als die Höhe der Spalten daneben (dh es wird unmöglich, die Spalte weiter abzureißen ("Schritte 2-4")).
  6. Wenn es eine andere Zeichenspalte gibt, deren 1Zeichen größer als eine oder mehrere der umgebenden Spalten ist (dh abreißbar), reißen Sie diese Spalte so oft ab, bis sie nicht mehr abreißbar ist. Wenn es mehrere zerstörbare Spalten gibt, zerstören Sie die höchste Spalte vollständig (wenn es mehrere höchste Spalten gibt, zerstören Sie die am weitesten links stehende Spalte vollständig).
  7. Wiederholen, bis alle Spalten nicht mehr abreißbar sind.

Wenn die Eingabe Leerzeichen enthält, zerstören Sie diese zuerst auf einmal.

C
o

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

Regeln

  • Standardlücken sind verboten.
  • Nachgestellte und führende Zeilen sind erlaubt.
  • Ihr Programm kann entweder eine Zeichenfolge oder eine Entsprechung ausgeben oder ausgeben.
  • Die Ausgabe darf nicht deterministisch sein (es sei denn, die Eingabe kann nicht zerstört werden).

Das ist , also gewinnen die Einsendungen mit der geringsten Anzahl von Bytes in ihren Sprachen!

JungHwan min
quelle
1
Ich würde bezweifeln, ob Zufall hier wirklich notwendig ist
Keyu Gan
@KeyuGan Ich denke, die Herausforderung wäre ziemlich trivial, wenn die Leute eine feste Anzahl von Zeichen auswählen müssten und abwechselnd links / rechts.
JungHwan Min
4
Wir können immer noch sagen, dass 4 zufällig ist und von einem fairen Würfelwurf zurückgegeben wird
mein Pronomen ist monicareinstate
@someone 4würde die Ausgabe deterministisch machen, dh nicht "zufällig". Bearbeitet die Regeln, um das explizit zu machen.
JungHwan Min
@ jemand beziehen Sie sich auf 4 wegen XKCD ?
Giacomo Garabello

Antworten:

5

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

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]

Probieren Sie es online!

TFeld
quelle
527 bytes
Erik der Outgolfer
@EriktheOutgolfer Danke :)
TFeld
520 Bytes
Ovs
h+R(X)*-~ikann sein h-~i*R(X).
Jonathan Frech
L=[...];D=Lkann sein D=L=[...].
Jonathan Frech