Dibuja una espiral en una caja

13

espiral

Esta espiral geométrica parece complicada, pero es bastante simple de dibujar; toma el siguiente cuadro:

caja

Dibuje una línea recta entre la esquina de la caja y cierta distancia establecida sobre la siguiente esquina en sentido antihorario.

1 linea

Continúe este patrón hacia adentro, siempre manteniéndose a esa distancia establecida de la esquina de la siguiente línea. Aquí hay algunas líneas más en.

líneas de moar

Como puede ver, a medida que el patrón continúa, la espiral se acerca al centro y los cuadros que dibuja comienzan a girar. Tenga en cuenta que la distancia permanece constante, independientemente del ángulo.

El reto

La inspiración (y también gracias a la maravillosa persona que me presentó este concepto <3)

Dada una entrada numérica (posiblemente fraccionaria) del 1 al 25, escriba una imagen en el disco que use este patrón o muestre la salida en la pantalla, donde la distancia desde cada esquina es la distancia de un lado inicial del cuadro dividido por la entrada . Continúe el patrón hacia adentro hasta que la distancia desde la esquina especificada sea mayor que la longitud del siguiente lado.

Reglas

  • No puede utilizar elementos integrados para esta creación en espiral, pero puede utilizar las funciones integradas de procesamiento de imágenes.
  • Si escribe en el disco, debe generar una imagen en cualquiera de .jpg, .gif, .tiff, .pbm, .ppm y .png.
  • La longitud del lado inicial debe ser de al menos 500 píxeles.
  • La esquina inicial puede ser la que elija.
  • Como siempre, las lagunas estándar no están permitidas.
Addison Crump
fuente
¿Hay un mínimo para cuántos niveles de profundidad debe tener esta espiral?
LegionMammal978
@ LegionMammal978 Nunca pediría una entrada mayor que 25, agregaré eso.
Addison Crump
Incluir .pbm o .ppm podría ayudar a algunos de los lenguajes menos gráficos.
trichoplax
también relacionado
Trauma digital

Respuestas:

12

Zapatos (Ruby) 163 bytes

Shoes es un juego de herramientas GUI basado en rubí.

Shoes.app{n=ask('').to_f
r=s=5E2
a=[0,s*i="i".to_c,s*i+s,s,0]
(q=a[-3]-a[-4]
r=q.abs/s*n
a<<a[-4]+q/r)while r>1
1.upto(a.size-1){|j|line *(a[j-1].rect+a[j].rect)}}

Sin golf

Shoes.app{ 
  n=ask('').to_f                 #Open a dialog box with no message, get n from user
  r=s=5E2                        #Initialize s to sidelength=500. r can be initialized to any vale, we use the same one for convenience.
  a=[0,s*i="i".to_c,s*i+s,s,0]   #intialize array a with 5 points needed to draw a square, in complex number format (first point=0 is duplicated.)

  (
    q=a[-3]-a[-4]                #find the vector from point plotted 4 before to the following point (plotted 3 before)
    r=q.abs/s*n                  #r is the scale factor
    a<<a[-4]+q/r                 #add a new point derived from a[-4] by moving toward a[-3] by a distance s/n 
  )while r>1                     #break loop when length of line is less than s/n

  1.upto(a.size-1){|j|           #for all points except 1st and last one
    line *(a[j-1].rect+a[j].rect)#take the two complex numbers correspondimg to the current and previous point,
  }                              #convert to 2-element arrays (rectangular coordinates
}                                #combine to make a 4-element array, use * to splat into 4 parameters, and draw using the line method.

Salidas n = 4 yn = 25

ingrese la descripción de la imagen aquí

Tenga en cuenta que la forma siempre termina en un triángulo, que colapsa aún más en una línea. Reemplazar size-1con sizeno hace ninguna diferencia en la apariencia de la salida y ahorraría 2 bytes, pero lo dejé para la corrección teórica.

Salida n = 300

