Недогрузка, 196 байт
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
Я подумал, что было бы интересно попробовать этот вызов на маломощном эзоланге; Недостаточная загрузка достаточно хороша для языка с таким небольшим количеством команд.
В результате получается файл SVG с очень сильно вложенными тегами и некоторыми ярлыками для игры в гольф. До сих пор я не нашел браузер, который мог бы отображать его (Firefox зависает на несколько минут, пытаясь загрузить его, и Firefox и Chromium дают пустой экран). Большинство программ обработки изображений также не могут загрузить его (что затрудняет его преобразование в другой формат), но мне удалось загрузить его в средство просмотра изображений Eye of Gnome (которое является частью установки по умолчанию в Ubuntu). Поэтому я сделал снимок экрана с изображением, чтобы вы могли его видеть (фактическое изображение имеет прозрачный фон, но вы не можете по-настоящему сделать его прозрачным):
Нам нужно явно указать размер изображения. Выбор подходящего ориентации для изображения, используя все при минимальном размере правовой, и делать минимальное количество итераций , предусмотренных вызовом, дает нам образ , который только вписывается в 99 пикселей в ширину, экономя байт. Приятно, когда все получается так.
Общий алгоритм, используемый для рисования изображения, состоит в том, чтобы поддерживать две переменные (Underload не называет переменные, но я думал о них как о x и y ), обе изначально были пустыми. Затем мы неоднократно заменяем ( x , y ) на ( x , повернуть налево и двигаться вперед, y ) и ( x , повернуть направо и двигаться вперед, y ). После десяти итераций и x, и y содержат кривую дракона из девяти итераций.
Также есть несколько микро-оптимизаций и трюков, связанных с недогрузкой. Чтобы избежать излишней путаницы с вершиной стека, каждую итерацию цикла, мы начинаем с объединения x и y в функцию «вернуть строку, созданную путем конкатенации: x , инструкция поворота, аргумент функции, перемещение вперед инструкция, и у . " Эта функция занимает только один пробел в стеке, поэтому мы можем продублировать ее, вызвать ее -90
в качестве аргумента, поменять местами возвращаемое значение в дубликате и вызвать его 90
в качестве аргумента, чтобы получить новые значения для x и yбез необходимости касаться более двух верхних элементов стека (которые являются наиболее доступными). Эта функция генерируется кодом во время выполнения. Сам генератор также генерируется кодом во время выполнения, чтобы позволить ему повторно использовать строку, <g transform="translate
которая также используется для установки источника изображения. Сначала мы генерируем все открытые теги, а затем, поскольку все закрывающие теги являются справедливыми </g>
, мы можем вывести 1024 закрывающих тега, просто повторяя строку, не беспокоясь о сопоставлении их с открытыми тегами. (Эффективное написание чисел в недогрузке само по себе является интересной проблемой; (:*)::*:**:*
возможно, это самый эффективный способ написать 1024, переводя в «2 в степень (1 + 2 × 2) × 2»).
Underload не имеет графических библиотек, поэтому я создаю SVG, используя комбинацию рисования линий в фиксированной позиции и поворачивая изображение вокруг заданной точки; вместо того, чтобы поворачивать ручку, мы поворачиваем бумагу. Идея состоит в том, что, рисуя линию, поворачивая все изображение, рисуя другую линию, снова поворачивая изображение и т. Д., Мы можем эффективно моделировать графику черепахи без необходимости арифметики или использования каких-либо графических библиотек, поскольку все линии нарисованы в том же месте. Конечно, это означает, что у нас есть очень сильно вложенные теги поворота изображения, что сбивает с толку многих зрителей SVG.
Стилизация изображения будет учитываться в счетчике байтов, поэтому мне нужно было указать минимальную стилизацию, необходимую для отображения изображения. Это оказывается stroke="#"
, что более или менее переводится как «линия должна быть какого-то цвета»; это кажется расширенным, чтобы нарисовать это черным. (Обычно вы бы указали цвет, скажем, «# 000».) Фон по умолчанию прозрачный. Мы не указываем ширину обводки, но выбор, выбранный Eye of Gnome, оставляет все видимым.
Многие интерпретаторы с недогрузкой борются с этой программой, например, программа Try It Online дает сбой, потому что она генерирует несколько очень больших строк внутри. Оригинальный переводчик Underload работает, хотя. (Интересно, что самый первый переводчик был в сети, поэтому язык можно было использовать в Интернете, прежде чем его можно было использовать в автономном режиме.)
Что-то, что меня немного беспокоит, так это то, что здесь только 1023 сегмента линии, и мы ожидаем 1024. Возможно, один из сегментов в конце не прорисован с помощью этого алгоритма (это будет на следующей итерации вместо). Если это дисквалифицирует, может быть возможно адаптировать программу, но она может закончиться значительно дольше. (Это не значит, что этот вызов все равно выиграет соревнование; уже есть несколько более коротких заявок.)