Tantangan
Anda akan membuat program / fungsi yang membutuhkan panjang string input n
, dan:
- Letakkan
kth
char di tengah ruang, di manak = (n+1)/2
. Ini akan menjadi lokasi ground zero Anda. - Letakkan sisa karakter non-spasi putih yang diatur secara acak di sekitar ground zero. Jarak Pythagoras dari char tidak boleh melebihi
n
. - 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-golf ; 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
Jawaban:
APL (Dyalog Classic) ,
6866656362 byteCobalah online!
{ }
fungsi anonim dengan argumen⍵
n←≢⍵
variabeln
adalah panjangnyas←2⍴1+2×n
variabels
adalah bentuk hasilnya: 2n + 1 oleh 2n + 1''⍴⍨s
buat kuadrat ruang dengan bentuk ituA@I⊢B
menempatkan elemenA
pada (pasang) indeksI
dalam 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 booleani[n?≢i← ... ]
pilih n dari mereka secara acak (tidak ada duplikat)n⊣¨¨@(⊢≡¨⌽)
ubah yang sentral menjadin n
⍵@( ... )⊢ ...
letakkan karakter dari argumen pada indeks yang diberikan dalam matriks spasisumber
JavaScript (ES6), 211
216 220Edit 1 byte yang disimpan thx @ usandfriends
Uji
sumber
g.map(r=>r.join``)...
new Date()%h-l
sebagai gantiMath.random()*h-l|0
. Menghemat byte.Rubi,
211207203196 karakterBerkat edc65 untuk 4 karakter
Penjelasan:
->(x){...}
mendefinisikan fungsi anonim yang mengambil argumenx
x=x.chars
mengubahx
dari string menjadi array string satu karaktero,b,c=x.size
simpan panjang inputo
untuk digunakan nanti.b
danc
hanya 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,' '}
membuatl
xl
2D 2D array karakter ruang.a[o][o]=x.delete_at o/2
set pusat array ke pusat nilaix
(input), sambil menghapus nilai itu darix
... while x[0]
jalankan blok (dalam hal ini, kode sebelumnyawhile
karena inline) berulang-ulang sampaix
kosong. Di ruby, mengakses indeks yang tidak ada mengembalikannil
, yang merupakan nilai falsey.a[b=rand(l)][c=rand(l)]==' '
Tetapkanb
danc
untuk nilai acak di mana 0 <= n <l
. Kemudian periksa apakah tempat dib
,c
kosong (alias disetel ke karakter spasi)(b-o)**2+(c-o)**2<=o*o
Periksa jarak Pythagoras.o
adalah panjang input.**
adalah operator eksponensial Ruby, danval<=o*o
lebih pendek darival**0.5<=o
.a[b][c]=x.pop
hapus nilai terakhir darix
. Atur posisia
,b
ke 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 arraya
ke versi single-string sendiri (mis.['a','b','c']
->'abc'
). Ambil array baru itu dan bergabunglah dengan baris baru. Pengembalian tersirat.sumber
Python 3 , 286 byte
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. Thecenter()
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 kamio
. Karakter muncul dari sampel puing-puing kami sehingga hanya muncul sekali.if c[1]==l:o+="\n"
- Menambahkan jeda baris juga. Kembalisumber