Buat kelelawar ASCII terbang di sekitar bulan ASCII


34

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.


Terima kasih @liver. Saya lupa menghapusnya setelah Sandbox.
ElPedro

@daHugLenny Terima kasih telah menambahkan tag. Saya belum memikirkan yang itu.
ElPedro

6
Jika Anda berpikir bahwa implementasi referensi benar-benar tidak disukai, saya tidak pernah ingin bekerja dengan Anda pada proyek pemrograman apa pun.
Dana Gugatan Monica

3
Nah, mungkin sedikit
golf

Jawaban:


9

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:

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+
Sets counters for creation of the m's and spaces
[<]>[[<+>>-[>]+[[<]>+[>]<+[<]>>>-]<<[->>+<<]>-]>-[->>>>+<<<<]>++]
Adds the first counter plus two of the character at the second counter to the end of the
current set of cells removes the first two counters on the list then repeats until
it encounters a 254
>>>[[-]<]>>>>[>]>>+>+++++++<<<<[<]
Removes some excess cells then adds a 7 after the end of the set of cells
+<+<<+[[<]++++[>++++<-]>[<+[>]>[-<+>]<[<]>>-]>[>]++++++++++[>]>>>-[<]<<[<]<]
Adds a newline every 16 characters until 7 newlines are added
<[<]>->-<<<[-]++++++<+<+++[>++++++<-]+<++++[>++++++++<-]---<-[>+<-----]++<----[>+<----]--<-[>+<---]<-[>++<-----]++++<-[>+<---]++<-[>+<-------]---<----[>+<----]<--[>+<++++++]<+++++[>+++++<-]++++++
Removes some excess cells then sets indices for the locations of bats
>[[[>]>[>]>>[-<<+>>]<<[<]<[<]>-]>[>]>[>]+++++++[>+++++++++<-]>-[->+>+>+<<<]++++[>>++++<<-]>>+<<<<[<]>[.>]>>[.>]<[<]>[-]>[-]>[-]<+[--<---[->]<]<[->+>+>+<<<]<<[[->>+<<]<]<]
Loops through the indices replacing the spaces at each index with a bat then printing 
the set of cells then changing the bat back to spaces

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.


2
Sangat bagus! Saya tidak berpikir saya akan memiliki kesabaran untuk menjawab tantangan sebesar ini di brainfuck, haha.
DJMcMayhem

1
Menambahkan tautan TIO, harap Anda tidak keberatan. Saya juga menghitung 693 byte.
Emigna

Tidak terbaca karena mudah dibaca masih akan memenangkan hadiah pertama karena tidak dapat dibaca :) Total rasa hormat untuk benar-benar melakukannya dalam bahasa yang gila. Sangat baik dan terima kasih atas jawabannya. +1. Layak 690 byte dari waktu siapa pun.
ElPedro

@ Enigma Dari saya, terima kasih atas tautan TIO.
ElPedro

@DJMcMayhem, saya pasti telah mengacaukan copy / paste, ada duplikat [<] dalam bentuk ungolfed yang seharusnya hanya ada sekali. Harus diperbaiki sekarang.
Oyarsa

23

05AB1E , 69 62 60 byte

Disimpan 2 byte berkat Adnan .

3ð×…^o^)U13FNV0379730vð5y>;ï-y_+×N(Y-12%_Xè'my×NY-12%_y&XèJ,

Cobalah online!

Penjelasan

3ð×…^o^)Umenyimpan daftar [" ","^o^"]dalam X untuk digunakan nanti.

13FNVloop selama 13 tahap [0 .. 12] dan toko indeks iterasi saat ini di Y .

0379730vloop di atas baris setiap tahap, di
mana 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 == 0benar kita tambahkan kelelawar, kalau tidak 3 spasi.
Ungkapan ini ( N(Y-12%_Xè) akan menempatkan kelelawar secara bertahap 0,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!=0benar, 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, .


5
Melakukan persis seperti yang tertulis di kaleng +1
ElPedro

1
3ð×…^o^)bukannya " ^o^"2äharus menyimpan dua byte.
Adnan

