Змусьте кажана ASCII літати навколо місяця ASCII


34

Фон

Ось виклик, пов’язаний з Хеллоуїном.

Як ви могли бачити з мого останнього виклику, мені дуже подобається те, що я називаю художньою анімацією 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. Я забув її видалити після пісочниці.
ElPedro

@daHugLenny Дякуємо за додавання тегу. Я не думав про це.
ElPedro

6
Якщо ви вважаєте, що реалізація довідників повністю не виконана, я ніколи не хочу працювати з вами над будь-яким проектом програмування.
Фонд позову Моніки

3
Ну, може, трохи погуляли тоді :-)
ElPedro

Відповіді:


9

Brainfuck, 690 байт

Це мій перший гольф, тому я впевнений, що ще є багато можливостей для вдосконалення

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

Спробуйте в Інтернеті

Невикористані деякі для читабельності:

-[-[-<]>>+<]>-<<+++[>+++++++<-]>>>+>>-[<-->-------]<->++++++++>+>+++++>+>+++++>+>+++++++>+>+++++>+>+++++>+>++++++++>+>+>+>>+++[<++++++>-]<+>+>-->+>+>+
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
Дуже хороша! Я не думаю, що я маю терпіння відповісти на такий великий виклик, ха-ха.
DJMcMayhem

1
Додано посилання TIO, сподіваюся, ви не заперечуєте. Також я, здається, налічує 693 байти.
Емінья

Незграбні за читабельність все одно виграють перший приз за нечитабельність :) Загальна повага за те, що насправді це робили такою шаленою мовою. Дуже приємно і дякую за відповідь. +1. Стоїть 690 байт будь-якого часу.
ElPedro

@Enigma Від мене, дякую за посилання TIO.
ElPedro

@DJMcMayhem, я, мабуть, зіпсував копію / вставку, там був дубльований [<] у формі, що не має волі, який мав бути лише один раз. Слід виправити зараз.
Oyarsa

23

05AB1E , 69 62 60 байт

Збережено 2 байти завдяки Аднану .

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

Почнемо з додавання floor(5/(y+1))-(y==0)пробілів у кожен рядок із ð5y>;ï-y_+×.

Потім ми визначаємо, чи не повинно бути летючої миші або 3 проміжки перед м .
Якщо (-N-Y)%12 == 0це правда, ми додаємо кажан, інакше 3 пробіли.
Цей вираз ( N(Y-12%_Xè) буде розміщувати кажанів поетапно 0,6-12.

Тоді ставимо y m’s с 'my×.

Тепер ми визначаємо, чи має бути бита або 3 пробіли після м .
У коді NY-12%_y&Xèбуде розміщена bat, якщо ((N-Y)%12 == 0) and y!=0це правда, інакше 3 пробіли.
Це розставить кажанів на етапах 1-5.

Нарешті ми об'єднаємо всю рядок в рядок і друку з новим рядком: J,.


5
Робить саме те, що написано на бляшаному +1
ElPedro

1
3ð×…^o^)замість цього " ^o^"2äслід зберегти два байти.
Аднан

@Adnan: Дякую! Чомусь я просто припускав, що це буде довше і ніколи навіть не пробував 3ð×.
Емінья

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, який завжди є однаковим у моєму браузері, але може відрізнятися для інших браузерів.
Ніл

Гаразд, але, як я вже сказав, початкова позиція не була чітко визначена, тому я добре, щоб setInterval вирішив;) Я переглядаю Chome в Ubuntu, якщо це цікавить. Завжди починається одна позиція перед вершиною, але це не має значення. Прекрасне рішення і ще раз дякую за вашу відповідь ..
ElPedro

1
Ви можете зберегти пару байтів, використовуючи innerHTMLзамість textContent. І ще один байт, змінивши repeat(+c)на repeat(c).
Рік Хічкок

2
1000може стати 1e3.)
Рік Хічкок

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

Дуже хороша. Подумайте, мені доведеться трохи придивитись до Jelly.
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 в Місяці на кожному рядку.

zipРозпаковує ці символи в 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:])

але кордону позицій кодується як порядки друкованих символів, з доданими 23 (оскільки 9 не можна друкувати). Це виходить як " -;L[hrbQ@2' "і c=ord(b)-23використовується для отримання значень.


Поважайте +1 і дякую, що виступили з викликом :) Тепер мені просто потрібно розібратися, як це працює ...
ElPedro

