Representación gráfica del copo de nieve de Koch

13

Genera un copo de nieve Koch

Un copo de nieve Koch es un triángulo que para cada uno n, se agrega otro punto equilátero en el medio de cada lado: http://en.wikipedia.org/wiki/Koch_snowflake#Properties

Ya teníamos un desafío Koch copo de nieve para n=4. El nuevo desafío es dibujar un copo de nieve Koch con cualquier nentre 1y 10.

Reglas

Es posible que los copos de nieve no estén codificados en el programa o en los archivos; deben ser generados por su programa.

Su programa debe admitir todos los tamaños nentre 1 y 10.

El número de lados debe ser ingresado por el usuario a través de std-in.

Debe imprimir una representación gráfica del copo de nieve en la pantalla.

Muestra de copos de nieve Koch con la nigualdad de 1, 2, 3 y 4 (líneas verdes solo para mayor claridad, no las reproduzca):

Koch Snowflakes

En el caso de un desempate, el programa con el mayor número de votos positivos gana (concurso pop).

Comunidad
fuente
No entiendo esto: "Debe usar una función para calcular dónde colocar el píxel. Si su programa no tiene una función incorporada para este propósito, puede deducir el costo de implementar uno de su puntaje. " Que pixel
xnor
@xnor Originalmente estaba destinado a calcular cómo dibujar el copo de nieve por píxel / personaje (el desafío fue originalmente un desafío de arte ASCII también). La mayoría de la gente probablemente usará líneas, así que lo eliminaré.
¿Se puede dibujar todo el copo de nieve lleno?
xnor
Por supuesto. Este comentario necesita ser más largo.
Más allá n=7, no puede ver los triángulos recién agregados en el copo de nieve en la pantalla de una computadora. ¿Hay algún "mejor esfuerzo" aquí? ¿Existe una resolución mínima para las soluciones basadas en píxeles?
xnor

Respuestas:

7

Mathematica 72

Region@Line@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]

n = 3

ingrese la descripción de la imagen aquí

Gracias por alephalpha.

chyanog
fuente
Buen trabajo. ¡Juega con dos personajes y obtienes la victoria!
@ Hosch250 Actualizado, gracias.
chyanog
Puede usar AnglePathen Mathematica 10.1.
alephalpha
@chyaongGraphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
alephalpha
1
@alephalpha 73 caracteres:ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
chyanog
15

MATLAB, 119 115

En un giro inusual de los acontecimientos, descubrí que este programa realmente funcionaba mejor mientras jugaba al golf. Primero, se hizo mucho más rápido debido a la vectorización. Ahora, muestra un mensaje útil que le ~n:~recuerda al usuario qué cantidad ingresar.

Las nuevas líneas no son parte del programa.

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9: n = 9

oes una cadena arbitraria que es igual al [0 2 4 0]módulo 6. e iπ / 3 elevado a estas potencias da los vértices de un triángulo equilátero en el plano complejo. El primero kronse usa para hacer una copia de la lista de puntos con cada uno duplicado 4 veces. ~~oes la forma conveniente de obtener un vector de 4 unos. En segundo lugar, diff(P)encuentra el vector entre cada par de puntos consecutivos. Los múltiplos de este vector (0, 1/3, (1 + e -iπ / 3 ) / 3 y 2/3) se suman a cada uno de los puntos anteriores.

Feersum
fuente
Uhm, ¿podrías explicar un poco más cómo funciona este código? Pensé que conocía algo de Matlab pero esto es ... ¿locura? =)
flawr
@flawr Agregué algunas notas, ¿eso ayuda?
feersum
¡Muchas gracias! Voy a tener en mente ese truco de abuso de cuerdas =)
error
9

T-SQL: 686 (sin formato)

Para SQL Server 2012+.

Aunque esto nunca será un contendiente, tuve que ver si podía hacerlo en T-SQL. Se ha ido el enfoque de comenzar con los tres bordes iniciales, luego recurrir a través de cada borde y reemplazarlos con 4 bordes para cada nivel. Finalmente uniendo todo en una sola geometría para el nivel especificado para @i

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE i=@i

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

MickyT
fuente
¡No tenía idea de que tal magia podría lograrse con T-SQL!
Harry Mustoe-Playfair
9

LOGOTIPO: 95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

Define la función kcon un parámetro de nivel único.

Editar

En este editor en línea http://www.calormen.com/jslogo/ puede agregar k readwordpara usar el indicador de entrada, pero por alguna razón este comando no admite la abreviatura estándarrw .

La solución de 102 caracteres a continuación funciona en USBLogo con entrada estándar como se especifica en la pregunta. Sin embargo, el código necesitaba ligeros cambios ya que UCBLogo tiene un analizador extraño. Requiere toy endestar en líneas y espacios separados antes de que :sea ​​necesario, pero por otro lado :son opcionales.

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw
nutki
fuente
¿Cómo ejecutas LOGO?
Beta Decay
@BetaDecay Usé esto: logo.twentygototen.org pero este fue el primero que encontré: calormen.com/jslogo También puedes instalar USBLogo
nutki
8

