Я немного скучаю по тем старым демонстрациям, показывающим возможности компьютеров, когда они назывались x86 вместо i3, i5 и i7. Одним из первых, которые я посмотрел в своих 386, была демо-версия Unreal от Future Crew, которая сейчас празднует свое 25-летие. В минуту 0:43 начинается первая часть демонстрации, и мы видим прокручиваемый текст по синусоидальному пути. Попробуем подражать этому эффекту в искусстве ASCII!
Соревнование
Учитывая этот путь:
*** ***
*** ***
** **
* *
* *
* *
* *
** **
*** ***
******
и входной текст, нарисуйте текст по этому пути, например так:
Thi Golf!
s i de Yay
s Co !
P
r d
o n
g a
ra s
mmi zle
ng Puz
Обратите внимание, что пробелы считаются символами в пути, и что путь повторяется, если текст длиннее образца.
Анимационная часть
После того как вы нарисовали текст, подождите 100 мс (чтобы создать анимацию около 10 кадров в секунду) и снова нарисуйте текст, но начиная со следующей позиции пути. Таким образом, для фрейма #n
рассчитайте n modulo 40
и начните рисовать в следующей позиции пути с текстом, всегда выровненным по левому краю холста:
*** ***
| *** *** |
| ** ** |
| * * |
| * * |
| * * |
| * * |
| ** ** |
| *** *** |
| ****** |
Position 0 Position 39
Таким образом, для кадра 10 мы будем иметь:
and Co
es de
zl Go
z l
u f
T P !
h
is ng Ya
is mmi y!
Progra
Заметки
- Ввод будет одним
string
(илиchar
массивом) с текстом для анимации, и всегда будет содержать как минимум 1 символ. - Допустимые символы для анимации - те, которые находятся в наборе ASCII для печати .
- Путь для следования будет в точности как указано.
- Текст всегда будет выровнен по левому краю холста, поэтому эффект будет заключаться в том, что текст будет развеваться, как флаг, без смещения текста. И под холстом я подразумеваю экран или что-то, что вы будете использовать, чтобы показать текст . ;-)
- Кадры должны быть очищены от любых символов / пикселей из предыдущих кадров, если символ / пиксель не совпадают в обоих кадрах.
- Скорость анимации не имеет значения, если она работает плавно или так быстро, как ваше устройство (мы можем установить минимум 5 кадров в секунду, но это не является обязательным требованием). Просто отрегулируйте скорость, чтобы сделать ее плавной, и не беспокойтесь, если время ожидания не совпадает.
- Анимация будет повторяться бесконечно.
Это код-гольф , поэтому может выиграть самая короткая программа или функция, способная оживить текст!
Ответы:
HTML + ES6,
241244237 байтСломать:
Как?
Строить путь
Следующий код строит путь:
Это дает массив массивов,
[j, y, z]
где j - это позиция по модулю 20, y - это y-координата в этой позиции, а z не используется позже (просто так вычисляется здесь, чтобы сохранить несколько байтов).Поскольку путь симметричен, нам нужно только закодировать 20 первых позиций. Мы делаем это с помощью двоичного числа, где каждый
1
бит означает, что у необходимо обновить (+1 для первой половины, -1 для второй половины).Когда первая позиция отображается в младший значащий бит, это дает:
Поскольку это двоичное число само по себе также симметрично, мы можем прочитать его в том же порядке для второй половины.
Отсюда и формула:
который также может быть записан как:
где k - позиция, а j - позиция по модулю 20.
Обновление x намного проще: у нас есть только один особый случай, который нужно определить, сравнив позицию по модулю 20 с 9.
Рисование текста
В следующем коде описанный выше код построения пути был заменен
path
переменной для удобства чтения.источник
*
по вертикали, не выровнены (на одной высоте), и еще один маленький придира. Но я должен сказать, что до сих пор не знаю, как ваш код создает волновой эффект (что делаетy+=155464
?). Поздравляем!