Kucing yang meledak!

17

Tantangan

Anda akan membuat program / fungsi yang membutuhkan panjang string input n, dan:

  1. Letakkan kthchar di tengah ruang, di mana k = (n+1)/2. Ini akan menjadi lokasi ground zero Anda.
  2. Letakkan sisa karakter non-spasi putih yang diatur secara acak di sekitar ground zero. Jarak Pythagoras dari char tidak boleh melebihi n.
  3. Keluarkan hasilnya.

Jika Anda membutuhkan klarifikasi, lihat contoh di bawah ini.


Aturan

  • Celah standar berlaku!
  • I / O harus dalam bentuk string.
  • Input akan selalu aneh untuk memastikan bahwa Anda memiliki char pusat untuk diletakkan di ground zero.
  • Setiap output yang valid harus terjadi dengan probabilitas tidak nol.

Ini adalah ; kode terpendek dalam byte menang!


Contoh

Memasukkan: qwert

Batas-batas ledakan yang berasal dari ground zero (tanda x berlaku untuk sisa karakter):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Contoh output:

       t
     r

q    e


      w
Mama Fun Roll
sumber
Memilih posisi secara acak, satu karakter bisa berada pada posisi yang sama dan menimpanya. Apakah ini diizinkan? (Saran saya: tidak)
edc65
Anda benar: Tidak.
Mama Fun Roll
1
Apa hubungan ini dengan meledakkan saya? (Saya benar-benar tidak mengerti relevansi judul ...)
cat
1
@ kucing Ini adalah modifikasi dari program kucing, kecuali bahwa Anda meledak inputnya.
Mama Fun Roll

Jawaban:

0

APL (Dyalog Classic) , 68 66 65 63 62 byte

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

Cobalah online!

{ } fungsi anonim dengan argumen

n←≢⍵variabel nadalah panjangnya

s←2⍴1+2×nvariabel sadalah bentuk hasilnya: 2n + 1 oleh 2n + 1

''⍴⍨s buat kuadrat ruang dengan bentuk itu

A@I⊢Bmenempatkan elemen Apada (pasang) indeks Idalam matriksB

+.ר⍨n-⍳s jarak kuadrat dari pusat matriks

(××n≥*∘.5) matriks boolean menunjukkan di mana jarak tersebut bukan nol dan ≤n

mengoordinasikan pasangan untuk 1s dalam matriks boolean

i[n?≢i← ... ] pilih n dari mereka secara acak (tidak ada duplikat)

n⊣¨¨@(⊢≡¨⌽) ubah yang sentral menjadi n n

⍵@( ... )⊢ ... letakkan karakter dari argumen pada indeks yang diberikan dalam matriks spasi

ngn
sumber
3

JavaScript (ES6), 211 216 220

Edit 1 byte yang disimpan thx @ usandfriends

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`
`

Uji

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>

edc65
sumber
Anda memiliki ruang ekstra sebelumnyag.map(r=>r.join``)...
usandfriends
@ usandfriends thx Saya tidak tahu bagaimana saya melewatkannya
edc65
Gunakan new Date()%h-lsebagai ganti Math.random()*h-l|0. Menghemat byte.
ericw31415
1
@ ericw31415 gunakan hanya 0. Ini menghemat byte juga. Tetapi keduanya tidak akan berfungsi
edc65
2

Rubi, 211 207 203 196 karakter

Berkat edc65 untuk 4 karakter

->(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 $/}

Penjelasan:

->(x){...} mendefinisikan fungsi anonim yang mengambil argumen x

x=x.charsmengubah xdari string menjadi array string satu karakter

o,b,c=x.sizesimpan panjang input ountuk digunakan nanti. bdan chanya perlu diinisialisasi ke sesuatu , jadi simpan 2 karakter dengan melampirkan tugas sebelumnya.

l=o*2+1 ini adalah panjang / lebar bidang tempat semua karakter mungkin bisa pergi, juga diameter lingkaran ledakan.

Array.new(l){Array.new l,' '}membuat lx l2D 2D array karakter ruang.

a[o][o]=x.delete_at o/2set pusat array ke pusat nilai x(input), sambil menghapus nilai itu darix

... while x[0]jalankan blok (dalam hal ini, kode sebelumnya whilekarena inline) berulang-ulang sampai xkosong. Di ruby, mengakses indeks yang tidak ada mengembalikan nil, yang merupakan nilai falsey.

a[b=rand(l)][c=rand(l)]==' 'Tetapkan bdan cuntuk nilai acak di mana 0 <= n < l. Kemudian periksa apakah tempat di b, ckosong (alias disetel ke karakter spasi)

(b-o)**2+(c-o)**2<=o*oPeriksa jarak Pythagoras. oadalah panjang input. **adalah operator eksponensial Ruby, dan val<=o*olebih pendek dari val**0.5<=o.

a[b][c]=x.pophapus nilai terakhir dari x. Atur posisi a, bke nilai itu dalam arraya

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]Atur posisi acak ke nilai terakhir jika posisi itu gratis dan berada dalam radius ledakan; terus lakukan ini sampai kita kehabisan karakter untuk ditempatkan.

$/diatur ke baris sistem operasi. Ini juga lebih pendek dari"\n"

a.map(&:join).join $/Petakan semua array ake versi single-string sendiri (mis. ['a','b','c']-> 'abc'). Ambil array baru itu dan bergabunglah dengan baris baru. Pengembalian tersirat.

Shelvacu
sumber
o * o lebih pendek dari ** 0,5
edc65
0

Python 3 , 286 byte

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)

Mencoba secara online adalah suatu pilihan.

Ups, tersandung pada ini karena aktivitas baru-baru ini, tidak menyadari itu lebih dari dua tahun sampai saya menghabiskan waktu yang baik untuk hal ini. Nah, dua jawaban agak menyedihkan, jadi ini mungkin ide yang bagus untuk dikirim. Saya yakin ada lusinan cara untuk memperbaiki hal ini — tidak menyadarinya sampai saat ini bahwa inputnya selalu aneh, yang pasti sangat membantu untuk diketahui.

Penjelasan

i=input()input, tentu saja, l=len(i)menghemat panjang string karena digunakan beberapa kali.

a=range(-l,l+1) - Alat cepat untuk membuat iterator mulai jarak yang tersedia jauh dari asal dua arah sepanjang satu dimensi.

g=[(y,x)for y in a for x in a] membangun daftar koordinat tuple yang membentuk seluruh kisi terakhir.

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] membuat himpunan bagian dari daftar yang hanya berisi koordinat yang dapat diletakkan di tengah-tengah huruf non-tengah.

m=i[l//2] menetapkan karakter pusat.

d=[*i.replace(m,"",1).center(len(p))]- karakter tengah dikeluarkan, meninggalkan kita bersama puing-puing lainnya. The center()fungsi sangat bagus di sini, karena memungkinkan kita untuk pad keluar garis (dengan default spasi) sampai itu sejumlah karakter. Di sini, itulah jumlah ruang tempat surat dapat mendarat, sehingga mencerminkan distribusi yang kita butuhkan.

r.shuffle(d) secara alami mengocok distribusi menjadi benar-benar ... didistribusikan.

Lingkaran,, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "melihat ke seluruh kuadrat ubin yang layak, terlepas dari apa pun yang mungkin mendarat di atasnya atau tidak, dan jika perlu, menambahkan karakter ke string keluaran kami o. Karakter muncul dari sampel puing-puing kami sehingga hanya muncul sekali.

if c[1]==l:o+="\n"- Menambahkan jeda baris juga. Kembali

Reecer6
sumber