文字列を破壊します!


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周囲の列の1つ以上の文字よりも高い文字の別の列がある(つまり、解体可能)場合は、その列が解体不可能になるまで繰り返しその列を解体します。破壊可能な列が複数ある場合は、最も高い列を完全に破壊します(最も高い列が複数ある場合は、左端の列を完全に破壊します)。
  7. すべての列が取り外せなくなるまで繰り返します。

入力にスペース文字が含まれている場合は、最初にスペース文字を一度に破棄します。

C
o

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

ルール

  • 標準的な抜け穴は禁止されています。
  • 末尾と先頭の改行が許可されます。
  • あなたのプログラムは、文字列/同等のものを印刷するか返すかもしれません。
  • 出力は非決定的である必要があります(入力が破壊可能でない場合を除く)。

これはであるため、言語でバイト数が最小の提出が勝ちです!


1
ランダムがここに本当に必要であれば、私は疑うだろう
Keyuガン

@KeyuGan固定数の文字を選択し、左/右を交互に選択しなければならない場合、課題はかなり簡単になると思います。
ジョンファンミン

4
我々はまだ4がランダムかつ公正なダイスロールによって返さあると言うことができます
私の代名詞はmonicareinstateです

@someone 4は、出力を決定的、つまり「ランダム」ではありません。ルールを編集して、明示的にしました。
ジョンファンミン

XKCDのために、誰かが 4を参照していますか?
ジャコモガラベッロ

回答:


5

Pythonの2622 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=[...]
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.