ทำลายสตริง!


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อักขระที่สูงกว่าคอลัมน์โดยรอบอย่างน้อยหนึ่งคอลัมน์ (เช่นรื้อถอนได้) ให้ทำลายคอลัมน์นั้นซ้ำ ๆ จนกว่าจะไม่สามารถรื้อถอนได้อีก หากมีคอลัมน์ที่สามารถรื้อถอนได้หลายคอลัมน์ให้ทำลายเสาที่สูงที่สุดทั้งหมด (หากมีคอลัมน์ที่สูงที่สุดหลายเสาให้รื้อเสาที่เหลือทางซ้าย)
  7. ทำซ้ำจนกว่าคอลัมน์ทั้งหมดจะไม่สามารถทำลายได้อีกต่อไป

หากมีอักขระเว้นวรรคในอินพุตให้ทำลายอักขระเหล่านั้นก่อนพร้อมกันทั้งหมด

C
o

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

กฎระเบียบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • อนุญาตให้ขึ้นบรรทัดใหม่และลากขึ้นบรรทัดใหม่ได้
  • โปรแกรมของคุณอาจพิมพ์หรือส่งคืนสตริง / เทียบเท่า
  • เอาต์พุตต้องไม่ถูกกำหนดไว้ (ยกเว้นว่าอินพุตไม่สามารถทำลายได้)

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดในภาษาของพวกเขาจึงชนะ!


1
ฉันสงสัยว่าการสุ่มจำเป็นจริงๆหรือไม่ที่นี่
Keyu Gan

@KeyuGan ฉันคิดว่าความท้าทายจะไม่สำคัญพอสมควรหากผู้คนต้องเลือกจำนวนตัวอักษรและสลับซ้าย / ขวา
JungHwan Min

4
เรายังสามารถพูดได้ว่า 4 สุ่มและส่งคืนโดยการทอยลูกเต๋าที่เป็นธรรม
คำสรรพนามของฉันคือ monicareinstate

@someone 4จะทำให้เอาต์พุตที่กำหนดขึ้นนั่นคือไม่ใช่ "random" แก้ไขกฎเพื่อให้ชัดเจน
JungHwan ขั้นต่ำ

@someone คุณอ้างถึง 4 เนื่องจากXKCDหรือไม่
Giacomo Garabello

คำตอบ:


5

Python 2 , 622 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)*-~ih-~i*R(X)สามารถ
Jonathan Frech

L=[...];D=LD=L=[...]สามารถ
Jonathan Frech
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.