Іноді хочеться, щоб я міг дати 2 відгуки.
ElPedro

1
Ви можете зберегти дві символи на останньому рядку, записавши це так:for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Віллем

7

Автовім , 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) Аргумент невідомого параметра: "--not-a-term" Детальніше з: "vim -h" Не встигли зараз подивитися на це, але в цей вечір буде вистава. Виглядає як цікавий проект.
ElPedro

1
Якщо у вас є якийсь час для запасного, відкрийте випуск GitHub - він працює як на моєму телефоні (Termux, дистрибутив Linux), так і на Windows у Git Bash. Я хотів би, щоб це працювало скрізь! Я найкраще здогадуюсь, що VIM, складений у 2013 році, справді не може бути останньою версією :) (остання версія - 8.0)
Крістіан Рондо

ДОБРЕ. Я щойно встановлений з менеджера пакунків, тому, можливо, я спробую варіант оновлення. Я дам вам знати, що відбувається.
ElPedro

1
Питання порушено на GitHub за потребою. Будь ласка, ігноруйте / відхиляйте, якщо ви не вважаєте це проблемою, оскільки оновлення вирішило її.
ElPedro

1
Отже, це означає, що це працює зараз! Чудово!
Крістіан Рондо

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

Це мій перший кодогольф, якщо ви маєте якусь пропозицію, я радий почути :)


Ласкаво просимо до 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's для Місяця
  • Потенційний кажан праворуч

Ці частини з'єднують і центрирують у коробці розміром 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-індексованим.

Кількість ms у Місяці змінюється на номер рядка r=k%7як [0,3,7,9,7,3,0]. Замість того, щоб індексувати це, формула була коротшою. Зручним ступенем свободи є те, що 0s може бути будь-яким негативним значенням, оскільки це все ще дає порожній рядок при множенні на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 для непотрібних аргументів string [] в Main()декларації.

Редагувати 2:

Переписав більшу частину логіки, вийнявши 245 байт! Включає запропоновані зміни з коментарів. Спасибі!

З коментарів перетворив це на функцію M()замість попереднього Main()методу - тож тепер це потрібно викликати зовнішньо.


Ласкаво просимо до PPCG! :)
Мартін Ендер

Ласкаво просимо і приємних перших зусиль! Дякую за вашу відповідь. Я, напевно, не # експерт, тому напевно не можу вам допомогти, але я впевнений, що ви знайдете багато членів спільноти, які із задоволенням допоможуть.
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 Звичайно, я візьму! Це, безумовно, працює як функція дзвінка, яка дає бажаний результат. Анекдотично я спробував це переписати ще раз і знайшов досить «розумне» рішення. На превеликий жаль, я закінчив +1 від поточного підрахунку байтів, тому, думаю, я покину його тут - дякую за дійсно веселу проблему! Це, безумовно, навчило мене чомусь новому.
levelonehuman

6

Python 2, 299 300 290 270 байт

Поле з гольфу до 270, отримавши трохи більше досвіду гри в гольф.

Довідкова реалізація збільшилася на 321 320 330 байт. Не красиво чи елегантно. Просто використовує грубу силу рядка та списки нарізки. Було весело, щоб підрахувати кількість байтів, але я думаю, що для серйозного конкурента підхід був абсолютно неправильним.

Я не чекаю, що цю відповідь буде сприйнято серйозно, тому, будь ласка, жодних речей. Я сказав у запитанні, що спробую пограти в референтну реалізацію, і саме це. Просто розміщено для розваги.

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

Рубі, 164 156 байт

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

Дуже проста програма. Можна працювати більше. Будь ласка, залишайте поради в коментарях.


Гарна відповідь. На даний момент я граю з Рубі в даний момент, тому що це виглядає набагато менш багатослівно, ніж Python, коли справа стосується гольфу.
ElPedro

3
@ElPedro Це лише текст, позбавлений пробілу пробілу, стиснутого zlib та закодованого base64. Ніякої магічної дії Ruby ніде.
dkudriavtsev

Ще думаю, що цей підхід буде набагато
важчим для

Welp, я забув включити деякі бібліотеки, і SE не дозволить мені це зробити. Чи може хтось, будь ласка, включити бібліотеки base64та zlibбібліотеки якнайкоротше, і додати їх до числа байтів?
dkudriavtsev

Чи є різниця між putsі say? Я не знайомий з Рубі.
Роман Ґраф


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 символів, я думаю ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.