BBC BASIC, 179

REV 1

INPUTn
z=FNt(500,470,0,0,3^n/9)END
DEFFNt(x,y,i,j,a)
LINEx-36*a,y-21*a,x+36*a,y-a*21PLOT85,x,y+a*42IFa FORj=-1TO1FORi=-1TO1z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3)NEXTNEXT
=0

Como antes, pero en blanco y negro, en versiones sin golf (pero aerodinámicas) y de golf. No es un ganador, a pesar de que hacerlo de esta manera evita la necesidad de un tratamiento especial para n = 1.

  INPUTn
        REM call function and throw return value away to z
  z=FNt(500,470,0,0,3^n/9)
  END

        REM x,y=centre of triangle. a=scale.
        REM loop variables i,j are only passed in order to make them local, not global.
  DEFFNt(x,y,i,j,a)

        REM first draw a line at the bottom of the triangle. PLOT85 then draws a filled triangle,
        REM using the specified point (top of the triangle) and the last two points visited (those used to draw the line.)
  LINEx-36*a,y-21*a,x+36*a,y-21*a
  PLOT85,x,y+42*a

        REM if the absolute magnitude of a is sufficient to be truthy, recurse to the next level.
        REM j determines if the triangle will be upright, inverted or (if j=0) infinitely small.
        REM i loops through the three triangles of each orientation, from left to right.
  IFa FORj=-1TO1 FORi=-1TO1:z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3):NEXT:NEXT

        REM return 0
  =0

ingrese la descripción de la imagen aquí

REV 0

De acuerdo con la respuesta del OP a @xnor, los copos de nieve rellenos están bien. Esta respuesta fue inspirada por el comentario de xnor. Los colores son solo por diversión y para mostrar la forma en que está construido. Tome un triángulo (magenta en este caso) y superplot con 6 triángulos 1/3 de la base.

  INPUTn
  z=FNt(500,470,n,1,0,0)
  END

  DEFFNt(x,y,n,o,i,a)
  a=3^n/22
  GCOLn
  MOVEx-36*a,y-o*21*a
  MOVEx+36*a,y-o*21*a
  PLOT85,x,y+o*42*a
  IFn>1FORi=-1TO1:z=FNt(x+24*a*i,y+14*a*(i*i*3-2),n-1,-1,i,a):z=FNt(x+24*a*i,y-14*a*(i*i*3-2),n-1,1,i,a)NEXT
  =0

ingrese la descripción de la imagen aquí

Level River St
fuente
1
Me gusta cómo parece que 7 de ellos se fusionaron.
@ hosch250 De hecho, parece que "inventé" un nuevo fractal cuya silueta resulta ser un copo de nieve de Koch, y si elimina la parte magenta, le quedan 6 copos de nieve Koch más pequeños. La versión de golf será solo una silueta negra simple, pero también dejaré esta imagen.
Level River St el
¿Lo escribes BBC Basic o BBC BASIC? Voy por lo último pero no sé si es correcto ...
Beta Decay
2
@BetaDecay BASIC es un backronym para el Código de Instrucción Simbólico / Estándar Multiuso para Principiantes. El bit "Estándar" es discutible ya que hay muchas variantes. en.wikipedia.org/wiki/BASIC . La mayoría de las variantes de BASIC prefieren la versión en mayúscula, pero según la página de Wikipedia, Visual Basic prefiere las minúsculas. Creo que BBC BASIC como se envió fue en mayúsculas. Estoy usando la versión en bbcbasic.co.uk/bbcwin/bbcwin.html . Está en mayúsculas en el sitio web y en IDE, así que diría que la versión en mayúsculas es más correcta. Pero no creo que importe mucho.
Level River St
Ahh está bien, continuaré con la versión en mayúscula
Beta Decay
8

Mathematica - 177

r[x_, y_] := Sequence[x, RotationTransform[π/3, x]@y, y]
Graphics@Polygon@Nest[
 ReplaceList[#, {___, x_, y_, ___}  Sequence[x,r[2 x/3 + y/3, 2 y/3 + x/3], y]
  ] &, {{0, 0}, {.5, √3/2}, {1, 0}, {0, 0}}, Input[]]

ingrese la descripción de la imagen aquí

Clip de bonificación de variar el ángulo de la pieza central

ingrese la descripción de la imagen aquí

silbido
fuente
6

Python 3 - 139

Utiliza la biblioteca de gráficos de tortugas.

