Una curva de Hilbert es un tipo de curva de relleno de espacio, y básicamente asigna una línea a un plano. Cada punto en la línea corresponde a solo un punto en el plano, y cada punto en el plano corresponde a solo un punto en la línea. Se muestran las iteraciones 0 a 4 de la curva de Hilbert:
Iteraciones 0 hasta 4:
El objetivo de esta tarea: escribir código que dibuje la cuarta iteración de la curva de Hilbert, como se definió anteriormente. Su código debe estar completo; en otras palabras, si crea una función para dibujar la curva de Hilbert, su código debe llamar a esa función. El resultado puede mostrarse directamente en la pantalla o puede escribir el resultado en un archivo de imagen. La curva puede girarse o voltearse, pero las líneas deben cruzarse en ángulo recto y la salida no se puede estirar. El arte ASCII es apreciado pero no será aceptado. ¡El código más corto en bytes gana!
fuente
Respuestas:
R, 90 bytes
Puerto R descarado del algoritmo utilizado en el enlace publicado por @Luis Mendo.
Porque
n=5
obtenemos:fuente
MATL ,
3938 bytesEsto toma el número de iteraciones como entrada. Si desea codificarlo, reemplácelo
i
por el número.El programa es un puerto del código Matlab de Jonas Lundgren que se muestra aquí .
El resultado se muestra a continuación. ¡También puedes probarlo en MATL Online! Se tarda unos segundos en producir la salida. Este compilador es experimental; es posible que deba actualizar la página y presionar "Ejecutar" nuevamente si no funciona inicialmente.
Explicación
fuente
MATLAB,
264262161 bytesEsto funciona igual, excepto que básicamente calculamos la "derivada" de la curva de hilbert, que luego "integramos" a través de `cumsum``. Esto reduce el tamaño del código en muchos bytes.
Versión antigua
Este es solo un enfoque recursivo simple. Usé números complejos para almacenar información vectorial para simplificar. Puede cambiar la curva en la parte
h(0,1,1+i,4)
. El primer argumentop=0
es la posición inicial, el segundo argumentof
es una bandera para la orientación (+1
o-1
), el tercer argumentod
es la dirección / rotación en la que se debe dibujar la curva y el cuartol
es la profundidad de recursión.Así es como se ve en las versiones anteriores:
Así es como se ve en 2015b:
->fuente
cumsum
idea que es genial!MATLAB / Octave, 202 bytes
Noté que la versión @LuisMendo vinculada
esmucho más corta que la solución "hecha a mano" anterior, pero utiliza un enfoque completamente diferente. Estoy publicando una versión de golf aquí ahora como CW:Esta versión se basa en el enfoque del sistema Lindenmayer:
fuente
JavaScript (ES6),
266...233232 bytesUna representación SVG de la curva de Hilbert.
Guardado 1 byte gracias a Neil
fuente
fill=none
Python 3,
177175171 bytesUna implementación simple del sistema Lindenmayer para la curva de Hilbert. Sugerencias de golf bienvenidas!
Editar: -2 bytes gracias a Kade. -3 bytes desde la reestructuración de cómo se construye la curva de Hilbert. -1 byte con agradecimiento a ETHproductions.
No golfista
fuente
t
puede ahorrar dos bytes:t+=[[c,"+AF-BFB-FA+"][c=="B"],"-BF+AFA+FB-"][c=="A"]
. Dado que el patrón es casi el mismo para los dos, me pregunto si hay alguna forma de usar eso ...if c>"E":
aif"E"<c:
para guardar un byte?MSWLogo (Versión 6.5b), 136 bytes
Basado en el programa final de la curva de Hilbert aquí .
Se
h
define una función , que toma varias iteraciones:n
(basadas en 1), ángulo:a
, longitud:l
. Es recursivo, llamando a una iteración más baja de sí mismo con el ángulo:a
negado en dos casos para obtener la orientación correcta.rt :a
,lt :a
gire la tortuga (cosita triangular cuyo camino se traza) derecha, izquierda en:a
grados.fd :l
mueve la tortuga hacia adelante por:l
pasos.Por último, la función se llama:
h 5 90 9
. La tortuga puede estar oculto por un extra de 2 bytes,ht
.fuente
ht
.Mathematica 128 Bytes
Reemplace los 4 anteriores con un número diferente de iteraciones si lo desea.
Hecho como un sistema Lindenmayer con secuencias enteras en lugar de secuencias de cadenas, por lo que la segunda regla de producción es solo lo negativo de la primera regla. Esta versión es de 151 bytes.
El puerto del código MATLAB de Jonas Lundgren es de solo 128 bytes.
Veo que en una versión futura de Mathematica, esto puede ser realmente corto, algo así como:
http://mathworld.wolfram.com/HilbertCurve.html
fuente
LindenMASM , 63 Bytes
¿Otra pregunta con una respuesta LindenMASM? ¡Increíble!
Una vez más, debido a algunos errores de dibujo con Python
turtle
, a veces, cuando ejecuta esto, todo el dibujo no está allí. Sin embargo, puede ver que realmente funciona:fuente