@ Adnan: Terima kasih! Untuk beberapa alasan saya berasumsi akan lebih lama dan bahkan tidak pernah mencoba 3ð×.
Emigna

20

JavaScript (ES6), 109 144 140 138 byte

f=(k=13,b=y=>(y-k)%12?'   ':'^o^')=>k--?[0,3,7,9,7,3,0].map((n,y)=>' '.repeat(5-n/2+!n)+b(y)+'m'.repeat(n)+b(n?-y:.1)).join`
`+`
`+f(k):''

console.log(f());

Versi animasi


jawaban yang bagus dan Anda adalah yang pertama pada tantangan terakhir saya :)
ElPedro

1
Jawaban bagus. Aku tidak bisa membungkukkan kepalaku berpikir seperti ini.
zfrisch

15

HTML + JS, 153 149 byte

n=setInterval(_=>o.innerText=`zzd
zc3e
 b7f
a9g
 l7h
zk3i
zzj`.replace(/\S/g,c=>parseInt(c,36)-n%12-10?`m`.repeat(c)||`   `:`^o^`,n++),1e3)
<pre id=o>

Sunting: Menyimpan banyak byte berkat @RickHitchcock. Versi membosankan yang baru saja mengembalikan 13 string multiline dalam sebuah array adalah 132 131 byte:

_=>[...Array(13)].map((_,n)=>`zza
zl3b
 k7c
j9d
 i7e
zh3f
zzg`.replace(/\S/g,c=>parseInt(c,36)-n%12-10?`m`.repeat(c)||`   `:`^o^`))

Jika saya benar-benar ketat saya akan menunjukkan bahwa kelelawar tidak mulai di atas :) Tapi kemudian melakukan lingkaran penuh dan tergantung pada pendapat selesai di atas yang merupakan semua yang saya tentukan dalam aturan. +1 untuk animasi penuh pertama. Kerja bagus dan terima kasih.
ElPedro

@ ElPedro Saya pikir tempat di mana kelelawar mulai tergantung pada hasil setInterval, yang selalu sama di browser saya, tetapi dapat bervariasi untuk browser lain.
Neil

OK, tapi seperti yang saya katakan posisi awal tidak ditentukan dengan jelas jadi saya boleh membiarkan setInterval memutuskan;) Saya melihat dengan Chome di Ubuntu jika itu yang menarik. Selalu mulai satu posisi sebelum atas tetapi itu tidak masalah. Solusi hebat dan terima kasih lagi atas jawaban Anda ..
ElPedro

1
Anda dapat menyimpan beberapa byte dengan menggunakan innerHTMLalih-alih textContent. Dan byte lain dengan mengubah repeat(+c)ke repeat(c).
Rick Hitchcock

2
(Dan 1000dapat menjadi 1e3.)
Rick Hitchcock

14

Jelly , 76 69 58 byte

⁾ mṁ11ż“椿¬®µ‘ŒḄ¤Œṙs⁴Y
_4¢ḣ;“^o^”;¢ṫ⁸¤
“½œ0CSbp\I7'ð½‘Ç€Y

TryItOnline

Bagaimana?

⁾ mṁ11ż“椿¬®µ‘ŒḄ¤Œṙs⁴Y - Link 1, make a moon (niladic)
⁾ m                     - literal " m"
   ṁ                    - reshape like
    11                  - 11 (interpreted as range(11)) -> " m m m m m "
                 ¤      - nilad followed by links as a nilad
       “椿¬®µ‘         - code page indexes [22,3,11,7,8,9]
               ŒḄ       - bounce -> [22,3,11,7,8,9,8,7,11,3,22]
      ż                 - zip -> [[22,' '],[3,'m'],[11,' '],...]
                  Œṙ    - run length decode -> "                      mmm           mmmmmmm        mmmmmmmmm        mmmmmmm           mmm                      "
                    s   - split into chunks of length
                     ⁴  - l6
                      Y - join with line feeds

