Si hallas algún problema con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al proyecto final.
Solución:
MATLAB, 119 115
En un giro inusual de los acontecimientos, descubrí que este programa realmente funcionaba mejor mientras jugaba al golf. Primero, se volvió mucho más rápido debido a la vectorización. Ahora, muestra un aviso útil ~n:~
recordando 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:
o
es un arbitrario string que es igual a [0 2 4 0]
módulo 6. eiπ/3 elevado a estas potencias da los vértices de un triángulo equilátero en el plano complejo. El primero kron
se utiliza para hacer una copia de la lista de puntos con cada uno duplicado 4 veces. ~~o
es la forma conveniente de obtener un vector de 4 unidades. En segundo lugar diff(P)
encuentra el vector entre cada par de puntos consecutivos. Múltiplos de este vector (0, 1/3, (1 + e-iπ/3)/3 y 2/3) se agregan a cada uno de los puntos anteriores.
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 función k
con un solo parámetro de nivel.
Editar
En este editor en línea http://www.calormen.com/jslogo/ puede agregar k readword
para usar el indicador de entrada, pero por alguna razón este comando no es compatible con la abreviatura estándar rw
.
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 pequeños cambios ya que UCBLogo tiene un analizador extraño. Requiere to
y end
estar en líneas y espacios separados antes :
se requiere 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
T-SQL: 686 (excluyendo formato)
Para SQL Server 2012+.
Aunque esto nunca será un competidor, tenía que ver si podía hacerlo en T-SQL. Se acabó el enfoque de comenzar con los tres bordes iniciales, luego recurriendo a través de cada borde y reemplazándolos 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 [email protected]
Agradecemos que quieras apoyar nuestra faena añadiendo un comentario o valorándolo te damos las gracias.