El copo de nieve de Koch (también conocido como la estrella de Koch y la isla de Koch) es una curva matemática y una de las primeras curvas fractales que se han descrito. Se basa en la curva de Koch, que apareció en un artículo de 1904 titulado "En una curva continua sin tangentes, construible a partir de geometría elemental" (título original en francés: "Sur une courbe continue sans tangente, obtenue par une construction géométrique élémentaire") por el matemático sueco Helge von Koch.
Aquí hay algunas representaciones ascii de varias iteraciones:
n=1
__
\/
n=2
__/\__
\ /
/_ _\
\/
n=3
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/ \__
\ /
/_ __ __ _\
\/ \ / \/
/_ _\
\/
Como obviamente hay un límite para la resolución de la representación ascii, debemos agrandar el tamaño del copo de nieve por un factor de 3 para cada iteración para mostrar el detalle adicional.
Escriba el código más corto para generar el copo de nieve en el mismo estilo para n = 4
Su programa no debe tomar ninguna entrada.
Su programa debe escribir el copo de nieve en la consola.
fuente
Respuestas:
Python, 338 bytes
Solo otra hazaña Unicode
correr en ideone
fuente
Python,
650612594574 caracteresEsto funciona expandiendo el triángulo por un factor de 3 cada vez. Para hacer eso, necesitamos hacer un seguimiento de si cada símbolo es un límite izquierdo o derecho (por ejemplo, cómo
/
se expande depende de qué lado del/
interior se encuentre). Utilizamos diferentes símbolos para los dos casos posibles, de la siguiente manera:La
d
variable maneja el caso especial donde la expansión de una
necesita extenderse al 3x3 en la siguiente fila.fuente
('acEei',r'_/\\ ')
=>('aecEi','_\/\ ')
ahorra 1 más. También puede consultar elunicode.translate()
.Código de máquina de 16 bits de MS-DOS: 199 bytes
Decodifique usando este sitio , guárdelo como archivo 'koch.com' y ejecútelo desde el símbolo del sistema de WinXP.
Actualizar
Aquí hay una versión de ensamblador fácil de leer:
fuente
"scAA...w==".decode("base64")
para decodificar en Python2 (no funciona para Python3)Perl,
176175 bytesPublicar esto como una respuesta separada porque usa un archivo fuente binario, lo cual es quizás un poco engañoso. Pero teniendo en cuenta que sigue siendo el código fuente de Perl , creo que es notable que supere la solución de código de máquina de MS-DOS .
Fuente como codificada en base64
Algo más legible
Reemplace todas las instancias de
/<[0-9a-f]+>/
con los datos binarios relevantes:En esta versión, el copo de nieve se codifica de la siguiente manera:
Los 8 bits en cada byte se dividen así:
R
codifica una serie de espacios. La ejecución más larga es de 27 caracteres, por lo que todas las ejecuciones caben en 5 bits.C
codifica una secuencia de caracteres que simplemente se buscan en la matriz literal. (Solía tener codificaciones ligeramente más locas aquí donde la matriz contenía solo/ \ _
, pero el código Perl necesario para decodificarla era más largo ...)Tengo suerte de que los datos binarios no contengan ninguno
"
/'
o\
que necesite escapar. No planeé esto. Pero incluso si lo hiciera, probablemente podría haber cambiado el orden de los elementos en la matriz para solucionarlo.Es sorprendente lo simple que se compara esta solución con las decenas de otras soluciones que pasé antes de llegar a esto. Experimenté con muchas codificaciones bit a bit diferentes más complejas que esta, y nunca se me ocurrió que una más simple podría valer la pena simplemente porque el código Perl para decodificarla sería más corto. También intenté comprimir repeticiones en los datos usando interpolación variable (ver la otra respuesta), pero con la versión más nueva que ya no gana caracteres.
fuente
Pitón, 284
Con un poco más de espacio en blanco:
El lado izquierdo está comprimido; el lado derecho se reproduce desde el lado izquierdo.
fuente
Perl,
224223 caracteresAlgo más legible
Cómo funciona
Para una explicación de cómo funciona, vea la otra respuesta en la que publico lo mismo en binario . Realmente lamento no estar generando el copo de nieve de Koch, solo comprimiéndolo ...
Versión anterior
(359) Codificó todo el copo de nieve en lugar de solo la mitad izquierda. Se incluyeron espacios en la codificación de bits; No hay longitud de carrera todavía. Se usaron varias variables interpoladas más una
@_
matriz a la que se accedió usandos/\d/$_[$&]/eg
. Las líneas nuevas se codificaron como!
.(289) Primera versión que codificó solo la mitad izquierda del copo de nieve.
(267) Primera versión que usó codificación de longitud de ejecución para los espacios.
(266) Cambiar
' '
a$"
.(224) Compresión radicalmente diferente, codificada como base-64. (Ahora equivalente a la versión binaria ).
(223) Comprendí que puedo poner la impresión dentro del último sustituto y así guardar un punto y coma.
fuente