Làm cho một con dơi ASCII bay xung quanh mặt trăng ASCII


34

Lý lịch

Đây là một thử thách liên quan đến Halloween.

Như bạn có thể thấy từ thử thách cuối cùng của tôi, tôi khá thích cái mà tôi gọi là hoạt hình nghệ thuật ascii, đó không chỉ là vẽ một mô hình mà còn vẽ một mô hình tiến triển. Ý tưởng này đã đến với tôi sau khi tôi được yêu cầu một vài năm trước để làm sống động một bài thuyết trình (khá buồn tẻ) bằng cách làm cho những con dơi ascii ngẫu nhiên bay trên màn hình vào ngày Halloween. Không cần phải nói tôi thực sự bắt buộc (tôi đã được trả tiền cho nó) nhưng nó khiến tôi nghĩ rằng có nhiều thứ cho cuộc sống hơn những con dơi ngẫu nhiên. Lấy cảm hứng từ điều này tôi muốn đề xuất thử thách này.

Thử thách

Làm một con dơi bay xung quanh mặt trăng.

Đây là một con dơi:

^o^

Đây là mặt trăng:

     mmm         
   mmmmmmm       
  mmmmmmmmm      
   mmmmmmm       
     mmm     

Bạn phải hiển thị mọi giai đoạn của chuyến bay dơi (xem đầu ra).

Đầu vào

không ai

Đầu ra

      ^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   

Quy tắc

  • Không đọc từ các tập tin hoặc trang web bên ngoài
  • Bạn có thể gửi một chương trình đầy đủ hoặc một chức năng
  • Không gian thêm và / hoặc dòng mới là tốt đối với tôi
  • Sơ hở tiêu chuẩn bị cấm như bình thường
  • Con dơi phải hoàn thành trở lại trên đỉnh của mặt trăng
  • Xin vui lòng xóa màn hình giữa các khung nếu bạn muốn tuy nhiên đây không phải là một yêu cầu. Đầu ra như hình trên là ổn
  • Vì đây là mã golf, người chiến thắng sẽ là câu trả lời với số byte thấp nhất mặc dù mọi câu trả lời đều được chào đón

Mẫu vật

Tham chiếu thực hiện trong Python 2 hoàn toàn vô văn hóa (620 byte nhưng chỉ để chứng minh rằng nó có thể được thực hiện. Có thể chơi golf sau).

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:])

Kết quả

Mặc dù @Jonathan rõ ràng giành chiến thắng về số byte với Jelly, tôi sẽ đánh dấu câu trả lời Brainfuck từ @Oyarsa là câu trả lời được chấp nhận hoàn toàn bởi vì tôi nghĩ rằng bất kỳ ai thực sự có thể làm điều gì đó như thế này bằng ngôn ngữ điên rồ đó đều xứng đáng +15 đại diện phải mất bao nhiêu byte. Đây không phải là vì tôi có bất kỳ vấn đề với ngôn ngữ golf. Xem câu trả lời của tôi cho một câu hỏi liên quan đến vấn đề này trên meta nếu bạn có bất kỳ nghi ngờ nào. Rất cám ơn và tôn trọng tất cả những người đã đóng góp bằng bất cứ ngôn ngữ nào.


Cảm ơn @Oliver. Tôi đã quên loại bỏ nó sau Sandbox.
ElPedro

@daHugLenny Cảm ơn bạn đã thêm thẻ. Tôi đã không nghĩ về điều đó.
ElPedro

6
Nếu bạn nghĩ rằng việc thực hiện tham chiếu là hoàn toàn vô căn cứ, tôi không bao giờ muốn làm việc với bạn trong bất kỳ dự án lập trình nào.
Vụ kiện của Quỹ Monica

3
Chà, có lẽ hơi chơi gôn rồi :-)
ElPedro

Câu trả lời:


9

Brainfuck, 690 byte

