Bir ipi yık!


12

Meydan okuma

Bir dize girdisi verildiğinde, onun yıkılmış sürümünü çıktılar.

Süreç

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. Dizeyi dikey olarak yerleştirin.
  2. 1Ve (height of the column of characters) - 1ile rastgele bir yön arasında (sol veya sağ) rastgele bir tamsayı seçin .
  3. Bu sayıda karakteri o yönde döndürün (bu boşluklar boşsa 4. adıma gidin; değilse 2. adıma geri dönün).
  4. Bırakın bu karakterler yerçekimi yüzünden düşsün.
  5. Karakter sütununun 1yüksekliği, yanındaki sütunların yüksekliğinden en fazla olana kadar tekrarlayın (yani sütunu daha fazla yıkmak imkansız hale gelir ("2-4. Adımlar")).
  6. Karakterleri 1çevreleyen sütunlardan bir veya daha fazlasından daha uzun olan başka bir karakter sütunu varsa (yani, yıkılabilir), artık yıkanamayana kadar bu sütunu art arda yıkın. Yıkılabilir birden çok sütun varsa, en uzun sütunu tamamen yıkın (birden çok en yüksek sütun varsa, en soldaki sütunu tamamen yıkın).
  7. Tüm sütunlar artık yıkanamayana kadar tekrarlayın.

Girişte boşluk karakterleri varsa, önce hepsini bir kerede yok edin.

C
o

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

kurallar

  • Standart boşluklar yasaktır.
  • Sondaki ve önde gelen yeni satırlara izin verilir.
  • Programınız bir dize / eşdeğeri yazdırabilir veya döndürebilir.
  • Çıktı deterministik olmamalıdır (giriş yıkılamazsa).

Bu , bu yüzden kendi dillerinde en küçük bayt sayımları kazanır!


1
Rastgele burada gerçekten gerekli olup olmadığından şüphe
duyarım

@KeyuGan İnsanların sabit sayıda karakter seçmesi ve sola / sağa değişmesi durumunda zorluğun oldukça önemsiz olacağını düşünüyorum.
JungHwan Min

4
Hala 4'ün rastgele olduğunu ve adil bir zar
atışıyla

@someone 4çıktıyı deterministik yapar, yani "rastgele" yapmaz. Bunu açık hale getirmek için kuralları düzenledi.
JungHwan Min

@ XKCD yüzünden 4 kişiden bahsediyor musunuz?
Giacomo Garabello

Yanıtlar:


5

Piton 2 , 622 595 573 552 542 534 527 520 515 bayt

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]

Çevrimiçi deneyin!



@EriktheOutgolfer Teşekkürler :)
TFeld


h+R(X)*-~iolabilir h-~i*R(X).
Jonathan Frech

L=[...];D=Lolabilir D=L=[...].
Jonathan Frech
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.