Patlayan Kediler!


17

Meydan okuma

Uzunluk dizesi girişi alan bir program / işlev yapacaksınız nve:

  1. Karakteri, kthuzayın ortasına koyar k = (n+1)/2. Bu, sıfır noktanızın yeri olacaktır.
  2. Beyaz olmayan karakterlerin geri kalanını rastgele sıfır etrafında düzenlenmiş olarak koyar. Karakterden Pisagor mesafesi aşılmamalıdır n.
  3. Sonucu çıktılar.

Açıklamalara ihtiyacınız varsa aşağıdaki örneğe bakın.


kurallar

  • Standart boşluklar geçerlidir!
  • G / Ç bir dize biçiminde olmalıdır.
  • Sıfır noktası koymak için merkezi bir karakter olduğundan emin olmak için giriş her zaman garip olacaktır.
  • Her geçerli çıktı sıfır olmayan bir olasılıkla gerçekleşmelidir.

Bu ; bayttaki en kısa kod kazanır!


Misal

Giriş: qwert

Sıfırdan kaynaklanan patlamanın sınırları (x'in kalan karakterlerin geçerli yerleri olduğuna işaret eder):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Örnek çıktı:

       t
     r

q    e


      w

Rastgele konum seçildiğinde, bir karakter diğerinin aynı konumuna gidip üzerine yazılabilir. Bu azaldı mı? (Benim önerim: hayır)
edc65

Haklısın: Hayır.
Mama Fun Roll

1
Bunun beni havaya uçurmakla ne ilgisi var? (Başlığın ilgisini gerçekten anlamıyorum ...)
kedi

1
@cat Girdiyi patlatmanız dışında, bir kedi programının değiştirilmiş halidir.
Mama Fun Roll

Yanıtlar:


0

APL (Dyalog Klasik) , 68 66 65 63 62 bayt

{⍵@(n⊣¨¨@(⊢≡¨⌽)i[n?≢i←⍸(××n≥*∘.5)+.ר⍨n-⍳s])⊢''⍴⍨s21+2×n←≢⍵}

Çevrimiçi deneyin!

{ } argüman ile anonim işlev

n←≢⍵değişken nuzunluk

s←2⍴1+2×ndeğişken ssonucun şeklidir: 2n + 1 x 2n + 1

''⍴⍨s bu şekle sahip bir alan karesi oluşturun

A@I⊢Bmatris içindeki A(çift) endekslere eleman koyarIB

+.ר⍨n-⍳s matris merkezinden kare mesafeler

(××n≥*∘.5) bu mesafelerin sıfırdan farklı olduğunu gösteren boole matrisi ve ≤n

boole matrisindeki 1'ler için koordinat çiftleri

i[n?≢i← ... ] n tane rastgele seç (kopya yok)

n⊣¨¨@(⊢≡¨⌽) merkezi olanı olarak değiştir n n

⍵@( ... )⊢ ... argümandan karakterleri boşluk matrisinde verilen endekslere koy


3

JavaScript (ES6), 211 216 220

1 bayt kaydedilen thx @usandfriends Düzenle

s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

Ölçek

f=s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

// Less golfed
U=s=>(
  l=s.length,
  h=l-~l, // l+l+1
  g=Array(h).fill(' '.repeat(h)),
  [...s].map((c,i)=>{
    for(R=_=>Math.random()*h-l|0;
        x=R(y=R()), // set x,y to a random value in range -l ... l
        !(i - (l/2|0) // check if at mid point of input string
          ? x|y && // if not, check x and y must not be both 0
            x*x + y*y <= l*l &  // then check position inside the circle of ray L
            g[y+=l][x+=l] < '!' // then add offset L and check if position is not already used 
          : x=y=l // if at midpoint in input string, x and y have fixed value L
         );
       ); // loop until valid position found
    z = [...g[y]];  // modify string at current position: convert to array ...
    z[x] = c;       // ... set element ...
    g[y] = z.join`` // ... back to string
  }),
  g.join`\n`
)  

setInterval(_=>O.textContent=(f(I.value)),1000)
Word <input id=I value='qwert'><pre id=O></pre>


Daha önce fazladan bir alanınız varg.map(r=>r.join``)...
usandfriends

@usandfriends thx Nasıl özlediğimi bilmiyorum
edc65

Yerine new Date()%h-lkullanın Math.random()*h-l|0. Bayt tasarrufu sağlar.
ericw31415

1
@ ericw31415 sadece 0 kullanır. Bayt tasarrufu da sağlar. Ama ikisi de çalışmaz
edc65

2

Yakut, 211 207 203 196 karakter

4 karakter için edc65'e teşekkürler

->(x){x=x.chars
o,b,c=x.size
l=o*2+1
a=Array.new(l){Array.new l,' '}
a[o][o]=x.delete_at o/2
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
a.map(&:join).join $/}

Açıklama:

->(x){...} bağımsız değişken alan anonim bir işlev tanımlayın x

x=x.charsdönüşümü xtek karakterlik dizeleri bir diziye bir dizeden

o,b,c=x.sizegirişin uzunluğunu odaha sonra kullanmak üzere saklayın . bve csadece bir şeye başlatılması gerekir , bu nedenle önceki bir atamaya ekleyerek 2 karakter kaydedin.

l=o*2+1 bu, tüm karakterlerin gidebileceği alanın uzunluğu / genişliği, ayrıca patlama dairesinin çapıdır.

Array.new(l){Array.new l,' '}Bir yapmak lx luzay karakter 2D dizi büyüklüğünde.

a[o][o]=x.delete_at o/2 dizinin merkezini, değerlerin ortasına ayarlar. x (giriş) bu değerix

... while x[0]bloğu (bu durumda, whilesatır içi olduğu için önceki kod ) xboş olana kadar tekrar tekrar çalıştırın . Ruby'de, var olmayan bir dizine erişmek döndürürnil , bir falsey değeri olan .

a[b=rand(l)][c=rand(l)]==' 'bVe crasgele değerlere atayın. 0 <= n < l. Sonra kontrol nokta olarak ise b,c boş (aka ayarlamak boşluk karakteri etmektir)

(b-o)**2+(c-o)**2<=o*oPisagor mesafe kontrolü. ogirişin uzunluğudur. **Ruby'nin üs alma operatörü olduğunu ve val<=o*odaha kısadırval**0.5<=o .

a[b][c]=x.popson değeri sil x. Konum ayarlama a, bdizideki bu değerea

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]Bu konum serbestse ve patlama yarıçapındaysa son konuma rastgele bir konum belirleyin; yerleştirilecek karakter bitene kadar bunu yapmaya devam edin.

