Phá hủy một chuỗi!


12

Thử thách

Đưa ra một đầu vào chuỗi, đầu ra phiên bản bị phá hủy của nó.

Quá trình

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. Đặt chuỗi theo chiều dọc.
  2. Chọn một số nguyên ngẫu nhiên giữa 1(height of the column of characters) - 1một hướng ngẫu nhiên (trái hoặc phải).
  3. Xoay số lượng ký tự theo hướng đó (nếu những khoảng trống đó không được sử dụng, hãy chuyển sang bước 4; nếu không, hãy quay lại bước 2).
  4. Hãy để những nhân vật rơi xuống do trọng lực.
  5. Lặp lại cho đến khi chiều cao của cột của các ký tự 1lớn nhất nhiều hơn chiều cao của các cột bên cạnh nó (nghĩa là không thể phá hủy thêm ("các bước 2-4") của cột).
  6. Nếu có một cột ký tự khác cao hơn 1ký tự cao hơn một hoặc nhiều cột xung quanh của nó (nghĩa là có thể phá hủy), liên tục phá hủy cột đó cho đến khi nó không còn có thể phá hủy. Nếu có nhiều cột có khả năng phá hủy, phá hủy hoàn toàn cột cao nhất (nếu có nhiều cột cao nhất, phá hủy hoàn toàn cột ngoài cùng bên trái).
  7. Lặp lại cho đến khi tất cả các cột không còn có thể phá hủy.

Nếu có các ký tự khoảng trắng trong đầu vào, hãy phá hủy chúng trước, tất cả cùng một lúc.

C
o

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

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm.
  • Trailing và hàng đầu mới được cho phép.
  • Chương trình của bạn có thể in hoặc trả về một chuỗi / tương đương.
  • Đầu ra phải không xác định (trừ khi đầu vào không thể phá hủy).

Đây là , vì vậy những bài nộp có số byte nhỏ nhất trong ngôn ngữ của họ sẽ giành chiến thắng!


1
Tôi nghi ngờ nếu ngẫu nhiên là thực sự cần thiết ở đây
Keyu Gan

@KeyuGan Tôi nghĩ rằng thử thách sẽ khá tầm thường nếu mọi người phải chọn một số lượng ký tự cố định và xen kẽ trái / phải.
JungHwan Min

4
Chúng ta vẫn có thể nói rằng 4 là ngẫu nhiên và được trả lại bởi một con súc sắc công bằng
đại từ của tôi là monicareinstate

@someone 4sẽ làm cho đầu ra xác định, tức là không "ngẫu nhiên". Chỉnh sửa các quy tắc để làm cho rõ ràng.
JungHwan Min

@someone bạn đang giới thiệu ở số 4 vì XKCD ?
Giacomo Garabello

Câu trả lời:


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]

Hãy thử trực tuyến!



@EriktheOutgolfer Cảm ơn :)
TFeld


h+R(X)*-~icó thể h-~i*R(X).
Jonathan Frech

L=[...];D=Lcó thể D=L=[...].
Jonathan Frech
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.