Đây là lần đầu tiên tôi chơi golf, vì vậy tôi chắc chắn vẫn còn nhiều chỗ để cải thiện

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+[<]>[[<+>>-[>]+[[<]>+[>]<+[<]>>>-]<<[->>+<<]>-]>-[->>>>+<<<<]>++]>>>[[-]<]>>>>[>]>>+>+++++++<<<<[<]+<+<<+[[<]++++[>++++<-]>[<+[>]>[-<+>]<[<]>>-]>[>]++++++++++[>]>>>-[<]<<[<]<]<[<]>->-<<<[-]++++++<+<+++[>++++++<-]+<++++[>++++++++<-]---<-[>+<-----]++<----[>+<----]--<-[>+<---]<-[>++<-----]++++<-[>+<---]++<-[>+<-------]---<----[>+<----]<--[>+<++++++]<+++++[>+++++<-]++++++>[[[>]>[>]>>[-<<+>>]<<[<]<[<]>-]>[>]>[>]+++++++[>+++++++++<-]>-[->+>+>+<<<]++++[>>++++<<-]>>+<<<<[<]>[.>]>>[.>]<[<]>[-]>[-]>[-]<+[--<---[->]<]<[->+>+>+<<<]<<[[->>+<<]<]<]

Dùng thử trực tuyến

Ungolfed một số cho dễ đọc:

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+
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

Tôi muốn sử dụng thực tế là bằng cách thêm một dòng mới vào đầu, mỗi giai đoạn có thể được đọc theo cả hai hướng để có được hai giai đoạn khác nhau, nhưng tôi không thể tìm ra cách nào tốt để làm như vậy mà không tạo ra sáu giai đoạn rưỡi một lần.


2
Rất đẹp! Tôi không nghĩ rằng tôi có đủ kiên nhẫn để trả lời một thử thách lớn này trong trò chơi trí tuệ, haha.
DJMcMayhem

1
Đã thêm một liên kết TIO, hy vọng bạn không phiền. Ngoài ra, tôi dường như đếm 693 byte.
Emigna

Ungolfed cho khả năng đọc vẫn sẽ giành giải nhất cho sự không thể đọc được :) Hoàn toàn tôn trọng thực sự làm điều đó trong một ngôn ngữ điên rồ như vậy. Rất đẹp và cảm ơn câu trả lời. +1. Cũng đáng giá 690 byte thời gian của bất kỳ ai.
ElPedro

@Enigma Từ tôi, cảm ơn vì liên kết TIO.
ElPedro

@DJMcMayhem, tôi đã nhầm lẫn bản sao / dán, có một bản sao [<] ở dạng không được phép chỉ nên có một lần. Nên sửa ngay.
Oyarsa

23

05AB1E , 69 62 60 byte

Đã lưu 2 byte nhờ Adnan .

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

Hãy thử trực tuyến!

Giải trình

3ð×…^o^)Ulưu trữ danh sách [" ","^o^"]trong X để sử dụng sau.

13FNVvòng qua 13 giai đoạn [0 .. 12] và lưu trữ các chỉ số lần lặp hiện tại trong Y .

0379730vcác vòng lặp trên các hàng của từng giai đoạn,
trong đó N là chỉ số hàng và y là số m hiện tại .

Chúng tôi bắt đầu bằng cách thêm floor(5/(y+1))-(y==0)khoảng trắng vào mỗi hàng với ð5y>;ï-y_+×.

Sau đó chúng tôi xác định xem có phải là một con dơi hoặc 3 chỗ trước m .
Nếu (-N-Y)%12 == 0đúng, chúng ta thêm một con dơi, 3 dấu cách khác.
Biểu thức này ( N(Y-12%_Xè) sẽ đặt dơi trong các giai đoạn 0,6-12.

Sau đó, chúng tôi đặt y m là với 'my×.

Bây giờ chúng tôi xác định xem có nên có một con dơi hay 3 khoảng trắng sau m's không .
NY-12%_y&Xèsẽ đặt một con dơi nếu ((N-Y)%12 == 0) and y!=0là đúng, khác 3 khoảng trắng.
Điều này sẽ đặt những con dơi trên sân khấu 1-5.

Cuối cùng, chúng tôi nối toàn bộ hàng thành một chuỗi và in với một dòng mới : J,.


5
Thực hiện chính xác những gì nó nói trên tin 1
ElPedro

1
3ð×…^o^)thay vì " ^o^"2änên lưu hai byte.
Ad Nam

