Pengantar:
Ketika kita berpikir tentang Ladybugs, kita biasanya memikirkan bug oranye merah atau gelap dengan bintik-bintik hitam. Meskipun ini tidak perlu benar, karena ada juga hitam dengan kepik berbintik merah / oranye , atau kepik tanpa bintik sama sekali , kami terutama membayangkan kepik seperti Asian Ladybug ini:
Hal lain yang perlu diperhatikan adalah bahwa bintik-bintik pada ladybugs hampir selalu simetris. Dan di situlah tantangan ini masuk.
Tantangan:
Diberikan bilangan bulat n
( >= 0
), mengeluarkan kepik seni ASCII berikut ini satu atau beberapa kali, dengan bintik-bintik simetris yang terbagi rata antara kedua sisi, serta dua atau lebih kepik.
Berikut adalah tata letak kepik default:
_V_
/(@I@)\
/ | \
| | |
\ | /
''-!-''
Jika n=0
, kami menampilkan kepik seperti di atas.
Ketika n
lebih besar dari nol, kami mengisi ruang bug ASCII-art dengan huruf kecil o
, atau mengganti |
di tengah dengan modal O
. Tujuannya adalah untuk membuat n
perubahan pada ladybug 'kosong', sambil tetap menghasilkan output simetris (per ladybug), dan menghasilkan sesedikit mungkin ladybug.
Jadi output yang valid untuk n=1
adalah:
_V_
/(@I@)\
/ O \
| | |
\ | /
''-!-''
_V_
/(@I@)\
/ | \
| O |
\ | /
''-!-''
_V_
/(@I@)\
/ | \
| | |
\ O /
''-!-''
Tetapi ini tidak valid:
_V_
/(@I@)\
/ | \
| o | |
\ | /
''-!-''
Output yang valid untuk n=2
adalah:
_V_
/(@I@)\
/ O \
| O |
\ | /
''-!-''
_V_
/(@I@)\
/ O \
| | |
\ O /
''-!-''
_V_
/(@I@)\
/ o|o \
| | |
\ | /
''-!-''
_V_
/(@I@)\
/ | \
| o | o |
\ | /
''-!-''
etc. There are a lot of possible outputs.
Yang pertama n
yang tidak mungkin masuk ke ladybug lagi adalah n=24
. Dalam hal ini Anda harus membaginya secara merata menjadi dua ladybugs (Anda dapat memilih apakah akan mengeluarkannya bersebelahan, atau di bawah satu sama lain - dengan opsional satu spasi atau satu baris baru di antaranya). Sebagai contoh:
_V_ _V_
/(@I@)\ /(@I@)\
/o o|o o\ /o o|o o\
|o o | o o||o o | o o|
\o o|o o/ \o o|o o/
''-!-'' ''-!-''
ATAU:
_V_
/(@I@)\
/ooo|ooo\
| | |
\ooo|ooo/
''-!-''
_V_
/(@I@)\
/ooo|ooo\
| | |
\ooo|ooo/
''-!-''
Aturan tantangan:
n
akan berada dalam kisaran0-1000
.- Anda dapat memilih untuk output ke STDOUT, kembali sebagai String atau array / daftar 2D-char, dll. Panggilan Anda.
- Memimpin baris baru atau ruang putih yang tidak perlu tidak diizinkan. Trailing white-space dan satu trailing new-line diperbolehkan.
- Seperti disebutkan di atas, ketika dua atau lebih ladybugs diperlukan, Anda dapat memilih apakah akan mengeluarkannya di samping satu sama lain atau di bawah satu sama lain (atau gabungan keduanya ..)
- Ketika dua atau lebih kepik dicetak bersebelahan, ruang opsional tunggal di antaranya diperbolehkan. Ketika dua atau lebih kepik dicetak satu sama lain, satu baris baru opsional di antaranya diperbolehkan.
- Anda dapat memilih tata letak kepik pada langkah apa pun selama urutan, selama asimetris dan sama dengan input
n
. - Karena tujuannya adalah untuk memiliki
n
perubahan DAN sesedikit mungkin kepik, Anda akan mulai menggunakan lebih dari satu kepik ketika di atasn=23
. Tata letak kepik ini tidak harus sama. Bahkan, ini bahkan tidak mungkin untuk beberapa input, sepertin=25
ataun=50
untuk menyebutkan dua. - Selain itu, terkadang tidak mungkin untuk membagi titik secara merata di antara dua atau lebih kepik. Dalam hal ini Anda harus membaginya secara merata, dengan paling banyak selisih 1 di antaranya.
Jadi n=50
, mengingat dua aturan terakhir, ini akan menjadi kemungkinan hasil yang valid (di mana bug pertama memiliki 16 tempat, dan dua lainnya memiliki 17):
_V_ _V_ _V_
/(@I@)\ /(@I@)\ /(@I@)\
/oooOooo\ / O \ /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
\ | / \oooOooo/ \o oOo o/
''-!-'' ''-!-'' ''-!-''
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. - Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Juga, silakan tambahkan penjelasan jika perlu.
o
danO
sebagai gantinya. Saya telah mengubah kata-katanya sedikit.n=50
contoh, saya percaya bahwa maksud Anda bug pertama memiliki 16 tempat dan dua lainnya masing-masing memiliki 17.Jawaban:
Arang ,
8481 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukkan jumlah total tempat.
Hitung jumlah kepik yang dibutuhkan.
Ulangi setiap kepik.
Hitung jumlah tempat untuk mengenakan ladybird ini.
Cetak kepala dan sayap kanan kepik.
Jika ada lebih dari 21 titik, cetak dua titik, jika tidak, cetak bagian belakang.
Jika jumlah bercak aneh, cetak tempat lain jika tidak, cetak sisanya.
Bagilah jumlah tempat dengan dua, dan bagikan di antara tiga baris 3, 4, dan 3 tempat.
Pindah ke awal kepik berikutnya.
Refleksikan kanvas ke kiri, pertahankan bagian belakang.
sumber
Python 2 ,
252249238212211213209 byteCobalah online!
sumber
.replace('A','|O'[b%2])
dan menggunakannyac=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"
?[' o','|O'][i>9]
ke' |oO'[i>9::2]
dan menggunakan|
bukan logis atau. Juga beralihfor i in range(11)
keexec
pernyataan yang disimpan 4 byte.for
loop, menghapus variabel yang tidak perlu juga.JavaScript (ES6),
183186 byteMenggunakan formula yang sama dengan jawaban TFeld untuk membagi tempat di antara ladybugs.
Demo
Tampilkan cuplikan kode
sumber
Befunge,
292279 byteCobalah online!
Penjelasan
Seni ASCII untuk ladybug dikodekan dalam string Befunge tunggal, diimbangi oleh 15, untuk memungkinkan 15 karakter yang dapat dicetak pertama dicadangkan untuk keperluan khusus. Dua karakter khusus pertama mewakili baris baru dan
|
karakter, yang keduanya tidak dapat dicetak. Yang ketiga tidak digunakan, karena itu adalah"
, yang tidak dapat digunakan dalam sebuah string. Dua berikutnya mewakili titik-titik besar di tengah. Dan sepuluh sisanya untuk bintik-bintik di sayap.Karakter khusus ini diterjemahkan ke dalam bentuk akhir mereka melalui tabel pencarian, yang ditulis pada bagian pertama dari baris pertama.
Untuk membuatnya lebih mudah dijelaskan, ini adalah kode dengan berbagai bagian komponen yang disorot:
Kita mulai dengan menginisialisasi baris baru dan
|
karakter dalam tabel pencarian, karena ini konstan.Selanjutnya kita membaca di sejumlah tempat dari stdin dan menghitung jumlah kepik yang diperlukan.
Kita kemudian dapat memulai loop luar untuk set bug, menghitung jumlah tempat untuk ladybug berikutnya yang akan dirender.
Untuk setiap ladybug, kami menghitung apakah titik pusat besar perlu ditampilkan (jika
spots%2 == 1
), dan menuliskan nilai yang sesuai ke dalam tabel pencarian.Demikian pula, kami menghitung apakah pasangan tempat besar lainnya perlu ditampilkan (jika
spots/2 > 10
), sekali lagi memperbarui tabel pencarian. Kami juga menghitung tempat tersisa yang diperlukan pada setiap sayap.Bagian terakhir dari inisialisasi tabel pencarian adalah loop yang menghitung titik kecil mana yang perlu ditampilkan. Intinya algoritma itu adalah: jika
(spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10
, maka tempat itu perlu ditampilkan.Selanjutnya kita dorong representasi string yang dikodekan dari ladybug ke stack. Ini pada dasarnya hanya string sederhana, tetapi menjadi sedikit berbelit-belit ketika saya mencoba untuk memerasnya ke dalam celah dalam kode sehingga sumber akan membentuk persegi panjang.
Pada titik ini, kami siap memulai loop keluaran, memproses karakter satu per satu, mengonversi case khusus (bintik, garis putus, dll.) Melalui tabel pencarian yang dibuat sebelumnya.
Akhirnya kami memeriksa apakah kami telah menampilkan semua kepik yang diperlukan, jika tidak, lanjutkan kembali ke awal lingkaran luar.
sumber
Ruby ,
203193190 byteCobalah online!
sumber
{|m|m.
dapat diganti dengan{$&.
;b=(n-1)/23+1
dapat diganti denganb=1+~-n/23
; danx=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}
bisa diganti denganx=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
.%q{XY}
alih-alih'X'+"Y"
pada delapan baris pertama dan beberapa lagi dengan melakukand=n>0?n/(b=1+~-n/23):b=0
alih - alihn>0?d=n/(b=(n-1)/23+1):d=b=0
.