ทำให้ค้างคาว ASCII บินไปรอบ ๆ ดวงจันทร์ ASCII


34

พื้นหลัง

นี่คือความท้าทายที่เกี่ยวข้องกับวันฮาโลวีน

อย่างที่คุณได้เห็นจากการท้าทายครั้งล่าสุดของฉันฉันชอบสิ่งที่ฉันเรียกว่าภาพเคลื่อนไหว ASCII ซึ่งไม่เพียง แต่วาดรูปแบบ แต่วาดรูปแบบที่ก้าวหน้า ความคิดนี้มาถึงฉันหลังจากที่ฉันถูกขอให้สองสามปีที่ผ่านมาทำให้มีชีวิตชีวาการนำเสนอ (ค่อนข้างน่าเบื่อ) โดยการทำให้ค้างคาว ascii สุ่มบินข้ามหน้าจอในวันฮาโลวีน ไม่จำเป็นต้องพูดว่าฉันจำเป็นต้องจ่ายจริง ๆ (ฉันกำลังจ่ายให้มัน) แต่มันทำให้ฉันคิดว่ามีชีวิตมากกว่าค้างคาวสุ่ม ได้รับแรงบันดาลใจจากสิ่งนี้ฉันขอเสนอความท้าทายนี้

ท้าทาย

ทำให้ค้างคาวบินไปรอบ ๆ ดวงจันทร์

นี่คือค้างคาว:

^o^

นี่คือดวงจันทร์:

     mmm         
   mmmmmmm       
  mmmmmmmmm      
   mmmmmmm       
     mmm     

คุณต้องแสดงทุกขั้นตอนของการบินของค้างคาว (ดูผลลัพธ์)

อินพุต

ไม่มี

เอาท์พุต

      ^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   

กฎระเบียบ

  • ไม่มีการอ่านจากไฟล์หรือเว็บไซต์ภายนอก
  • คุณสามารถส่งโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • ช่องว่างพิเศษและ / หรือการขึ้นบรรทัดใหม่ของฉัน
  • ช่องโหว่มาตรฐานถูกแบนเหมือนปกติ
  • ค้างคาวจะต้องย้อนกลับไปที่ด้านบนของดวงจันทร์
  • โปรดอย่าลังเลที่จะล้างหน้าจอระหว่างเฟรมหากคุณต้องการ แต่นี่ไม่ใช่ข้อกำหนด เอาท์พุทตามที่แสดงข้างต้นเป็นเรื่องปกติ
  • เนื่องจากนี่คือรหัสกอล์ฟผู้ชนะจะได้คำตอบด้วยจำนวนไบต์ต่ำสุดแม้ว่าคำตอบจะยินดี

ตัวอย่าง

การใช้งานอ้างอิงใน Python 2 ที่ไม่ได้รับโทษทั้งหมด (620 ไบต์ แต่เพียงเพื่อพิสูจน์ว่าสามารถทำได้อาจเล่นกอล์ฟในภายหลัง)

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

ผล

แม้ว่า @Jonathan จะชนะด้วยการนับไบต์ด้วย Jelly แต่ฉันจะทำเครื่องหมายคำตอบ Brainfuck จาก @Oyarsa เป็นคำตอบที่ได้รับการยอมรับอย่างหมดจดเพราะฉันคิดว่าทุกคนที่สามารถทำสิ่งนี้ในภาษาที่บ้าจริงควรได้รับตัวแทน +15 ต้องใช้กี่ไบท์ นี่ไม่ใช่เพราะฉันมีปัญหากับภาษากอล์ฟ ดูคำตอบของฉันสำหรับคำถามเกี่ยวกับเรื่องนี้ในเมตาถ้าคุณมีข้อสงสัย ขอบคุณมากและเคารพทุกคนที่มีส่วนร่วมในภาษาใดก็ตาม


ขอบคุณ @Oliver ฉันลืมที่จะลบมันหลังจาก Sandbox
ElPedro