@Ad Nam: Cảm ơn! Vì một số lý do, tôi chỉ cho rằng nó sẽ dài hơn và thậm chí không bao giờ thử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());

Phiên bản hoạt hình


câu trả lời hay và bạn là người đầu tiên như trong thử thách cuối cùng của tôi :)
ElPedro

1
Câu trả lời tốt đẹp. Tôi không thể quấn đầu suy nghĩ như thế này.
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>

Chỉnh sửa: Đã lưu một loạt byte nhờ @RickHitchcock. Phiên bản nhàm chán chỉ trả về 13 chuỗi đa dòng trong một mảng là 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^`))

Nếu tôi thực sự nghiêm khắc, tôi sẽ chỉ ra rằng con dơi không bắt đầu từ đầu :) Nhưng sau đó nó sẽ hoàn thành vòng tròn và tùy thuộc vào ý kiến ​​kết thúc ở đầu, đó là tất cả những gì tôi quy định trong quy tắc. +1 cho hình ảnh động đầy đủ đầu tiên. Công việc tốt và cảm ơn.
ElPedro

@ElPedro Tôi nghĩ rằng nơi dơi bắt đầu phụ thuộc vào kết quả setInterval, luôn giống nhau trên trình duyệt của tôi, nhưng có thể khác nhau đối với các trình duyệt khác.
Neil

OK, nhưng như tôi đã nói, vị trí bắt đầu không được chỉ định rõ ràng vì vậy tôi đồng ý để setInterval quyết định;) Tôi đang xem với Chome trên Ubuntu nếu không quan tâm. Luôn luôn bắt đầu một vị trí trước khi đứng đầu nhưng điều đó không quan trọng. Giải pháp tuyệt vời và cảm ơn một lần nữa cho câu trả lời của bạn ..
ElPedro

1
Bạn có thể lưu một vài byte bằng cách sử dụng innerHTMLthay vì textContent. Và một byte khác bằng cách thay đổi repeat(+c)thành repeat(c).
Rick Hitchcock

2
(Và 1000có thể trở thành 1e3.)
Rick Hitchcock

14

Thạch , 76 69 58 byte

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

Dùng thử

Làm sao?

⁾ 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

Rất đẹp. Hãy nghĩ rằng tôi sẽ phải nhìn vào Jelly gần hơn một chút.
ElPedro

Giải thích tuyệt vời. Cảm ơn.
ElPedro

Sẽ rất tuyệt để xem cách bạn tiếp cận điều này trong Python cũng như nếu bạn quan tâm và có thời gian. Tôi luôn vui vẻ học hỏi.
ElPedro

12

Python 2, 146 144 138 byte

-2 byte nhờ @Willem (sử dụng biến c thay vì lặp qua 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:])

thay thế

'6643466' là số khoảng trắng trước mặt trăng (với 6 khoảng trống trên dòng đầu tiên và cuối cùng, vì dơi sẽ đến đó).

'0379730' là số 'm' s trong mặt trăng trên mỗi dòng.

Các zipgiải nén các ký tự vào abvà làm cho mặt trăng trên bầu trời,m , với 3 khoảng trống trên mỗi dòng.

Dòng cuối cùng sau đó đi qua vị trí của dơi trong mặt trăng và có hiệu quả:

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

nhưng bộ các vị trí được mã hóa dưới dạng thứ tự của các ký tự có thể in được, với số 23 được thêm vào (vì 9 không thể in được). Điều này đi ra như " -;L[hrbQ@2' ", và c=ord(b)-23được sử dụng để trích xuất các giá trị.


Tôn trọng +1 và cảm ơn vì đã vượt qua thử thách :) Bây giờ tôi chỉ cần tìm ra cách nó hoạt động ...
ElPedro

Đôi khi tôi ước tôi có thể đưa ra 2 upvote.
ElPedro

1
Bạn có thể lưu hai ký tự trên dòng cuối cùng bằng cách viết như sau:for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Willem

7

Tự động , 85 81 byte

Không có hoạt hình, có lẽ vẫn có thể chơi gôn ... Tuy nhiên, không tệ cho đứa trẻ mới vào khối! (tự động)

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

Để chạy nó:

autovim run ascii-bat.autovim -ni

Giải trình

Nói tóm lại, chúng ta vẽ mặt trăng, sao chép và dán nó 12 lần và sử dụng hai macro: một để nối con dơi vào 7 mặt trăng đầu tiên, cái còn lại để thêm vào 6 lần cuối.

" 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
Tôi đã làm theo các hướng dẫn tải xuống, cài đặt VIM và kết thúc với các mục sau: VIM - Vi IMproved 7.4 (2013 ngày 10 tháng 8, biên soạn ngày 9 tháng 12 năm 2014 17:36:41) Đối số tùy chọn không xác định: "- không phải là thuật ngữ" Thông tin thêm với: "vim -h" Không có thời gian để xem nó bây giờ nhưng sẽ có một vở kịch tối nay. Trông giống như một dự án thú vị.
ElPedro

1
Nếu bạn có thời gian rảnh rỗi, hãy mở một vấn đề GitHub - nó hoạt động trên điện thoại của tôi (Termux, bản phân phối Linux) cũng như trên Windows trong Git Bash. Tôi muốn làm cho nó hoạt động ở khắp mọi nơi! Dự đoán tốt nhất của tôi là VIM được biên soạn vào năm 2013 có thể thực sự không phải là phiên bản mới nhất :) (phiên bản mới nhất là 8.0)
Christian Rondeau

ĐƯỢC. Tôi mới cài đặt từ trình quản lý gói nên có thể tôi sẽ thử tùy chọn nâng cấp. Tôi sẽ cho bạn biết những gì xảy ra.
ElPedro

1
Vấn đề được nêu lên trên GitHub theo yêu cầu. Xin vui lòng bỏ qua / từ chối nếu bạn không coi đó là một vấn đề vì bản nâng cấp đã giải quyết nó.
ElPedro

1
Vì vậy, điều đó có nghĩa là nó hoạt động ngay bây giờ! Tuyệt quá!
Christian Rondeau

7

PHP, 167 byte

Tôi đã tạo một chương trình nhỏ trong 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);

Đây là một phiên bản dài dòng hơn:

// 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);
}

Đây là codegolf đầu tiên của tôi, nếu bạn có bất kỳ đề nghị nào tôi rất vui được nghe :)


Chào mừng đến với PPCG! Câu trả lời đầu tiên tốt đẹp. Cảm ơn.
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)

In hình. Mỗi dòng có ba phần

  • Một con dơi tiềm năng ở bên trái
  • Một số số mcho mặt trăng
  • Một con dơi tiềm năng ở bên phải

Các bộ phận này được nối và đặt ở giữa trong một hộp có kích thước 15 để giãn cách. Để tránh những con dơi dịch chuyển trung tâm, một con dơi bị mất là ba khoảng trống, cùng chiều dài. Đối với dơi trên đỉnh hoặc dưới mặt trăng, khe thanh bên trái bị bỏ qua và khe bên phải bị chiếm.

Có 91 dòng: một hình 7 dòng cho mỗi 13 hình. Chúng được tính lên thông qua divmod: Khi kđếm từ 0đến 91, (k/7, k%7)đi

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

Lấy giá trị đầu tiên k/7làm hình ảnh và giá trị thứ hai r=k%7làm số hàng trong ảnh, giá trị này được tính trước tiên bằng hình ảnh, sau đó theo số hàng trong mỗi hình ảnh, cả hai đều được lập chỉ mục 0.

Số lượng mtrong mặt trăng thay đổi theo số hàng r=k%7[0,3,7,9,7,3,0]. Thay vì lập chỉ mục này, một công thức ngắn hơn. Một mức độ tự do thuận tiện là các 0giá trị âm có thể là bất kỳ giá trị âm nào, vì điều này vẫn cho chuỗi trống khi được nhân với m. Đấu tranh với một parabola và phân chia sàn đã đưa ra một công thứcr*(6-r)*8/5-5 .

Bây giờ, chúng tôi xem xét lựa chọn nên vẽ một con dơi hoặc không gian trống ở hai bên. Mảngb=[' ','^o^'] chứa các tùy chọn.

Con dơi ở hàng 0 trên hình 0 (trên cùng), ở hàng 1 trong hình 1 (bên phải), trên hàng 6 trong hình 6 (trên cùng). Vì vậy, thật dễ dàng để kiểm tra xem nó có xuất hiện dưới dạng hàng và số hình ảnh như nhau không,k/7==r . Nhưng chúng ta cũng cần ảnh 12 để trông giống như ảnh 0, vì vậy chúng ta lấy số ảnh modulo 12 trước.

Ở bên trái nó tương tự. Con dơi xuất hiện bên trái trong hàng r=5,4,3,2,1trong hình ảnh 7,8,9,10,11. Vì vậy, chúng tôi kiểm tra xem hàng và số hình có tổng bằng 12. Chúng tôi cũng đảm bảo không vẽ gì ngoài ba khoảng trắng trên các hàng 06- khe dơi bên phải sẽ vẽ con dơi, và chúng tôi không được làm rối định tâm của nó.


1
Bất kỳ cơ hội giải thích nhanh @xnor? Tôi đã chạy nó và nó chắc chắn hoạt động nên không cần giải thích nhưng nếu bạn có thời gian và thiên hướng thì sẽ rất thú vị cho mục đích giáo dục :)
ElPedro

+1 cho "Đấu tranh với parabola và chia sàn ..." - nếu tôi phải đoán, đó là lần đầu tiên cụm từ đó được sử dụng trong PPCG ... :-)
zmerch

Cảm ơn @xnor. Giải thích tuyệt vời. Tôi sẽ phải dành một chút thời gian để nghiên cứu về điều này :)
ElPedro

6

C #, 615 582 337 byte

Đây là lần thử đầu tiên (vẫn còn quá dễ đọc) của tôi tại một trong số này, vì vậy tôi sẵn sàng hoan nghênh mọi đề xuất để loại bỏ vài trăm byte! Đầu danh sách của tôi ngay bây giờ là một cách ngắn hơn để tạo mảng mặt trăng.

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);}}}

Ungolfed (bao gồm cả vòng lặp!)

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();
        }            
    }
}

Chỉnh sửa:

Lấy ra 21 byte bằng cách xóa các dấu cách trong khai báo mảng. Thay vì lưới rộng 15 ký tự, mỗi hàng chỉ đủ rộng để dơi vừa vặn. Đã xóa 12 khác cho chuỗi không cần thiết [] args trong Main()khai báo.

Chỉnh sửa 2:

Viết lại hầu hết logic, lấy ra 245 byte! Bao gồm những thay đổi được đề xuất từ ​​các ý kiến. Cảm ơn!

Từ các ý kiến, biến điều này thành một chức năng M()thay vì Main()phương thức trước đây - vì vậy bây giờ, điều này cần phải được gọi ra bên ngoài.


Chào mừng đến với PPCG! :)
Martin Ender

Chào mừng và nỗ lực đầu tiên tốt đẹp! Cảm ơn câu trả lời của bạn. Bản thân tôi không phải là chuyên gia ac # nên có lẽ không thể giúp bạn nhiều nhưng tôi chắc chắn bạn sẽ tìm thấy nhiều thành viên cộng đồng sẽ sẵn lòng giúp đỡ.
ElPedro

2
Bạn có thể lưu một vài byte bằng cách loại bỏ new string[]từ mvà chỉ cần đặt string[]m={...}.
Pokechu22

2
Có thể an toàn thêm một vài byte bằng cách sử dụng varcác vị trí như string[]w=(string[])m.Clone();- var w=(strin[])m.Clone();
MX D

1
@ElPedro Chắc chắn, tôi sẽ lấy nó! Nó chắc chắn hoạt động như một chức năng có thể gọi được tạo ra kết quả mong muốn. Thông thường, tôi đã thử viết lại điều này một lần nữa và tìm thấy một giải pháp khá "thông minh". Vì quá lo lắng, tôi đã kết thúc +1 từ số byte hiện tại, vì vậy tôi nghĩ rằng tôi sẽ để nó ở đây - cảm ơn vì một thử thách thực sự thú vị! Điều này chắc chắn đã dạy tôi một số điều mới.
levelonehuman

6

Python 2, 299 300 290 270 byte

Chơi golf xuống 270 đã có thêm một chút kinh nghiệm chơi gôn.

Thực hiện tham chiếu golfed giảm 321 320 330 byte. Không xinh hay thanh lịch. Chỉ cần sử dụng chuỗi lực lượng vũ phu và danh sách cắt. Thật thú vị khi đếm ngược byte mặc dù tôi nghĩ rằng cách tiếp cận hoàn toàn sai khi bắt đầu với một đối thủ cạnh tranh nghiêm trọng.

Tôi không mong đợi câu trả lời này được thực hiện nghiêm túc vì vậy xin vui lòng không downvote. Tôi đã nói trong câu hỏi rằng tôi sẽ cố gắng đánh golf việc thực hiện tham chiếu và điều này chính xác là như vậy. Chỉ cần đăng cho vui.

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

Hãy thử trực tuyến!


3

Ruby, 164 156 byte

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

Chương trình rất đơn giản. Có thể được làm việc trên nhiều hơn. Hãy để lại lời khuyên trong các ý kiến.


Câu trả lời tốt đẹp. Tôi hiện đang chơi với Ruby vào lúc này vì nó trông có vẻ ít dài hơn so với Python khi chơi golf.
ElPedro

3
@ElPedro Đây chỉ là văn bản bị tước khoảng trắng theo sau, được nén zlib và mã hóa base64. Không có phép thuật Ruby hành động ở bất cứ đâu.
dkudriavtsev

Vẫn nghĩ rằng cách tiếp cận này sẽ nặng nề hơn rất nhiều với Python trừ khi ai đó muốn chứng minh tôi sai (có lẽ
@Jonathan

Welp, tôi đã quên bao gồm một số thư viện và SE sẽ không cho phép tôi làm điều đó. Ai đó có thể vui lòng bao gồm base64zlibcác thư viện theo cách ngắn nhất có thể, và thêm chúng vào số byte không?
dkudriavtsev

Có sự khác biệt nào giữa putssaykhông? Tôi không quen thuộc với Ruby.
Roman Gräf


2

Quai bị, 223 byte

Điều này đang sử dụng Quai Bộ nhớ cache của InterSystems - nó cho phép niềng răng xung quanh các vòng lặp, điều này giúp thuận tiện cho các vòng lặp lồng nhau trong một dòng.

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,!

Có thể chơi golf nhiều hơn và tôi có thể chơi với nó khi tôi có nhiều thời gian hơn. Thêm 9 byte nữa và nó sẽ được làm động [[do thêm 'H 1 W #' -> tạm dừng trong một giây và xóa màn hình:

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,!

Đây là phiên bản không được giải thích / giải thích (của phiên bản hoạt hình), với các câu lệnh 'do' chính xác và các vòng lặp chấm:

 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.

Tôi đã thử thực hiện nhạc jazz "nén rồi mã hóa Base-64" để xem điều gì sẽ xảy ra, nhưng chuỗi được mã hóa kết thúc lâu hơn một chút so với chính chương trình! Điều đó và các lệnh gọi hệ thống của Cache để nén và mã hóa base64 khá dài ... ví dụ: đây là lệnh gọi hệ thống để giải mã base64: $ System.Encoding.Base64Decode (STRING)

Phương pháp đó sẽ 'làm mờ' chương trình tới hơn 300 ký tự, tôi nghĩ ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.