Latar Belakang
Inilah tantangan terkait Halloween.
Seperti yang mungkin telah Anda lihat dari tantangan terakhir saya, saya cukup menyukai apa yang saya sebut sebagai animasi seni ascii, yang tidak hanya menggambar pola tetapi menggambar pola yang berkembang. Ide ini datang kepada saya setelah saya diminta beberapa tahun yang lalu untuk menghidupkan presentasi (agak membosankan) dengan membuat kelelawar ascii acak terbang melintasi layar pada Halloween. Tidak perlu dikatakan bahwa saya wajib (saya dibayar untuk itu) tetapi itu membuat saya berpikir bahwa ada lebih banyak kehidupan daripada kelelawar acak. Terinspirasi oleh ini, saya ingin mengusulkan tantangan ini.
Tantangan
Membuat kelelawar terbang di sekitar bulan.
Inilah kelelawar:
^o^
Inilah bulan:
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Anda harus menunjukkan setiap tahap penerbangan kelelawar (lihat output).
Memasukkan
Tidak ada
Keluaran
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm^o^
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm^o^
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm^o^
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm^o^
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
^o^mmm
mmm
mmmmmmm
mmmmmmmmm
^o^mmmmmmm
mmm
mmm
mmmmmmm
^o^mmmmmmmmm
mmmmmmm
mmm
mmm
^o^mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Aturan
- Tidak membaca dari file eksternal atau situs web
- Anda dapat mengirimkan program atau fungsi lengkap
- Ruang ekstra dan / atau baris baru tidak masalah bagi saya
- Celah standar dilarang seperti biasa
- Kelelawar harus menyelesaikan kembali di atas bulan
- Jangan ragu untuk menghapus layar di antara bingkai jika Anda ingin namun ini bukan persyaratan. Output seperti yang ditunjukkan di atas baik-baik saja
- Karena ini adalah kode golf, pemenang akan menjadi jawaban dengan jumlah byte terendah meskipun ada jawaban
Mencicipi
Implementasi referensi dalam Python 2 yang sama sekali tidak diubah (hanya 620 byte tetapi hanya untuk membuktikan bahwa itu bisa dilakukan. Semoga golf nanti).
b='^o^'
m=[' ',
' mmm ',
' mmmmmmm ',
' mmmmmmmmm ',
' mmmmmmm ',
' mmm ',
' ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
x=map(str,m[z])
c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
x=map(str,m[z])
c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
Hasil
Walaupun @Jonathan jelas menang dengan byte byte dengan Jelly, saya akan menandai jawaban Brainfuck dari @Oyarsa sebagai jawaban yang diterima murni karena saya pikir siapa pun yang benar-benar dapat melakukan sesuatu seperti ini dalam bahasa yang gila layak +15 perwakilan tidak peduli berapa banyak byte yang dibutuhkan. Ini bukan karena saya punya masalah dengan bahasa golf. Lihat jawaban saya untuk pertanyaan tentang ini pada meta jika Anda memiliki keraguan. Banyak terima kasih dan penghargaan kepada semua yang berkontribusi dalam bahasa apa pun.
Jawaban:
Brainfuck, 690 Bytes
Ini adalah pertama kalinya saya bermain golf, jadi saya yakin masih ada banyak ruang untuk perbaikan
Cobalah online
Tidak dikumpulkan untuk dibaca:
Saya ingin menggunakan fakta bahwa dengan menambahkan baris baru ke awal, setiap tahap dapat dibaca di kedua arah untuk mendapatkan dua tahap yang berbeda, tetapi saya tidak dapat menemukan cara yang baik untuk melakukannya tanpa menghasilkan enam setengah tahap penuh sekaligus.
sumber
05AB1E ,
696260 byteDisimpan 2 byte berkat Adnan .
Cobalah online!
Penjelasan
3ð×…^o^)U
menyimpan daftar[" ","^o^"]
dalam X untuk digunakan nanti.13FNV
loop selama 13 tahap [0 .. 12] dan toko indeks iterasi saat ini di Y .0379730v
loop di atas baris setiap tahap, dimana N adalah indeks baris dan y adalah jumlah m saat ini .
Kami mulai dengan menambahkan
floor(5/(y+1))-(y==0)
spasi ke setiap barisð5y>;ï-y_+×
.Kami kemudian menentukan apakah harus ada kelelawar atau 3 spasi sebelum m .
Jika
(-N-Y)%12 == 0
benar kita tambahkan kelelawar, kalau tidak 3 spasi.Ungkapan ini (
N(Y-12%_Xè
) akan menempatkan kelelawar secara bertahap0,6-12
.Lalu kita tempatkan y m ini dengan
'my×
.Sekarang kita menentukan apakah harus ada kelelawar atau 3 spasi setelah m .
Kode
NY-12%_y&Xè
akan menempatkan kelelawar jika((N-Y)%12 == 0) and y!=0
benar, atau 3 spasi.Ini akan menempatkan kelelawar di atas panggung
1-5
.Akhirnya kami menggabungkan seluruh baris menjadi string dan mencetak dengan baris baru:
J,
.sumber
3ð×…^o^)
bukannya" ^o^"2ä
harus menyimpan dua byte.3ð×
.JavaScript (ES6),
109144140138 byteVersi animasi
Tampilkan cuplikan kode
sumber
HTML + JS,
153149 byteSunting: Menyimpan banyak byte berkat @RickHitchcock. Versi membosankan yang baru saja mengembalikan 13 string multiline dalam sebuah array adalah
132131 byte:sumber
setInterval
, yang selalu sama di browser saya, tetapi dapat bervariasi untuk browser lain.innerHTML
alih-alihtextContent
. Dan byte lain dengan mengubahrepeat(+c)
kerepeat(c)
.1000
dapat menjadi1e3
.)Jelly ,
76 6958 byteTryItOnline
Bagaimana?
sumber
Python 2,
146 144138 byte-2 byte terima kasih kepada @Willem (gunakan variabel
c
daripada perulangan melalui amap
)repl.it
'6643466'
adalah jumlah spasi sebelum bulan (dengan 6 pada baris pertama dan terakhir yang kosong, karena kelelawar akan pergi ke sana).'0379730'
adalah jumlah'm'
s di bulan pada setiap baris.Yang
zip
membongkar karakter ini ke dalama
danb
dan membuat bulan di langitm
,, dengan 3 spasi di setiap baris.Baris terakhir kemudian melintasi posisi kelelawar di dalam bulan, dan secara efektif:
tetapi tupel posisi dikodekan sebagai tata cara karakter yang dapat dicetak, dengan tambahan 23 (karena 9 tidak dapat dicetak). Ini keluar sebagai
" -;L[hrbQ@2' "
, danc=ord(b)-23
digunakan untuk mengekstraksi nilai.sumber
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Autovim ,
8581 byteTidak ada animasi, mungkin masih golf ... Tetap saja, tidak buruk untuk anak baru di blok! (autovim)
Untuk menjalankannya:
Penjelasan
Singkatnya, kita menggambar bulan, menyalin dan menempelnya 12 kali, dan menggunakan dua makro: satu untuk menambahkan kelelawar pada 7 bulan pertama, yang lain untuk menambahkan 6 terakhir.
sumber
PHP, 167 byte
Saya membuat program kecil di PHP:
Ini versi yang lebih verbose:
Ini codegolf pertama saya, jika Anda punya saran saya senang mendengar :)
sumber
Python 2, 112 byte
Cetak gambarnya. Setiap baris memiliki tiga bagian
m
untuk bulanBagian-bagian ini digabungkan dan dipusatkan dalam kotak ukuran 15 untuk penspasian. Untuk menghindari kelelawar yang menggeser bagian tengah, kelelawar yang hilang memiliki tiga ruang, panjang yang sama. Untuk kelelawar di atas atau di bawah bulan, slot bar kiri dihilangkan dan slot kanan ditempati.
Ada 91 baris: gambar 7-baris untuk masing-masing dari 13 gambar. Ini dihitung up melalui divmod: Sebagai
k
menghitung dari0
ke91
,(k/7, k%7)
pergiMengambil nilai pertama
k/7
untuk menjadi gambar dan nilai keduar=k%7
sebagai nomor baris dalam gambar, ini dihitung pertama dengan gambar, lalu dengan nomor baris dalam setiap gambar, keduanya diindeks 0.Jumlah
m
's di bulan berubah dengan nomor barisr=k%7
sebagai[0,3,7,9,7,3,0]
. Alih-alih mengindeks ke dalam ini, formula lebih pendek. Tingkat kebebasan yang mudah adalah bahwa nilai0
dapat berupa nilai negatif apa pun, karena ini masih memberikan string kosong ketika dikalikan denganm
. Mengotak-atik parabola dan membagi lantai memberi formular*(6-r)*8/5-5
.Sekarang, kita melihat memilih apakah akan menggambar kelelawar atau ruang kosong di kedua sisi. Array
b=[' ','^o^']
berisi opsi.Kelelawar di baris 0 di dalam gambar 0 (di atas), di baris 1 di gambar 1 (di sebelah kanan), ke di dalam baris 6 di gambar 6 (di atas). Jadi, mudah untuk memeriksa apakah itu muncul sebagai baris dan nomor gambar sama,
k/7==r
,. Tetapi kita juga membutuhkan gambar 12 agar terlihat seperti gambar 0, jadi kita ambil nomor gambar modulo 12 terlebih dahulu.Di sebelah kiri mirip. Kelelawar muncul di sebelah kiri dalam baris
r=5,4,3,2,1
dalam gambar7,8,9,10,11
. Jadi, kami memeriksa apakah jumlah baris dan gambar menjadi 12. Kami juga memastikan untuk menggambar tidak lebih dari tiga spasi pada baris0
dan6
- slot kelelawar yang tepat akan menarik kelelawar, dan kami tidak boleh mengacaukan bagian tengahnya.sumber
C #,
615582337 byteIni adalah upaya pertama saya (masih terlalu mudah dibaca) pada salah satu dari ini, jadi saya akan dengan senang hati menerima saran untuk memotong beberapa ratus byte! Atas daftar saya sekarang adalah cara yang lebih pendek untuk membuat susunan bulan.
Tidak digabungkan (termasuk loop!)
Edit:
Mengambil 21 byte dengan menghapus spasi di dalam deklarasi array. Alih-alih selebar 15 karakter, masing-masing baris hanya cukup lebar untuk pas. Menghapus 12 lainnya untuk argumen yang tidak perlu [] dalam
Main()
deklarasi.Edit 2:
Menulis ulang sebagian besar logika, mengeluarkan 245 byte! Termasuk perubahan yang disarankan dari komentar. Terima kasih!
Dari komentar, ubah ini menjadi fungsi
M()
alih-alihMain()
metode sebelumnya - jadi sekarang, ini perlu dipanggil secara eksternal.sumber
new string[]
darim
dan hanya meletakkanstring[]m={...}
.var
's di tempat-tempat sepertistring[]w=(string[])m.Clone();
-var w=(strin[])m.Clone();
Python 2,
299300290270 byteBermain golf hingga 270 setelah mendapat sedikit pengalaman bermain golf.
Implementasi referensi diturunkan oleh
321320330 byte. Tidak cantik atau elegan. Cukup gunakan brute force string dan list slicing. Sangat menyenangkan untuk mendapatkan hitungan mundur tapi saya pikir pendekatan itu benar-benar salah untuk memulai dengan pesaing yang serius.Saya tidak berharap jawaban ini ditanggapi dengan serius jadi tolong jangan turunkan suara. Saya memang mengatakan dalam pertanyaan bahwa saya akan mencoba golf implementasi referensi dan ini persis itu. Baru diposkan untuk bersenang-senang.
Cobalah online!
sumber
Ruby,
164156 byteProgram yang sangat sederhana. Dapat dikerjakan lebih banyak. Silakan tinggalkan tips di komentar.
sumber
base64
danzlib
pustaka dengan cara sesingkat mungkin, dan tambahkan mereka ke jumlah byte?puts
dansay
? Saya tidak terbiasa dengan Ruby./// , 205 byte
Cobalah online!
Hanya jika saya tidak membutuhkan banyak ruang tambahan ...
sumber
Mumps, 223 Bytes
Ini menggunakan InterSystems Cache Mumps - ini memungkinkan kawat gigi di sekitar loop yang membuatnya berguna untuk loop bersarang dalam satu baris.
Mungkin bisa bermain golf lebih banyak, dan saya bisa bermain dengan itu ketika saya punya lebih banyak waktu. Tambahkan 9 byte lagi, dan itu akan dianimasikan [[karena penambahan 'H 1 W #' -> yang berhenti sebentar dan membersihkan layar:
Berikut adalah versi yang tidak dikenali / dijelaskan (dari versi animasi), dengan pernyataan 'do' yang benar dan dot loop:
Saya mencoba untuk melakukan "kompres kemudian Base-64 encode" jazz hanya untuk melihat apa yang akan terjadi, tetapi string yang dikodekan berakhir sedikit lebih lama daripada program itu sendiri! Itu, dan panggilan sistem Cache untuk kompresi dan pengkodean base64 cukup panjang ... misalnya, inilah panggilan sistem untuk mendekode base64: $ System.Encryption.Base64Decode (STRING)
Metode itu akan 'mengasapi' program ke lebih dari 300 karakter, saya pikir ...
sumber