from turtle import*
b=int(input())
a=eval(("FR"*3)+".replace('F','FLFRFLF')"*~-b)
for j in a:fd(9/b*("G">j));rt(60*(2-3*("Q">j))*("K"<j))])
Decaimiento Beta
fuente
Frio. ¡Me gusta su enfoque basado en cadenas de encontrar la forma con no más de dos líneas de código! Pero no se puede comprobar "G">j, "Q"<jy utilizar fd(9/b)para guardar 3 bytes? Además, puede evitar que las ifdeclaraciones se multipliquen, por ejemplo, ("G">j)con el argumento 9/by ponerlas todas en una línea detrás for. Oh! Entonces incluso puedes combinar rty ltusar120*(...)-60*(...)
Falko
Esto parece representar la entrada de copo de nieve de Koch + 1. Una entrada de 1 debería ser solo un triángulo como muestra la imagen de arriba.
@Falko ¡Gracias por toda esa ayuda!
Beta Decay
@ hosch250 Editado
Decaimiento Beta
Ahora no dibuja nada, y una entrada de 1 crea un error de división por 0.
4

Python 3, 117 bytes

from turtle import*
ht();n=int(input())-1
for c in eval("'101'.join("*n+"'0'*4"+")"*n):rt(60+180*(c<'1'));fd(99/3**n)

Método:

  • La solución utiliza gráficos de tortuga de Python.
  • n es input - 1
  • A partir de la cadena 0000, unimos todos sus caracteres con 101 ntiempos iterativamente con el truco eval (gracias a @xnor por eso).
  • Para cada carácter en la cadena final giramos 60 grados a la derecha o 120 grados a la izquierda según el valor del carácter ( 1o 0) y luego avanzamos una longitud ( 99/3^n) que garantiza un tamaño similar para todosn .
  • El último 0en la cadena será inútil, pero solo vuelve a dibujar la misma línea que los primeros 0dibujos.

Ejemplo de salida para input = 3:

Koch

randomra
fuente
2

R: 240 175

Debido a que estoy tratando de entender a R, aquí hay otra versión. Es probable que haya formas mucho mejores de hacer esto y estoy feliz de recibir sugerencias. Lo que he hecho parece muy complicado.

n=readline();d=c(0,-120,-240);c=1;while(c<n){c=c+1;e=c();for(i in 1:length(d)){e=c(e,d[i],d[i]+60,d[i]-60,d[i])};d=e};f=pi/180;plot(cumsum(sin(d*f)),cumsum(cos(d*f)),type="l")

ingrese la descripción de la imagen aquí

MickyT
fuente
2

Sabio fwom youw gwave ...

Sabía que me gustaría intentar implementar esto en Befunge-98 usando TURT, pero no pude averiguar cómo hacerlo y me quedé sentado durante varios meses. ¡Ahora, recientemente, descubrí una forma de hacerlo sin usar la auto-modificación! Y entonces...

Befunge-98 con la huella digital TURT, 103

;v;"TRUT"4(02-&:0\:0\1P>:3+:4`!*;
>j$;space makes me cry;^
^>1-:01-\:0\:01-\:0
0>I@
^>6a*L
^>ca*R
^>fF

Primero saquemos algunos detalles de implementación:

  • Probé esto usando CCBI 2.1 , cuya implementación de TURT (la huella digital de gráficos de tortuga) hace que I"imprima" la imagen en un archivo SVG. Si ejecuta esto en CCBI sin el argumento de comando --turt-line=PATH, aparecerá como un archivo llamado CCBI_TURT.svg por defecto. Esto es lo más cerca que pude llegar a "imprimir una representación gráfica del copo de nieve en la pantalla" con los intérpretes de Funge disponibles que pude encontrar. Tal vez algún día haya un mejor intérprete que tenga una pantalla gráfica para la tortuga, pero por ahora ...
  • Tiene que haber una nueva línea al final para que CCBI la ejecute sin colgar (esto se incluye con el recuento de caracteres). ¿Yo se, verdad?

Básicamente, esto funciona usando la pila como una especie de sistema L improvisado y expandiéndolo sobre la marcha. En cada pase, si el número superior en la pila es:

  • -2, luego imprime y se detiene;
  • -1, la tortuga gira en sentido antihorario 60 grados;
  • 0, gira en sentido horario 120 grados;
  • 1, se mueve hacia adelante (15 píxeles aquí, pero puede cambiarlo modificando el fen la última línea);
  • algún número n que es 2 o mayor, luego se expande en la pila a n-1, -1, n-1, 0, n-1, -1, n-1.

Para n = 10, este proceso lleva mucho tiempo (un par de minutos en mi sistema), y el SVG resultante es de ~ 10 MB de tamaño e invisible cuando se ve en el navegador porque no puede ajustar el tamaño del pincel con TURT. IrfanView parece funcionar decentemente si tiene los complementos correctos. No estoy muy familiarizado con SVG, así que no sé cuál es el método preferido para ver esos archivos (especialmente cuando son realmente grandes).

Oye, al menos funciona , lo cual, considerando que es Befunge, es algo por lo que estar agradecido por sí solo.

Kasran
fuente
1

Python 2, 127 bytes

from turtle import *
def L(l,d=input()-1):
 for x in[1,-2,1,0]:[L(l,d-1),rt(60*x)] if d>0 else fd(l)
for i in'lol':lt(120);L(9)
dieter
fuente
1
Gracias por tener la publicación número 50,000 aquí.
Andrew