Ladybugs simetris

22

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:

masukkan deskripsi gambar di sini

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 nlebih besar dari nol, kami mengisi ruang bug ASCII-art dengan huruf kecil o, atau mengganti |di tengah dengan modal O. Tujuannya adalah untuk membuat nperubahan pada ladybug 'kosong', sambil tetap menghasilkan output simetris (per ladybug), dan menghasilkan sesedikit mungkin ladybug.

Jadi output yang valid untuk n=1adalah:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

Tetapi ini tidak valid:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

Output yang valid untuk n=2adalah:

    _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 nyang 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:

  • nakan berada dalam kisaran 0-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 nperubahan DAN sesedikit mungkin kepik, Anda akan mulai menggunakan lebih dari satu kepik ketika di atas n=23. Tata letak kepik ini tidak harus sama. Bahkan, ini bahkan tidak mungkin untuk beberapa input, seperti n=25atau n=50untuk 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 , 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.
Kevin Cruijssen
sumber
Apa yang Anda maksud dengan "perubahan sesedikit mungkin" pada ladybug kosong? Saat menempatkan n (<24) huruf o / O ke ladybug tunggal, Anda membuat n mengubahnya. Atau maksud Anda perubahan dari n-1 ke n (jadi output bervariasi sesedikit mungkin ketika input berbeda 1)?
Heimdall
@Heimdall Ah maaf atas kebingungan karena kata-kata yang buruk. Ini adalah ketika saya memiliki ide untuk memungkinkan beberapa karakter untuk membentuk satu tempat ketika saya memikirkan tantangan ini, tetapi saya menjatuhkan ini dan hanya digunakan odan Osebagai gantinya. Saya telah mengubah kata-katanya sedikit.
Kevin Cruijssen
Sebagai n=50contoh, saya percaya bahwa maksud Anda bug pertama memiliki 16 tempat dan dua lainnya masing-masing memiliki 17.
Jon Claus
Ini adalah album Jimi Hendrix favorit saya.
Pasang kembali Monica iamnotmaynard
@iamnotmaynard Mungkin saya kehilangan sesuatu yang jelas, atau apakah Anda mengomentari tantangan yang salah? Saya tidak benar-benar melihat hubungan antara Jimi Hendrix dan
ladybugs

Jawaban:

5

Arang , 84 81 byte

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukkan jumlah total tempat.

≔⌈∕∨θ¹¦²³η

Hitung jumlah kepik yang dibutuhkan.

Fη«

Ulangi setiap kepik.

≔⁺÷θη‹ι﹪θηζ

Hitung jumlah tempat untuk mengenakan ladybird ini.

V_¶I@)↘²↙|/←''-↑!

Cetak kepala dan sayap kanan kepik.

↑⎇›ζ²¹OO²

Jika ada lebih dari 21 titik, cetak dua titik, jika tidak, cetak bagian belakang.

§|Oζ

Jika jumlah bercak aneh, cetak tempat lain jika tidak, cetak sisanya.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

Bagilah jumlah tempat dengan dua, dan bagikan di antara tiga baris 3, 4, dan 3 tempat.

↙»

Pindah ke awal kepik berikutnya.

‖B←

Refleksikan kanvas ke kiri, pertahankan bagian belakang.

Neil
sumber
8

Python 2 , 252 249 238 212 211 213 209 byte

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

Cobalah online!

  • Disimpan 9 byte berkat Kevin Cruijssen
  • Disimpan 18 byte berkat Tn. Xcoder
  • Disimpan 2 byte berkat Jonathan Frech
TFeld
sumber
Saya pikir Anda bisa menghapus .replace('A','|O'[b%2])dan menggunakannya c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"?
Kevin Cruijssen
230 byte dengan memutar [' o','|O'][i>9]ke ' |oO'[i>9::2]dan menggunakan |bukan logis atau. Juga beralih for i in range(11)ke execpernyataan yang disimpan 4 byte.
Tn. Xcoder
1
Dan maaf atas kekacauan komentar, tetapi 218 byte dengan mencampurkan pemahaman daftar Anda dengan forloop, menghapus variabel yang tidak perlu juga.
Tn. Xcoder
@ Mr.Xcoder Terima kasih banyak :)
TFeld
Seharusnya menghasilkan kepik sesedikit mungkin, bukan? Ketika saya memasukkan 24 hingga 46 di TIO, ia memberi 3 kepik bukannya dua.
Nick Matteo
7

JavaScript (ES6), 183 186 byte

Menggunakan formula yang sama dengan jawaban TFeld untuk membagi tempat di antara ladybugs.

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

Demo

Arnauld
sumber
6

Befunge, 292 279 byte

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

Cobalah 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:

Kode sumber dengan jalur eksekusi 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.

James Holderness
sumber
Bagus, saya sangat suka pola ladybugs Anda miliki untuk setiap tahap 1-23. Cukup berbeda dari beberapa jawaban lainnya. +1 dari saya. Maukah Anda menambahkan penjelasan (setelah Anda mungkin bermain golf lebih jauh)?
Kevin Cruijssen
1
Saya senang Anda menyukai polanya. Saya sebenarnya menghabiskan cukup banyak waktu untuk mencoba kombinasi yang berbeda untuk menemukan algoritma yang tampak bagus dalam sebanyak mungkin tahapan. Juga menambahkan sedikit penjelasan untuk jawaban saya sekarang.
James Holderness
3

Ruby , 203 193 190 byte

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

Cobalah online!

  • Disimpan 10 byte berkat Jordan
Pasang kembali Monica iamnotmaynard
sumber
{|m|m.dapat diganti dengan {$&.; b=(n-1)/23+1dapat diganti dengan b=1+~-n/23; dan x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}bisa diganti dengan x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordan
Anda dapat menyimpan byte lain dengan menggunakan %q{XY}alih-alih 'X'+"Y"pada delapan baris pertama dan beberapa lagi dengan melakukan d=n>0?n/(b=1+~-n/23):b=0alih - alih n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordan
@ Jordan Wow, terima kasih.
Pasang kembali Monica iamnotmaynard