_4¢ḣ;“^o^”;¢ṫ⁸¤ - Link 2, a moon with a bat placed: endIndex
_4              - subtract 4 (startIndex)
  ¢              - call last link (1) as a nilad
   ḣ            - ḣead to startIndex
    ;           - concatenate
     “^o^”      - literal "^o^"
          ;     - concatenate
              ¤ - nilad followed by links as a nilad
           ¢    - call last link (1) as a nilad
            ṫ⁸  - tail from endIndex

“½œ0CSbp\I7'ð½‘Ç€Y - Main link (niladic)
“½œ0CSbp\I7'𽑠   - code page indexes [10,30,48,67,83,98,112,92,73,55,39,24,10]
                   -    indices to the right of each bat in a constructed moon
               ǀ  - call last link (2) as a monad for each
                 Y - join on line feeds

Sangat bagus. Kupikir aku harus melihat Jelly sedikit lebih dekat.
ElPedro

Penjelasan yang bagus. Terima kasih.
ElPedro

Akan keren untuk melihat bagaimana Anda mendekati ini dengan Python juga jika Anda tertarik dan punya waktu. Saya selalu senang belajar.
ElPedro

12

Python 2, 146 144 138 byte

-2 byte terima kasih kepada @Willem (gunakan variabel cdaripada perulangan melalui a map)

m='\n'.join(int(a)*' '+int(b)*'m'+3*' 'for a,b in zip('6643466','0379730'))
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])

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 zipmembongkar karakter ini ke dalam adan bdan membuat bulan di langit m,, dengan 3 spasi di setiap baris.

Baris terakhir kemudian melintasi posisi kelelawar di dalam bulan, dan secara efektif:

for c in(9,22,36,53,68,81,91,75,58,41,27,16,9):print(m[:c-3]+'^o^'+m[c:])

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' ", dan c=ord(b)-23digunakan untuk mengekstraksi nilai.


Hormati +1 dan terima kasih telah naik ke tantangan :) Sekarang saya hanya perlu
memikirkan

Kadang-kadang saya berharap saya bisa memberikan 2 suara.
ElPedro

1
Anda dapat menyimpan dua karakter pada baris terakhir dengan menuliskannya seperti ini:for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Willem

7

Autovim , 85 81 byte

Tidak ada animasi, mungkin masih golf ... Tetap saja, tidak buruk untuk anak baru di blok! (autovim)

ñ9am␛ÿP2xÿP4xyjGpđp2o
%ce 15
®q=8j$p
®z=6␍"_d3hP
ñğyG12PğÿPC^o^␛v^y6@q==o␛6@z==O

Untuk menjalankannya:

autovim run ascii-bat.autovim -ni

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.

" Draw the moon
ñ                                 " Normal mode
 9am␛                            " Write 9 `m`
      ÿP                          " Duplicate the line
        2x                        " Delete two characters
          ÿP                      " Duplicate the line
            4x                    " Delete 4 characters
              yj                  " Yank two lines
                Gp                " Paste at the end of the file
                  đp              " inverts the current line with the previous
                    2o            " Add two line breaks

%ce 15                            " Center our moon

" Macros
®q=8j$p                           " Macro `q` jumps 8 lines, and pastes
                                  "   at the end
®z=6␍"_d3hP                      " Macro `z` jumps 6 lines and replaces
                                  "   the previous 3 characters by the default

" Draw all 12 moons and add the bats
                                  "   register's content
ñ                                 " Run in normal mode
 ğyG                              " Copy the moon we just drew
    12P                           " Duplicate the moon 12 times
       ğÿP                        " Duplicate the top line (gets 3 centered `m`)
          C^o^␛                  " Change the mmm by a bat
                v^y               " Copy the bat we just drew
                   6@q            " Add the first 6 bats
                      ==          " Center the bat
                        o␛       " Add a line under the bat
                           6@z    " Add the 6 last bats
                              ==  " Align the last bat in the center
                                O " Add a line over the last moon

1
Saya mengikuti instruksi pengunduhan, menginstal VIM dan berakhir dengan yang berikut: VIM - Vi IMproved 7.4 (2013 10 Agustus, disusun 9 Des 2014 17:36:41) Argumen opsi tidak dikenal: "--not-a-term" Info lebih lanjut dengan: "vim -h" Tidak punya waktu untuk melihatnya sekarang tetapi akan bermain malam ini. Sepertinya proyek yang menarik.
ElPedro