¡Inspirado por un comentario de OP, los números más altos se ven geniales!

ingrese la descripción de la imagen aquí

Level River St
fuente
¿Es necesario el espacio siguiente lineen la línea de fondo?
Addison Crump
@CoolestVeto lamentablemente sí. la *convierte la matriz de cuatro elementos formada por la conversión de los números complejos en cuatro parámetros para line. La sintaxis estándar es line(*(a[j-1].rect+a[j].rect))eliminar los paréntesis y agregar un espacio ya es un ahorro de un byte. Al eliminar el espacio, Ruby intenta multiplicarse linepor el contenido de los paréntesis, lo que no tiene sentido y hace que arroje un error. Hay algo de golf que hacer aquí, pero no eso. Lo investigaré más tarde.
Level River St
Estoy casi seguro de que puedes deshacerte de los padres en torno a la discusión upto. Además, ¿has intentado eliminar el ('')after ask? No lo he probado, pero puede ser innecesario
Fund Monica's Lawsuit
3
La salida para 100 es hermosa .
Addison Crump
1
@CoolestVeto Encuentro n = 100 un poco inquietante; salta y se pone todo en 3D sobre mí. He publicado n = 300, que es más oscuro en general y, por lo tanto, más tranquilo.
Level River St
3

Java, 1056 1005 985 948 522 508 507 504 502 501 493 492 488 474 465 458 bytes

import java.awt.*;interface G{static void main(String[]a){new Frame(){int s=499,o=s,e,i,x,y;{o/=new Float(a[0]);add(new Component(){public void paint(Graphics g){g.drawRect(0,0,s,s);int[]p={s,s,s,0,0,0,0,s};for(double d=s,t;d>o;t=o/d,i=e*2,x=(int)((1-t)*p[i]+t*p[(2+i)%8]+.5),y=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+.5),g.drawLine(p[(6+i)%8],p[(7+i)%8],x,y),p[i]=x,p[1+i]=y,e=++e%4,i=e*2,x=p[(2+i)%8]-p[i],y=p[(3+i)%8]-p[1+i],d=Math.sqrt(x*x+y*y));}});show();}};}}

Gracias a CoolestVeto y ECS por otras formas de reducir el tamaño. :-)

Vampiro
fuente
Ok, lo jugué un poco, pero hay más posibilidades de seguro, codifiqué demasiado orientado a objetos para ser minimalista en caracteres :-D
Vampire
@AlexA. Si más adelante mejoro mi código y lo acorto, ¿puedo simplemente actualizar la publicación con la versión más corta?
Vampiro
@ BjörnKautler Sí, eso es bueno! :) Estoy trabajando en algunos lugares para acortar ahora.
Addison Crump
1
@ BjörnKautler ¡Ciertamente puedes!
Alex A.
1
Wow, nunca he visto más de 500 bytes arrojó una respuesta. : O
Addison Crump
1

Maravilloso, 412 411 403 398 bytes

import java.awt.*
new Frame(){
def s=499,o=s/(args[0]as float),e=0,i,a,b,d,t
{add new Component(){void paint(Graphics g){g.drawRect 0,0,s,s
p=[s,s,s,0,0,0,0,s]
for(d=s;d>o;d=Math.sqrt(a*a+b*b)){t=o/d
i=e*2
a=(int)((1-t)*p[i]+t*p[(2+i)%8]+0.5)
b=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+0.5)
g.drawLine p[(6+i)%8],p[(7+i)%8],a,b
p[i]=a
p[1+i]=b
e=++e%4
i=e*2
a=p[(2+i)%8]-p[i]
b=p[(3+i)%8]-p[1+i]}}}
show()}}
Vampiro
fuente
Tengo problemas para que funcione con groovy 2.4.4: Caught: groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() at s$1.<init>(s.groovy:3) at s.run(s.groovy:2)
dieter
Con 2.3.9 funciona bien para mí.
Vampiro