Baja carga, 196 bytes
()()(<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
Pensé que podría ser interesante probar este desafío en un esolang de baja potencia; Underload funciona bastante bien para un lenguaje con un número tan bajo de comandos.
El resultado es un archivo SVG con etiquetas muy anidadas y algunos atajos de golf. Hasta ahora, no he encontrado un navegador que pueda mostrarlo (Firefox se cuelga durante varios minutos tratando de cargarlo, y tanto Firefox como Chromium muestran una pantalla en blanco). La mayoría de los programas de procesamiento de imágenes tampoco pueden cargarlo (lo que dificulta la conversión a otro formato), pero logré cargarlo en el visor de imágenes Eye of Gnome (que es parte de la instalación predeterminada en Ubuntu). Así que tomé una captura de pantalla de la imagen para que pueda verla (la imagen real tiene un fondo transparente, pero en realidad no puede capturar la pantalla transparente):
Necesitamos especificar el tamaño de la imagen explícitamente. Recogiendo una orientación adecuada para la imagen, dibujo todo a la talla mínima legal, y haciendo el mínimo número de iteraciones especificados por el desafío, nos da una imagen que sólo encaja en 99 píxeles de ancho, el ahorro de un byte. Es agradable cuando las cosas funcionan así.
El algoritmo general utilizado para dibujar la imagen es mantener dos variables (Underload no nombra las variables, pero pensé en ellas como x e y ), ambas inicialmente vacías. Luego, reemplazamos repetidamente ( x , y ) con ( x , gire a la izquierda y avance, y ) y ( x , gire a la derecha y avance, y ). Después de diez iteraciones, tanto x como y mantienen una curva de dragón de nueve iteraciones.
También hay algunas micro optimizaciones y trucos específicos de subcarga. Para evitar perder el tiempo con la parte superior de la pila, cada iteración del bucle, comenzamos combinando x e y en la función "devolver la cadena creada concatenando: x , una instrucción de giro, el argumento de la función, un movimiento- instrucción hacia adelante, y y ". Esta función solo ocupa un espacio en la pila, por lo que podemos duplicarlo, llamarlo -90
como argumento, intercambiar el valor de retorno debajo del duplicado y llamarlo 90
como argumento, para obtener nuevos valores para x e ysin necesidad de tocar más que los dos elementos superiores de la pila (que son, con mucho, los más accesibles). Esta función es generada por código en tiempo de ejecución. El generador en sí también se genera con código en tiempo de ejecución, para permitirle reutilizar la cadena <g transform="translate
que también se usa para establecer el origen de la imagen. Primero generamos todas las etiquetas abiertas, y luego, dado que todas las etiquetas de cierre son justas </g>
, podemos generar 1024 etiquetas de cierre simplemente repitiendo la cadena, sin preocuparnos de hacer coincidirlas con las etiquetas abiertas. (Escribir números de manera eficiente en Underload es un problema interesante por derecho propio; (:*)::*:**:*
sin embargo, es probablemente la forma más eficiente de escribir 1024, traduciéndose en "2 a la potencia de (1 + 2 × 2) × 2".
Underload no tiene ninguna biblioteca de gráficos, por lo que produzco SVG usando una combinación de líneas de dibujo en una posición fija y girando la imagen alrededor de un punto dado; en lugar de girar la pluma, giramos el papel. La idea es que dibujando una línea, girando la imagen completa, dibujando otra línea, girando la imagen nuevamente, etc., podemos simular efectivamente gráficos de tortuga sin tener que hacer ningún cálculo ni usar ninguna biblioteca de gráficos, ya que todas las líneas se dibujan en el mismo lugar Por supuesto, eso significa que tenemos algunas etiquetas de rotación de imagen muy anidadas, lo que confunde a muchos espectadores SVG.
Diseñar la imagen contaría contra el recuento de bytes, por lo que necesitaba dar el estilo mínimo necesario para mostrar la imagen. Esto resulta ser stroke="#"
, que se traduce más o menos como "la línea debe ser de algún color"; esto parece expandirse para dibujarlo en negro. (Normalmente, especificaría el color como, por ejemplo, "# 000".) El fondo es transparente de forma predeterminada. No especificamos un ancho de trazo, pero la elección elegida por Eye of Gnome deja todo visible.
Muchos intérpretes de Underload luchan con este programa, por ejemplo, el de Try It Online se bloquea, porque genera algunas cadenas muy grandes internamente. Sin embargo, el intérprete original de Underload en línea funciona. (Curiosamente, el primer intérprete estaba en línea, por lo que el idioma se podía usar en línea antes de que se pudiera usar sin conexión).
Algo que me inquieta un poco es que solo parece haber 1023 segmentos de línea aquí, y esperaríamos 1024. Podría ser que uno de los segmentos al final no se dibuje con este algoritmo (sería dibujado en la siguiente iteración). Si eso es descalificador, puede ser posible adaptar el programa, pero podría terminar considerablemente más tiempo. (No es como si este desafío fuera a ganar la competencia de todos modos; ya hay varias entradas más cortas).