1
Jika Anda punya waktu luang, buka masalah GitHub - ini berfungsi di ponsel saya (Termux, distribusi Linux) serta pada Windows di Git Bash. Saya ingin membuatnya bekerja di mana-mana! Tebakan terbaik saya adalah bahwa VIM yang dikompilasi pada tahun 2013 mungkin benar - benar bukan versi terbaru :) (versi terbaru 8.0)
Christian Rondeau

BAIK. Saya baru saja menginstal dari manajer paket jadi mungkin saya akan mencoba opsi upgrade. Saya akan memberi tahu Anda apa yang terjadi.
ElPedro

1
Masalah yang diangkat pada GitHub seperti yang diminta. Jangan ragu untuk mengabaikan / menolak jika Anda tidak menganggapnya sebagai masalah sejak pemutakhiran menyelesaikannya.
ElPedro

1
Jadi itu artinya berhasil sekarang! Besar!
Christian Rondeau

7

PHP, 167 byte

Saya membuat program kecil di PHP:

<?php foreach([0,3,7,9,7,3,0]as$l)$b.=str_pad(str_repeat('=',$l),15," ",2)."\n";foreach([6,25,43,60,75,89,102,83,65,48,33,19,6]as$x)echo substr_replace($b,'^o^',$x,3);

Ini versi yang lebih verbose:

// width of the moon
$moonsizes = [0,3,7,9,7,3,0];
// position where to place the bat
$positions = [6,25,43,60,75,89,102,83,65,48,33,19,6];
// prepare base moon painting
foreach($moonsizes as $size){
    $basepainting .= str_pad(str_repeat('=',$size),15," ",STR_PAD_BOTH)."\n";
}
// loop frames and place bat
foreach($positions as $position) {
    echo substr_replace($basepainting,'^o^',$position,3);
}

Ini codegolf pertama saya, jika Anda punya saran saya senang mendengar :)


Selamat datang di PPCG! Jawaban pertama yang bagus. Terima kasih.
ElPedro

7

Python 2, 112 byte

b=['   ','^o^']
for k in range(91):r=k%7;print(b[k/7+r==12]*(r%6>0)+(r*(6-r)*8/5-5)*'m'+b[k/7%12==r]).center(15)

Cetak gambarnya. Setiap baris memiliki tiga bagian

  • Kelelawar potensial di sebelah kiri
  • Beberapa angka muntuk bulan
  • Pot kelelawar di sebelah kanan

Bagian-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 kmenghitung dari 0ke 91, (k/7, k%7)pergi

(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(0, 5)
(0, 6)
(1, 0)
(1, 1)
 ....
(12, 5)
(12, 6)

Mengambil nilai pertama k/7untuk 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 baris r=k%7sebagai [0,3,7,9,7,3,0]. Alih-alih mengindeks ke dalam ini, formula lebih pendek. Tingkat kebebasan yang mudah adalah bahwa nilai 0dapat berupa nilai negatif apa pun, karena ini masih memberikan string kosong ketika dikalikan dengan m. 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. Arrayb=[' ','^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,1dalam gambar 7,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 baris 0dan 6- slot kelelawar yang tepat akan menarik kelelawar, dan kami tidak boleh mengacaukan bagian tengahnya.


1
Apakah ada kemungkinan penjelasan singkat @xnor? Saya sudah menjalankannya dan itu pasti bekerja jadi tidak ada penjelasan yang diperlukan tetapi jika Anda punya waktu dan kecenderungan itu akan menarik untuk tujuan pendidikan :)
ElPedro

+1 untuk "Mengotak-atik parabola dan pembagi lantai ..." - jika saya harus menebak, itulah pertama kalinya frasa tersebut digunakan dalam PPCG ... :-)
zmerch

Terima kasih @ xnor. Penjelasan luar biasa. Saya harus meluangkan waktu mempelajari hal ini :)
ElPedro

6

C #, 615 582 337 byte

Ini 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.