$/işletim sisteminin yeni satırına ayarlanmıştır. Ayrıca daha kısa"\n"

a.map(&:join).join $/Tüm dizileri atek dizeli bir sürümle eşleyin (ör. ['a','b','c']-> 'abc'). Bu yeni diziyi alın ve yeni satırlarla katılın. Örtülü dönüş.


o * o daha kısadır ** 0.5
edc65

0

Python 3 , 286 bayt

import random as r
i=input()
l=len(i)
a=range(-l,l+1)
g=[(y,x)for y in a for x in a]
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
m=i[l//2]
d=[*i.replace(m,"",1).center(len(p))]
r.shuffle(d)
o=""
for c in g:
	o+=m if c==(0,0)else d.pop()if c in p else" "
	if c[1]==l:o+="\n"
print(o)

Çevrimiçi denemek bir seçenektir.

Whoops, son etkinlik nedeniyle bunun üzerine tökezledi, bunun üzerinde iyi bir zaman geçirene kadar bir şekilde iki yaşın üzerinde olduğunu fark etmedi. İki cevap biraz üzücü, bu yüzden yine de göndermek iyi bir fikir. Eminim bu konuda iyileştirmek için düzinelerce yol var - şimdiye kadar girdinin her zaman garip olduğunu fark etmedim, ki bu da bilmek yardımcı olurdu.

açıklama

i=input() girdidir, elbette, l=len(i) birkaç kez kullanıldığı için dizenin uzunluğunu koruyor.

a=range(-l,l+1) - bir boyut boyunca her iki yönde de başlangıç ​​mesafesinden mevcut mesafeleri değiştiren bir yineleyici oluşturmak için hızlı bir araç

g=[(y,x)for y in a for x in a] tüm son ızgarayı oluşturan bir grup koordinat listesi oluşturur.

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] yalnızca merkez dışı harflerin üzerine gelebileceği koordinatları içeren listenin bir alt kümesini oluşturur.

m=i[l//2] merkez karakteri kurar.

d=[*i.replace(m,"",1).center(len(p))]- merkez karakter çıkarıldı ve bizi diğer enkazlarla birlikte bıraktı. center()O karakter belirli sayıda uzun olana kadar (varsayılan bir boşluk ile birlikte) çizgi dışarı pad bizi tanır çünkü fonksiyonu, burada çok güzel. Burada, harflerin üzerine gelebileceği alan sayısı, böylece ihtiyacımız olan dağılımı yansıtıyor.

r.shuffle(d) doğal olarak, söz konusu dağıtımın gerçekte ... dağıtılmış olmasını karıştırır.

Döngü, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" " olası iniş olsun ya da olmasın, tüm uygulanabilir karoların karesini inceler ve gerekirse çıktı dizimize bir karakter ekler o. Karakterler enkaz örneğimizden çıkarılır, böylece yalnızca bir kez görünürler.

if c[1]==l:o+="\n"- Satır kesmeleri de ekler. İadeler.

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.