@daHugLenny ขอบคุณที่เพิ่มแท็ก ฉันไม่ได้คิดอย่างนั้น
ElPedro

6
หากคุณคิดว่าการดำเนินการอ้างอิงนั้นไม่ได้รับผลกระทบใด ๆ ฉันไม่ต้องการทำงานกับคุณในโครงการการเขียนโปรแกรมใด ๆ
Nic Hartley

3
เอาละอาจจะเล่นกอล์ฟสักหน่อย :-)
ElPedro

คำตอบ:


9

Brainfuck, 690 ไบต์

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟดังนั้นฉันแน่ใจว่ายังมีพื้นที่เหลือเฟือสำหรับการปรับปรุง

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

ลองออนไลน์

Ungolfed บางอย่างสำหรับการอ่าน:

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

ฉันต้องการใช้ความจริงที่ว่าโดยการเพิ่มบรรทัดใหม่ไปยังจุดเริ่มต้นแต่ละขั้นตอนสามารถอ่านได้ทั้งสองทิศทางเพื่อให้ได้สองขั้นตอนที่แตกต่างกัน แต่ฉันไม่สามารถหาวิธีที่ดีในการทำเช่นนั้นได้โดยไม่ต้องสร้างหกขั้นครึ่ง ในครั้งเดียว.


2
ดีมาก! ฉันไม่คิดว่าฉันจะมีความอดทนที่จะตอบคำถามท้าทายที่ยิ่งใหญ่นี้ใน brainfuck ฮ่าฮ่า
DJMcMayhem

1
เพิ่มลิงค์ TIO หวังว่าคุณจะไม่รังเกียจ นอกจากนี้ฉันดูเหมือนจะนับ 693 ไบต์
Emigna

Ungolfed สำหรับการอ่านจะยังคงได้รับรางวัลที่หนึ่งสำหรับความไม่สามารถอ่านได้ :) การเคารพอย่างเต็มที่สำหรับการทำมันในภาษาที่บ้าคลั่ง ดีมากและขอบคุณสำหรับคำตอบ +1 มีค่าเวลา 690 ไบต์ของทุกคน
ElPedro

@Enigma จากฉันขอบคุณสำหรับลิงก์ TIO
ElPedro

@DJMcMayhem ฉันต้องทำสำเนา / แปะมันมีการทำซ้ำ [<] ในรูปแบบที่ไม่ดีซึ่งควรจะอยู่ที่นั่นเพียงครั้งเดียว ควรได้รับการแก้ไขแล้ว
Oyarsa

23

05AB1E , 69 62 60 ไบต์

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่Adnan

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

ลองออนไลน์!

คำอธิบาย

3ð×…^o^)Uเก็บรายการ[" ","^o^"]ในXเพื่อใช้ในภายหลัง

13FNVลูปมากกว่า 13 ขั้นตอน[0 .. 12]และร้านค้าดัชนีปัจจุบันซ้ำในY

0379730vวนรอบแถวของแต่ละสเตจโดย
ที่Nคือดัชนีแถวและyคือจำนวนของmปัจจุบัน

เราเริ่มต้นด้วยการเพิ่มช่องว่างในแต่ละแถวfloor(5/(y+1))-(y==0)ð5y>;ï-y_+×

จากนั้นเราจะตรวจสอบว่าควรจะมีค้างคาวหรือ 3 ช่องว่างก่อนที่เอ็ม
ถ้า(-N-Y)%12 == 0เป็นจริงเราเพิ่มไม้ตีอีก 3 ช่องว่าง
สำนวนนี้ ( N(Y-12%_Xè) 0,6-12จะวางค้างคาวในขั้นตอน

แล้วเราวางY เอ็ม'my×ด้วย

ตอนนี้เราตรวจสอบว่าควรจะมีค้างคาวหรือ 3 ช่องว่างหลังจากที่เอ็ม
รหัสNY-12%_y&Xèจะวางค้างคาวถ้า((N-Y)%12 == 0) and y!=0เป็นจริงอีก 3 ช่องว่าง นี้จะวางค้างคาวในขั้นตอน
1-5

J,ในที่สุดเราเข้าร่วมทั้งแถวเป็นสตริงและพิมพ์ด้วยบรรทัดใหม่:


5
ทำสิ่งที่พูดบนดีบุก +1 อย่างแน่นอน
ElPedro

1
3ð×…^o^)แทนที่จะ" ^o^"2äควรบันทึกสองไบต์
Adnan