void M(){string[]m={"","      mmm","    mmmmmmm","   mmmmmmmmm","    mmmmmmm","      mmm",""};var b="^o^";for(int x=0;x<13;x++){var a=(string[])m.Clone();int n=x>6?12-x:x;int[] j={0,1,3,6};a[n]=!a[n].Contains("m")?"      "+b:x<=n?a[n]+b:new string(' ',j[Math.Abs(9-x)])+b+a[n].Replace(" ","");foreach(var c in a){Console.WriteLine(c);}}}

Tidak digabungkan (termasuk loop!)

class Program {
    public static string[] moon = new string[] { "               ", "      mmm      ", "    mmmmmmm    ", "   mmmmmmmmm   ", "    mmmmmmm    ", "      mmm      ", "               " };

    public static string bat = "^o^";

    static void Main(string[] args) {
        while (true) {
            Fly();
        }
    }

    static void Fly() {
        int times = (moon.Length * 2) - 1;
        for (int x = 0; x < times; x++) {
            string[] temp = (string[])moon.Clone(); //create a new array to maintain the original

            int index = x >= moon.Length ? times - x - 1 : x;

            if (!temp[index].Contains("m")) {
                temp[index] = new string(' ', 6) + bat + new string(' ', 6);
            } else if (x <= index) {
                int lastM = temp[index].LastIndexOf('m') + 1;
                temp[index] = temp[index].Insert(lastM, bat);
            } else {
                int firstM = temp[index].IndexOf('m');
                char[] src = temp[index].ToCharArray();
                int i = firstM - bat.Length;
                src[i] = bat[0];
                src[i + 1] = bat[1];
                src[i + 2] = bat[2];

                temp[index] = new string(src);
            }

            for (int y = 0; y < temp.Length; y++) {
                Console.WriteLine(temp[y]);
            }
            Thread.Sleep(100);
            Console.Clear();
        }            
    }
}

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-alih Main()metode sebelumnya - jadi sekarang, ini perlu dipanggil secara eksternal.


Selamat datang di PPCG! :)
Martin Ender

Selamat datang dan upaya pertama yang menyenangkan! Terima kasih atas jawaban anda. Bukan ac # expert sendiri jadi mungkin tidak bisa banyak membantu Anda, tetapi saya yakin Anda akan menemukan banyak anggota komunitas yang akan dengan senang hati membantu.
ElPedro

2
Anda dapat menyimpan beberapa byte dengan menghapus new string[]dari mdan hanya meletakkan string[]m={...}.
Pokechu22

2
Dapat menyimpan beberapa byte lagi dengan menggunakan var's di tempat-tempat seperti string[]w=(string[])m.Clone();- var w=(strin[])m.Clone();
MX D

1
@ ElPedro Tentu, saya akan menerimanya! Ini tentu berfungsi sebagai fungsi callable yang menghasilkan hasil yang diinginkan. Secara anekdot, saya mencoba menulis ulang ini lagi dan menemukan solusi yang cukup "pintar". Saya sangat menyesal, saya mendapatkan +1 dari hitungan byte saat ini, jadi saya pikir saya akan meninggalkannya di sini - terima kasih untuk tantangan yang sangat menyenangkan! Ini tentu mengajari saya beberapa hal baru.
levelonehuman

6

Python 2, 299 300 290 270 byte

Bermain golf hingga 270 setelah mendapat sedikit pengalaman bermain golf.

Implementasi referensi diturunkan oleh 321 320 330 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.

c,e,n=' ','m','\n';f,g=c*9+e*3+c*9,c*7+e*7+c*7;h=9,12;i=12,15;j=6,9;k=13,17;l=4,7;m=c*21,f,g,c*6+e*9+c*6,g,f,c*21;p=h,i,k,(15,18),k,i,h,j,l,(3,6),l,j,h;w=0
for z in map(int,'0123456543210'):print n.join(m[:z])+n+m[z][:p[w][0]]+'^o^'+m[z][p[w][1]:]+n+n.join(m[z+1:]);w+=1

Cobalah online!


3

Ruby, 164 156 byte

