Задний план
Вот вызов, связанный с Хэллоуином.
Как вы, наверное, уже видели из моего последнего испытания, мне очень нравится то, что я называю ascii art animations, это не просто рисование рисунка, но рисование рисунка, который прогрессирует. Эта идея пришла ко мне после того, как пару лет назад меня попросили оживить (довольно скучную) презентацию, заставив случайных летучих мышей летать по экрану в Хэллоуин. Излишне говорить, что я должным образом обязан (мне платили за это), но это заставило меня думать, что в жизни есть нечто большее, чем случайные летучие мыши. Вдохновленный этим, я хотел бы предложить этот вызов.
Вызов
Заставь летать летучую мышь вокруг Луны
Вот летучая мышь:
^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 повторений, независимо от того, сколько байт требуется. Это не потому, что у меня есть проблемы с языками игры в гольф. Смотрите мой ответ на вопрос по этому вопросу на мета, если у вас есть какие-либо сомнения. Большое спасибо и уважение всем, кто внес вклад на любом языке.
Ответы:
Brainfuck, 690 байт
Я впервые играю в гольф, так что я уверен, что есть еще много возможностей для улучшения
Попробуйте онлайн
Развернул некоторые для удобства чтения:
Я хотел использовать тот факт, что при добавлении новой строки в начало, каждый этап можно прочитать в обоих направлениях, чтобы получить два разных этапа, но я не мог найти хороший способ сделать это без генерации полных шести с половиной этапов. сразу.
источник
05AB1E ,
696260 байтСохранено 2 байта благодаря Аднану .
Попробуйте онлайн!
объяснение
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
.Затем мы помещаем YM с
'my×
.Теперь мы определяем, должна ли быть летучая мышь или 3 пробела после m .
Код
NY-12%_y&Xè
поместит летучую мышь, если((N-Y)%12 == 0) and y!=0
это правда, иначе 3 пробела.Это поместит летучих мышей на стадии
1-5
.Наконец мы объединим всю строку в строку и печати с новой строкой:
J,
.источник
3ð×…^o^)
instead of" ^o^"2ä
should save two bytes.3ð×
.JavaScript (ES6),
109144140138 bytesAnimated version
Show code snippet
источник
HTML+JS,
153149 bytesEdit: Saved a bunch of bytes thanks to @RickHitchcock. The boring version that just returns the 13 multiline strings in an array is
132131 bytes:источник
setInterval
, which is always the same on my browser, but may vary for other browsers.innerHTML
instead oftextContent
. And another byte by changingrepeat(+c)
torepeat(c)
.1000
can become1e3
.)Jelly,
76 6958 bytesTryItOnline
How?
источник
Python 2,
146 144138 bytes-2 bytes thanks to @Willem (use the variable
c
rather than looping through amap
)repl.it
'6643466'
is the number of spaces before the moon (with 6 on the empty first and last lines, since the bat will go there).'0379730'
is the number of'm'
s in the moon on each line.The
zip
unpacks these characters intoa
andb
and makes the moon in the sky,m
, with 3 trailing spaces on each line.The last line then traverses the positions of the bat within the moon, and is effectively:
but the tuple of positions is encoded as the ordinals of printable characters, with an added 23 (since 9 is not printable). This comes out as
" -;L[hrbQ@2' "
, andc=ord(b)-23
is used to extract the values.источник
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Autovim,
8581 bytesNo animation, probably still golfable... Still, not bad for the new kid on the block! (autovim)
To run it:
Explanation
In short, we draw the moon, copy and paste it 12 times, and use two macros: one to append the bat on the first 7 moons, the other to prepend the last 6.
источник
PHP, 167 bytes
I made a small program in PHP:
Here is a more verbose version:
This is my first codegolf, if you have any suggestion i'm happy to hear :)
источник
Python 2, 112 bytes
Print the picture. Each line has three parts
m
's for the moonThese parts are concatenated and centered in a box of size 15 for spacing. To avoid the bats shifting the center, a missing bat is three spaces, the same length. For bats on top of or below the moon, the left bar slot is omitted and the right slot is occupied.
There are 91 lines: a 7-line picture for each of 13 pictures. These are counted up via divmod: As
k
counts from0
to91
,(k/7, k%7)
goesTaking the first value
k/7
to be the picture and the second valuer=k%7
as the row number within the picture, this counts up first by picture, then by row number within each picture, both 0-indexed.The number of
m
's in the moon changes with row numberr=k%7
as[0,3,7,9,7,3,0]
. Rather than indexing into this, a formula was shorter. A convenient degree of freedom is that the0
's can be any negative value, as this still gives the empty string when multiplied bym
. Fiddling with a parabola and floor-dividing gave a formular*(6-r)*8/5-5
.Now, we look at selecting whether to draw a bat or empty space on either side. The array
b=[' ','^o^']
contains the options.The bat in row 0 on in picture 0 (on top), in row 1 in picture 1 (on the right), on to in row 6 in picture 6 (on top). So, it's easy to check whether it appears as the row and picture number as being equal,
k/7==r
. But we also need picture 12 to look like picture 0, so we take the picture number modulo 12 first.On the left it's similar. The bat appears on the left in rows
r=5,4,3,2,1
in pictures7,8,9,10,11
. So, we check whether the row and picture number sum to 12. We also make sure to draw nothing rather than three spaces on rows0
and6
-- the right bat slot will draw the bat, and we must not mess up its centering.источник
C#,
615582337 bytesThis is my first (still far too readable) attempt at one of these, so I'll gladly welcome any suggestions to shave off a few hundred bytes! Top of my list right now is a shorter way to create the moon array.
Ungolfed (includes loop!)
Edit:
Took out 21 bytes by removing trailing spaces in the array declaration. Instead of a grid 15 characters wide, each row is only wide enough for the bat to fit. Removed another 12 for the unnecessary string[]args in
Main()
declaration.Edit 2:
Rewrote most of the logic, taking out 245 bytes! Includes suggested changes from the comments. Thanks!
From the comments, turned this into a function
M()
instead of the previousMain()
method - so now, this needs to be called externally.источник
new string[]
fromm
and just puttingstring[]m={...}
.var
's in places such asstring[]w=(string[])m.Clone();
-var w=(strin[])m.Clone();
Python 2,
299300290270 bytesGolfed down to 270 having gained a bit more golfing experience.
Reference implementation golfed down by
321320330 bytes. Not pretty or elegant. Just uses brute force string and list slicing. Was fun to get the byte count down though but I think the approach was completely wrong to start with for a serious competitor.I don't expect this answer to be taken seriously so please no downvotes. I did say in the question that I would try to golf the reference implementation and this is exactly that. Just posted for fun.
Try it online!
источник
Ruby,
164156 bytesVery simple program. Can be worked on more. Please leave tips in the comments.
источник
base64
andzlib
libraries in the shortest way possible, and add them to the byte count?puts
andsay
? I'm not familiar with Ruby.///, 205 bytes
Try it online!
Only if I didn't need tons of trailing spaces...
источник
Mumps, 223 Bytes
This is using InterSystems Cache Mumps -- it allows braces around loops which make it handy for nested loops in a single line.
Could probably be golfed more, and I may play with that when I have more time. Add another 9 bytes, and it'll be animated [[ due to the addition of the 'H 1 W # ' --> that halts for a second and clears the screen:
Here's an ungolfed / explained version (of the animation version), with the correct 'do' statements and dot loops:
I tried to do the "compress then Base-64 encode" jazz just to see what would happen, but the encoded string ended up a little longer than the program itself! That, and Cache's system calls for the compression and base64 encoding are quite long... for example, here's the system call to decode base64: $System.Encryption.Base64Decode(STRING)
That method would 'bloat' the program to over 300 characters, I think...
источник