Hancurkan string!

12

Tantangan

Diberikan input string, tampilkan versi yang dihancurkan.

Proses

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. Tempatkan string secara vertikal.
  2. Pilih bilangan bulat acak antara 1dan (height of the column of characters) - 1dan arah acak (kiri atau kanan).
  3. Putar jumlah karakter ke arah itu (jika ruang itu kosong, lanjutkan ke langkah 4; jika tidak, kembali ke langkah 2).
  4. Biarkan karakter tersebut jatuh karena gravitasi.
  5. Ulangi sampai ketinggian kolom karakter paling 1besar lebih tinggi dari ketinggian kolom di sebelahnya (yaitu menjadi mustahil untuk menghancurkan lebih lanjut ("langkah 2-4") kolom).
  6. Jika ada kolom karakter lain yang lebih dari 1karakter lebih tinggi dari satu atau lebih kolom di sekitarnya (yaitu dapat dihancurkan), berulang kali hancurkan kolom itu hingga tidak lagi dapat dihancurkan. Jika ada beberapa kolom yang dapat dihancurkan, hancurkan kolom tertinggi secara penuh (jika ada beberapa kolom tertinggi, hancurkan sepenuhnya kolom yang paling kiri).
  7. Ulangi sampai semua kolom tidak lagi dapat dibongkar.

Jika ada karakter spasi di input, hancurkan yang pertama, sekaligus.

C
o

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

Aturan

  • Celah standar dilarang.
  • Trailing dan baris baru diizinkan.
  • Program Anda dapat mencetak atau mengembalikan string / setara.
  • Outputnya harus non-deterministik (kecuali input tidak dapat dibongkar).

Ini adalah , sehingga kiriman dengan jumlah byte terkecil dalam bahasa mereka menang!

JungHwan Min
sumber
1
Saya akan meragukan jika acak benar-benar diperlukan di sini
Keyu Gan
@ Kaneyan Saya pikir tantangannya akan cukup sepele jika orang harus memilih jumlah karakter yang tetap dan berganti-ganti kiri / kanan.
JungHwan Min
4
Kita masih bisa mengatakan bahwa 4 adalah acak dan dikembalikan dengan lemparan dadu yang adil
kata ganti saya adalah monicareinstate
@ Seseorang 4akan membuat output deterministik, yaitu bukan "acak." Mengedit aturan untuk membuatnya eksplisit.
JungHwan Min
@ seseorang yang Anda rujuk pada 4 karena XKCD ?
Giacomo Garabello

Jawaban:

5

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

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]

Cobalah online!

TFeld
sumber
527 bytes
Erik the Outgolfer
@EriktheOutgolfer Terima kasih :)
TFeld
520 byte
ovs
h+R(X)*-~ibisa h-~i*R(X).
Jonathan Frech
L=[...];D=Lbisa D=L=[...].
Jonathan Frech