puts Zlib.inflate Base64.decode64 "eNqlkrUVAAEMQvtMcZP9DfLYvzo3qhNSxQ2GVRC1ad29ar1JXaoHbul16Yig+p6BCKqtFBFU+1IE1famoHrX/jZBvN8e8f5tiE94Ib4SBREwNKH5BNJy2QM="

Program yang sangat sederhana. Dapat dikerjakan lebih banyak. Silakan tinggalkan tips di komentar.


Jawaban bagus. Saya saat ini bermain dengan Ruby saat ini karena terlihat jauh lebih sedikit bertele-tele daripada Python dalam hal bermain golf.
ElPedro

3
@ ElPedro Ini hanya teks yang dilucuti dari spasi spasi, dikompresi zlib, dan base64 disandikan. Tidak ada tindakan ajaib Ruby di mana pun.
dkudriavtsev

Masih berpikir pendekatan ini akan jauh lebih berat dengan Python kecuali seseorang ingin membuktikan saya salah (@Jonathan mungkin? :))
ElPedro

Nah, saya lupa memasukkan beberapa perpustakaan dan SE tidak akan membiarkan saya melakukannya. Dapatkah seseorang tolong sertakan base64dan zlibpustaka dengan cara sesingkat mungkin, dan tambahkan mereka ke jumlah byte?
dkudriavtsev

Apakah ada perbedaan antara putsdan say? Saya tidak terbiasa dengan Ruby.
Roman Gräf

2

/// , 205 byte

/*/\/\///B/^o^*9/         
*M/mmm*N/MM*O/   *0/OO*n/

*1/O Nm0
*2/NM0
*3/0M9*4/1O2*7/13n*5/34/0B9570MB0
473O NmBO 
O2731ONMBO
75O NmBO 
3n510MB0n
5130B9n51OBM9n5 BNm0 
3n31B273 BNm0 
O27OBM9470B90M0O
410MO

Cobalah online!

Hanya jika saya tidak membutuhkan banyak ruang tambahan ...


2

Mumps, 223 Bytes

Ini menggunakan InterSystems Cache Mumps - ini memungkinkan kawat gigi di sekitar loop yang membuatnya berguna untuk loop bersarang dalam satu baris.

S X="09121415141209060403040609",R="097679",L="037973",S=-14 F Y=1:1:13 S S=S+2 F C=1:1:7 S F=$E(X,Y*2-1,Y*2),(M,T)="",$P(T," ",21)="" F A=1:1:$E(L,C){S M=M_"m"} S $E(T,$E(R,C))=M S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^" W T,!

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:

S X="09121415141209060403040609",R="097679",L="037973",S=-14 F Y=1:1:13 S S=S+2 H 1 W # F C=1:1:7 S F=$E(X,Y*2-1,Y*2),(M,T)="",$P(T," ",21)="" F A=1:1:$E(L,C){S M=M_"m"} S $E(T,$E(R,C))=M S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^" W T,!

Berikut adalah versi yang tidak dikenali / dijelaskan (dari versi animasi), dengan pernyataan 'do' yang benar dan dot loop:

 S X="09121415141209060403040609"
 S R="097679",L="037973",S=-14              ; Initialize Variablex
 F Y=1:1:13 D                               ; Set up our main loop of 13 cels
 . S S=S+2                                  ; set up secondary counter, for start char.
 . H 1                                      ; halt for 1 second
 . W #                                      ; clear screen
 . F C=1:1:7 D                              ; set up our per-line loop
 . . S F=$E(X,Y*2-1,Y*2)                    ; set F to 2-digit "start of bat"
 . . S (M,T)=""                             ; set our "builder" lines to empty strings
 . . S $P(T," ",21)=""                      ; then reset our main 'line string' to 21 spaces.
 . . F A=1:1:$E(L,C){S M=M_"m"}             ; make our 'moon' text.
 . . S $E(T,$E(R,C))=M                      ; and insert our 'moon' into the empty line
 . . S:C=$S(Y<8:Y,1:Y-S) $E(T,F,F+2)="^o^"  ; find the start character for our 'bat' and insert.
 . . W T,!                                  ; and write the line and a CR/LF.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.