Dessinez une spirale dans une boîte


13

spirale

Cette spirale géométrique semble compliquée, mais elle est assez simple à dessiner; prenez la case suivante:

boîte

Tracez une ligne droite entre le coin de la boîte et une certaine distance définie au-dessus du coin suivant dans le sens antihoraire.

1 ligne

Continuez ce modèle vers l'intérieur, en restant toujours à cette distance définie du coin de la ligne suivante. Voici quelques lignes supplémentaires.

lignes de moar

Comme vous pouvez le voir, au fur et à mesure que le motif continue, la spirale s'approche du centre et les boîtes que vous dessinez commencent à tourner. Notez que la distance reste constante, quel que soit l'angle.

Le défi

L'inspiration (et aussi grâce à la merveilleuse personne qui m'a fait découvrir ce concept <3)

Étant donné une entrée numérique (éventuellement fractionnée) de 1 à 25, écrivez une image sur le disque qui utilise ce modèle ou affichez la sortie à l'écran, où la distance de chaque coin est la distance d'un côté initial de la boîte divisée par l'entrée . Continuez le motif vers l'intérieur jusqu'à ce que la distance du coin spécifié soit plus longue que la longueur du côté suivant.

Règles

  • Vous ne pouvez pas utiliser de modules intégrés pour cette création en spirale, mais vous pouvez utiliser des modules intégrés de traitement d'image.
  • Si vous écrivez sur le disque, vous devez générer une image au format .jpg, .gif, .tiff, .pbm, .ppm et .png.
  • La longueur initiale du côté doit être d'au moins 500 pixels.
  • Le coin initial peut être celui que vous choisissez.
  • Comme toujours, les échappatoires standard sont interdites.


Y a-t-il un minimum pour combien de niveaux cette profondeur doit être profonde?
LegionMammal978

@ LegionMammal978 Je ne demanderais jamais une entrée supérieure à 25, j'ajouterai cela.
Addison Crump

L'inclusion de .pbm ou .ppm pourrait aider certains des langages les moins graphiques.
trichoplax

Réponses:


12

Chaussures (Ruby) 163 octets

Shoes est une boîte à outils GUI basée sur rubis.

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)}}

Non 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.

Sorties n = 4 et n = 25

entrez la description de l'image ici

Notez que la forme se termine toujours par un triangle, qui se réduit davantage à une ligne. Le remplacement size-1par sizene fait aucune différence sur l'apparence de la sortie et permettrait d'économiser 2 octets, mais je l'ai laissé pour une correction théorique.

Sortie n = 300

Inspiré par un commentaire de OP, les chiffres les plus élevés ont fière allure!

entrez la description de l'image ici


L'espace suivant linedans la ligne du bas est-il nécessaire?
Addison Crump

@CoolestVeto malheureusement oui. le *convertit le tableau à quatre éléments formé par la conversion des nombres complexes en quatre paramètres pour line. La syntaxe standard consiste line(*(a[j-1].rect+a[j].rect))donc à supprimer les parenthèses et à ajouter un espace représente déjà une économie d'un octet. La suppression de l'espace fait que Ruby essaie de se multiplier linepar le contenu des parenthèses, ce qui n'a aucun sens et provoque une erreur. Il y a du golf à faire ici, mais pas ça. J'y reviendrai plus tard.
Level River St

Je suis presque certain que vous pouvez vous débarrasser des parens autour de l'argument upto. De plus, avez-vous essayé de supprimer l' ('')after ask? Je ne l'ai pas testé, mais cela peut être inutile
Fund Monica's Lawsuit

3
La sortie pour 100 est magnifique .
Addison Crump

1
@CoolestVeto Je trouve n = 100 un peu dérangeant; il saute et passe tout en 3D sur moi. J'ai posté n = 300 qui est globalement plus sombre et donc plus calme.
Level River St

3

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

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();}};}}

Merci à CoolestVeto et ECS pour encore d'autres façons de réduire la taille. :-)


Ok, je l'ai un peu joué au golf, mais il y a plus de possibilités, j'ai codé trop orienté objet pour être minimaliste :-D
Vampire

@AlexA. Si plus tard, j'améliore mon code et le raccourcis, puis-je simplement mettre à jour le message avec la version plus courte?
Vampire

@ BjörnKautler Yup, c'est bien! :) Je travaille sur quelques endroits pour raccourcir en ce moment.
Addison Crump

1
@ BjörnKautler Vous pouvez certainement!
Alex A.

1
Wow, je n'ai jamais vu plus de 500 octets jeté une réponse. : O
Addison Crump

1

Groovy, 412 411 403 398 octets

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()}}

J'ai des problèmes pour le faire fonctionner avec 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

Avec 2.3.9, cela fonctionne bien pour moi.
Vampire
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.