@Adnan: ขอบคุณ! ด้วยเหตุผลบางอย่างฉันแค่คิดว่ามันจะนานขึ้นและไม่เคยลอง3ð×เลย
Emigna

20

JavaScript (ES6), 109 144 140 138 ไบต์

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

เวอร์ชันภาพเคลื่อนไหว


คำตอบที่ดีและคุณจะเป็นคนแรกที่เป็นความท้าทายครั้งสุดท้ายของฉัน :)
ElPedro

1
คำตอบที่ดี ฉันไม่สามารถห่อหัวคิดแบบนี้ได้
zfrisch

15

HTML + JS, 153 149 ไบต์

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>

แก้ไข: บันทึกจำนวนไบต์ด้วย @RickHitchcock รุ่นที่น่าเบื่อที่เพิ่งส่งกลับ 13 สตริงหลายสายในอาร์เรย์คือ132 131 ไบต์:

_=>[...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^`))

ถ้าฉันเข้มงวดจริง ๆ ฉันจะชี้ให้เห็นว่าค้างคาวไม่ได้เริ่มที่จุดสูงสุด :) แต่จากนั้นมันจะวนเวียนเต็มและขึ้นอยู่กับความเห็นจบที่ด้านบนซึ่งเป็นสิ่งที่ฉันระบุไว้ในกฎ +1 สำหรับอนิเมชั่นเต็มรูปแบบครั้งแรก เป็นงานที่ดีและขอบคุณ
ElPedro

@ElPedro ฉันคิดว่าสถานที่ที่ค้างคาวเริ่มขึ้นอยู่กับผลลัพธ์ของsetIntervalซึ่งมักจะเหมือนกันในเบราว์เซอร์ของฉัน แต่อาจแตกต่างกันไปสำหรับเบราว์เซอร์อื่น
Neil

ตกลง แต่อย่างที่ฉันบอกว่าตำแหน่งเริ่มต้นไม่ได้ระบุไว้อย่างชัดเจนดังนั้นฉันจึงตกลงให้ setInterval เป็นผู้ตัดสินใจ;) ฉันกำลังดู Chome บน Ubuntu ถ้าพวกเขาสนใจ เริ่มหนึ่งตำแหน่งก่อนหน้าเสมอ แต่ไม่สำคัญ ทางออกที่ดีและขอบคุณอีกครั้งสำหรับคำตอบของคุณ ..
ElPedro

1
คุณสามารถบันทึกไบต์คู่โดยใช้แทนinnerHTML textContentและไบต์อื่นโดยการเปลี่ยนไปrepeat(+c) repeat(c)
Rick Hitchcock

2
(และ1000สามารถเป็น1e3ได้)
Rick Hitchcock

14

เยลลี่ , 76 69 58 ไบต์

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

TryItOnline

อย่างไร?

⁾ 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

ดีมาก. คิดว่าฉันจะต้องมองเข้าไปใกล้เยลลี่นิดหน่อย
ElPedro

คำอธิบายที่ดี ขอบคุณ
ElPedro

คงจะเจ๋งมากที่เห็นว่าคุณเข้าใกล้เรื่องนี้อย่างไรใน Python เช่นกันหากคุณสนใจและมีเวลา ฉันมีความสุขเสมอที่จะเรียนรู้
ElPedro

12

Python 2, 146 144 138 ไบต์

-2 ไบต์ต้องขอบคุณ @Willem (ใช้ตัวแปรcแทนการวนซ้ำผ่าน 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' คือจำนวนช่องว่างก่อนดวงจันทร์ (มี 6 บนบรรทัดแรกและบรรทัดสุดท้ายที่ว่างเนื่องจากค้างคาวจะไปที่นั่น)

'0379730'คือจำนวน'm's ในดวงจันทร์ของแต่ละบรรทัด

zipunpacks ตัวละครเหล่านี้เข้าไปในaและbและทำให้ดวงจันทร์ในท้องฟ้าmมี 3 ช่องว่างต่อท้ายในแต่ละบรรทัด

บรรทัดสุดท้ายจากนั้นข้ามตำแหน่งของค้างคาวภายในดวงจันทร์และมีประสิทธิภาพ:

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

แต่ tuple ของตำแหน่งจะถูกเข้ารหัสเป็นเลขลำดับของอักขระที่พิมพ์ได้โดยมี 23 เพิ่ม (ตั้งแต่ 9 ไม่สามารถพิมพ์ได้) สิ่งนี้ออกมาเป็น" -;L[hrbQ@2' "และc=ord(b)-23ถูกใช้เพื่อแยกค่า


เคารพ +1 และขอบคุณสำหรับความท้าทายที่เพิ่มขึ้น :) ตอนนี้ฉันแค่ต้องคิดออกว่ามันทำงานอย่างไร ...
ElPedro

บางครั้งฉันหวังว่าฉันจะให้ upvotes 2
ElPedro

1
คุณสามารถบันทึกสองตัวอักษรในบรรทัดสุดท้ายโดยการเขียนเช่นนี้for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
วิลเล็ม

7

Autovim , 85 81 ไบต์

ไม่มีภาพเคลื่อนไหวอาจจะยังเล่นได้ ... แต่ก็ไม่เลวสำหรับเด็กใหม่ในบล็อก! (autovim)

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

วิธีเรียกใช้:

autovim run ascii-bat.autovim -ni

คำอธิบาย

ในระยะสั้นเราวาดดวงจันทร์คัดลอกและวาง 12 ครั้งและใช้มาโครสองอัน: อันหนึ่งต่อท้ายค้างคาวบนดวงจันทร์ 7 ดวงแรกอีกอันเพื่อเติม 6 ครั้งสุดท้าย

" 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
ฉันทำตามคำแนะนำในการดาวน์โหลดติดตั้ง VIM และจบลงด้วยสิ่งต่อไปนี้: VIM - Vi IMproved 7.4 (2013 10 ส.ค. รวบรวม 9 ธ.ค. 2014 17:36:41) อาร์กิวเมนต์ตัวเลือกที่ไม่รู้จัก: "- คำต่อคำ" ข้อมูลเพิ่มเติม ด้วย: "vim -h" ยังไม่มีเวลาดูตอนนี้ แต่จะมีการเล่นในเย็นวันนี้ ดูเหมือนว่าโครงการที่น่าสนใจ
ElPedro

1
หากคุณมีเวลาว่างให้เปิดปัญหา GitHub - มันใช้งานได้บนโทรศัพท์ของฉัน (Termux, Linux distribution) เช่นเดียวกับ Windows ใน Git Bash ฉันชอบที่จะทำให้มันทำงานได้ทุกที่! เดาที่ดีที่สุดของฉันคือว่าเป็นกลุ่มที่รวบรวมในปี 2013 อาจจริงๆไม่เป็นรุ่นล่าสุด :) (รุ่นล่าสุดคือ 8.0)
คริสเตียนบทกวี

ตกลง. ฉันเพิ่งติดตั้งจากผู้จัดการแพ็คเกจดังนั้นบางทีฉันอาจลองใช้ตัวเลือกการอัปเกรด ฉันจะให้คุณรู้ว่าเกิดอะไรขึ้น
ElPedro

1
เกิดปัญหากับ GitHub ตามที่ร้องขอ โปรดอย่าสนใจ / ปฏิเสธหากคุณไม่พิจารณาว่าเป็นปัญหาเนื่องจากการอัปเกรดแก้ไขปัญหา
ElPedro

1
นั่นหมายความว่ามันใช้งานได้ในขณะนี้! ที่ดี!
Christian Rondeau

7

PHP, 167 ไบต์

ฉันทำโปรแกรมเล็ก ๆ ใน 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);

นี่เป็นเวอร์ชั่นที่ละเอียดมากขึ้น:

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

นี่คือ codegolf แรกของฉันหากคุณมีข้อเสนอแนะใด ๆ ฉันยินดีที่จะได้ยิน :)


ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี ขอบคุณ
ElPedro

7

Python 2, 112 ไบต์

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)

พิมพ์รูปภาพ แต่ละบรรทัดมีสามส่วน

  • ค้างคาวที่มีศักยภาพทางด้านซ้าย
  • จำนวนของmดวงจันทร์
  • ค้างคาวที่มีศักยภาพทางด้านขวา

ชิ้นส่วนเหล่านี้ถูกตัดแบ่งและจัดกึ่งกลางในกล่องขนาด 15 เพื่อเว้นระยะ เพื่อไม่ให้ค้างคาวขยับจุดศูนย์กลางค้างคาวที่ขาดหายไปคือช่องว่างสามช่องความยาวเท่ากัน สำหรับค้างคาวที่อยู่ด้านบนหรือด้านล่างของดวงจันทร์ช่องบาร์ด้านซ้ายจะถูกตัดออกและช่องด้านขวานั้นจะถูกครอบครอง

มี 91 เส้น: ภาพ 7 เส้นสำหรับแต่ละ 13 ภาพ สิ่งเหล่านี้ถูกนับผ่าน divmod: kนับจาก0ถึง91เป็น(k/7, k%7)ไป

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

การใช้ค่าแรกk/7เป็นรูปภาพและค่าที่สองr=k%7เป็นหมายเลขแถวภายในรูปภาพการนับครั้งแรกโดยรูปภาพจากนั้นตามด้วยหมายเลขแถวภายในแต่ละรูปภาพทั้งดัชนี 0

จำนวนm's ในการเปลี่ยนแปลงดวงจันทร์ที่มีจำนวนแถวเป็นr=k%7 [0,3,7,9,7,3,0]แทนที่จะทำดัชนีลงในสูตรนี้สูตรก็จะสั้นลง ระดับความสะดวกสบายของเสรีภาพคือการที่0's สามารถเป็นค่าเชิงลบใด ๆ mเช่นนี้ยังคงให้สตริงว่างเมื่อคูณด้วย r*(6-r)*8/5-5เล่นซอกับรูปโค้งและพื้นแบ่งให้สูตร

ตอนนี้เรามาดูการเลือกว่าจะวาดแบ็ตหรือเปล่าที่ว่างทั้งสองข้าง อาร์เรย์b=[' ','^o^']มีตัวเลือก

ค้างคาวในแถว 0 ในรูปภาพ 0 (ด้านบน), ในแถว 1 ในรูปภาพ 1 (ด้านขวา), ไปยังในแถว 6 ในรูปภาพ 6 (ด้านบน) ดังนั้นจึงง่ายที่จะตรวจสอบว่ามันปรากฏเป็นหมายเลขแถวและรูปภาพเท่ากันหรือk/7==rไม่ แต่เราต้องการรูปที่ 12 เพื่อให้มีลักษณะเหมือนรูปที่ 0 ดังนั้นเราจึงใช้หมายเลขรูปภาพโมดูโล 12 ก่อน

ด้านซ้ายมันคล้ายกัน ค้างคาวปรากฏทางด้านซ้ายในแถวในภาพr=5,4,3,2,1 7,8,9,10,11ดังนั้นเราตรวจสอบว่าจำนวนแถวและรูปภาพรวมเป็น 12 หรือไม่นอกจากนี้เราต้องแน่ใจว่าได้วาดอะไรมากกว่าสามช่องว่างในแถว0และ6- ช่องเสียบค้างคาวขวาจะวาดค้างคาวและเราจะต้องไม่ทำให้ศูนย์อยู่


1
มีโอกาสอธิบายอย่างรวดเร็ว @xnor หรือไม่? ฉันใช้มันและมันก็แน่ใจว่ามันไม่จำเป็นต้องมีคำอธิบาย แต่ถ้าคุณมีเวลาและความชอบมันจะน่าสนใจสำหรับจุดประสงค์ทางการศึกษา :)
ElPedro

+1 สำหรับ "เล่นซอกับพาราโบลาและการแบ่งพื้น ... " - ถ้าฉันต้องเดานั่นเป็นครั้งแรกที่วลีนี้ถูกใช้ใน PPCG ... :-)
zmerch

ขอบคุณ @xnor คำอธิบายที่ดีเลิศ ผมจะต้องใช้เวลาในการศึกษานี้ :)
ElPedro

6

C # 615 582 337 ไบต์

นี่เป็นความพยายามครั้งแรกของฉัน (ยังอ่านมากเกินไป) ที่หนึ่งในนี้ดังนั้นฉันยินดีที่จะต้อนรับข้อเสนอแนะใด ๆ ที่จะโกนออกไม่กี่ร้อยไบต์! ด้านบนของรายการของฉันตอนนี้เป็นวิธีที่สั้นกว่าในการสร้างอาร์เรย์ดวงจันทร์

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 (รวมถึงลูป!)

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

แก้ไข:

นำออก 21 ไบต์โดยการลบช่องว่างต่อท้ายในการประกาศอาร์เรย์ แทนที่จะเป็นกริด 15 ตัวกว้างแต่ละแถวจะกว้างพอที่จะให้ค้างคาวพอดี ลบออกอีก 12 สำหรับสตริงที่ไม่จำเป็น [] args ในMain()การประกาศ

แก้ไข 2:

เขียนตรรกะส่วนใหญ่ออกมา 245 bytes! รวมการเปลี่ยนแปลงที่แนะนำจากความคิดเห็น ขอบคุณ!

จากความคิดเห็นเปลี่ยนสิ่งนี้เป็นฟังก์ชั่นM()แทนMain()วิธีการก่อนหน้านี้ดังนั้นตอนนี้สิ่งนี้จะต้องถูกเรียกจากภายนอก


ยินดีต้อนรับสู่ PPCG! :)
Martin Ender

ยินดีต้อนรับและความพยายามครั้งแรกที่ดี! ขอบคุณสำหรับคำตอบ. ไม่ใช่ผู้เชี่ยวชาญ # ด้วยตัวเองดังนั้นอาจช่วยคุณไม่ได้มาก แต่ฉันแน่ใจว่าคุณจะพบสมาชิกชุมชนจำนวนมากที่ยินดีให้ความช่วยเหลือ
ElPedro

2
คุณสามารถบันทึกไม่กี่ไบต์โดยการลบnew string[]จากและเพียงแค่วางm string[]m={...}
Pokechu22

2
สามารถเพิ่มจำนวนไบต์ได้อย่างปลอดภัยโดยใช้var's ในสถานที่เช่นstring[]w=(string[])m.Clone();- var w=(strin[])m.Clone();
MX D

1
@ ElPedro แน่นอนฉันจะเอามัน! มันทำงานเป็นฟังก์ชั่น callable ที่ให้ผลลัพธ์ที่ต้องการ โดยทั่วไปฉันลองเขียนใหม่อีกครั้งและพบวิธีแก้ปัญหาที่ "ฉลาด" สำหรับความผิดหวังของฉันฉันลงเอยด้วย +1 จากจำนวนไบต์ปัจจุบันดังนั้นฉันคิดว่าฉันจะทิ้งมันไว้ที่นี่ - ขอบคุณสำหรับความท้าทายที่สนุกจริงๆ! สิ่งนี้สอนสิ่งใหม่ให้ฉันอย่างแน่นอน
levelonehuman

6

Python 2, 299 300 290 270 ไบต์

กอล์ฟลงมาถึง 270 หลังจากได้รับประสบการณ์การเล่นกอล์ฟเพิ่มขึ้น

การใช้งานอ้างอิงมีขนาด321 320 330 ไบต์ ไม่สวยหรือสง่างาม เพียงใช้สตริงกำลังดุร้ายและการแบ่งส่วนรายการ มันสนุกที่จะได้จำนวนไบต์ที่ลดลง แต่ฉันคิดว่าวิธีการนั้นผิดอย่างสิ้นเชิงในการเริ่มต้นกับคู่แข่งที่จริงจัง

ฉันไม่คาดหวังคำตอบนี้จะต้องดำเนินการอย่างจริงจังดังนั้นโปรดอย่า downvotes ฉันพูดในคำถามที่ว่าฉันจะลองใช้การอ้างอิงและนี่คือสิ่งนั้น โพสต์เพียงเพื่อความสนุกสนาน

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

ลองออนไลน์!


3

Ruby, 164 156 ไบต์

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

โปรแกรมที่ง่ายมาก สามารถทำงานได้มากขึ้น กรุณาทิ้งเคล็ดลับในความคิดเห็น


คำตอบที่ดี ขณะนี้ฉันกำลังเล่นกับ Ruby ในขณะที่มันดู verbose น้อยกว่า Python เมื่อมันมาถึงการเล่นกอล์ฟ
ElPedro

3
@ElPedro นี่เป็นเพียงข้อความที่ลอกออกมาจากช่องว่างต่อท้ายการบีบอัด zlib และการเข้ารหัส base64 ไม่มีเวทย์มนตร์ Ruby ที่ใดก็ได้
dkudriavtsev

ยังคงคิดว่าวิธีการนี้จะหนักกว่ากับ Python ถ้ามีคนต้องการพิสูจน์ว่าฉันผิด (บางที
@Jonathan

ยินดีด้วยฉันลืมที่จะรวมห้องสมุดบางส่วนและ SE จะไม่ให้ฉันทำ ใครช่วยได้โปรดรวมbase64และzlibห้องสมุดในวิธีที่สั้นที่สุดและเพิ่มลงในการนับไบต์?
dkudriavtsev

มีความแตกต่างระหว่างputsและsay? ฉันไม่คุ้นเคยกับรูบี้
Roman Gräf

2

/// , 205 ไบต์

/*/\/\///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

ลองออนไลน์!

เฉพาะในกรณีที่ฉันไม่ต้องการช่องว่างต่อท้ายมากมาย ...


2

คางทูม 223 ไบต์

นี่คือการใช้ InterSystems Cache Mumps - มันอนุญาตให้จัดฟันรอบลูปซึ่งทำให้สะดวกสำหรับลูปซ้อนในบรรทัดเดียว

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

อาจจะเล่นกอล์ฟได้มากขึ้นและฉันอาจเล่นด้วยเมื่อฉันมีเวลามากขึ้น เพิ่มอีก 9 ไบต์และมันจะเป็นภาพเคลื่อนไหว [[เนื่องจากการเพิ่ม 'H 1 W #' -> ที่หยุดชั่วคราวเป็นวินาทีและล้างหน้าจอ:

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

นี่คือเวอร์ชันที่ไม่ได้อธิบาย / อธิบาย (ของเวอร์ชันแอนิเมชัน) พร้อมกับคำสั่ง 'do' ที่ถูกต้องและจุดลูป:

 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.

ฉันพยายามทำแจ๊ส "บีบอัดแล้วเข้ารหัส Base-64" แจ๊สเพื่อดูว่าจะเกิดอะไรขึ้น แต่สตริงที่เข้ารหัสสิ้นสุดลงนานกว่าโปรแกรมเล็กน้อย! นั่นและระบบของ Cache เรียกการบีบอัดและการเข้ารหัส base64 ค่อนข้างนาน ... ตัวอย่างเช่นนี่คือการเรียกระบบเพื่อถอดรหัส base64: $ System.Encryption.Base64Decode (STRING)

วิธีการดังกล่าวจะ 'ขยาย' โปรแกรมให้มากกว่า 300 ตัวอักษรฉันคิดว่า ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.