Cercle aligné, n points

39

Tracez des lignes entre chaque paire de points distincts pour les npoints disposés en cercle, produisant quelque chose comme le résultat ci-dessous. Le code le plus court (en octets) gagne! Vos lignes ne doivent pas nécessairement être transparentes, mais elles ont l'air mieux ainsi. La sortie doit être un graphique vectoriel ou une image d’au moins 600 pixels par 600 pixels (enregistrée dans un fichier ou affichée à l’écran). Pour terminer le défi, vous devez tirer au moins 20.

entrez la description de l'image ici

J. Antonio Perez
la source
7
Ce serait cool si vous deviez prendre un nombre net tracer des lignes pour les npoints.
Yodle
2
Je seconde cette idée. Changez-le avant que quelqu'un obtienne la première réponse.
Shooqie
2
@shooqie Alors le titre n'aurait pas de sens, à moins que cela ne puisse être édité par les mods?
Yodle
2
Je ne pense pas que le 37 changer arbitrairement najouterait beaucoup de difficulté, car je m'attends à ce que la plupart des solutions fonctionnent avec un nombre, de toute façon, surtout parce que 37 est étrange et qu'il n'y a donc pas de symétrie miroir.
Laikoni
3
Est-ce que nous prenons ncomme entrée ou choisissons simplement un nombre arbitraire nsupérieur à 20?
Rɪᴋᴇʀ

Réponses:

26

Mathematica, 13 octets

CompleteGraph

cercle aligné 37 points

On dirait que cela ne fait que donner une circulaire n=4, mais la question ditn>=20

ngenisis
la source
1
... et il y avait moi essayant de trouver la bonne façon de faire une fonction à prendre n(j'avais la réponse prête de la 37 fixe) :(
Jonathan Allan
6
@carusocomputing Cette fonction n'a rien à voir avec la "représentation graphique" au sens de tracé. Mathematica est également très utile pour les problèmes de théorie des graphes . Avoir une fonction intégrée permettant de générer un graphe complet semble être la première chose que j'ajouterais si je prenais en charge les graphes dans mon langage. La seule raison pour laquelle cette fonction s'avère utile pour ce défi est que les graphiques complets sont rendus par défaut avec tous les sommets disposés en cercle.
Martin Ender
2
Si vous voulez gérer les graphiques, il vaut mieux avoir une fonction graphique complète intégrée, IMO.
ngenisis
2
@carusocomputing Bienvenue dans Mathematica, le langage intégré à chaque fonction existante. :-P
HyperNeutrino
1
Je téléchargeais NetLogo parce que je pensais que "les tortues multiples en feraient un travail rapide!" souvenez-vous ensuite que vous, les mathématiciens, utilisez la version adulte.
Wyldstallyns
13

MATL , 16 14 octets

Comme je ne parle pas très bien MATL, je pense que c'est un peu plus golfable. (Ce serait bien de battre au moins Mathematica :-) C'est-à-dire que le flip wn'est pas optimal, il pourrait probablement être évité ...

:G/4*Jw^2Z^!XG

Testez-le en ligne! (Merci @Suever pour ce service, merci @DrMcMoylex pour -2 octets.)

Explication (pour N=3):

  :               Generate Range 1:input:       [1,2,3]
   G/             Divide By the first input     [0.333,0.666,1]
     4*           Multiply by 4                 [1.33,2.66,4.0]
       Jw^        i ^ (the result so far)       [-0.49+ 0.86i,-.5-0.86i,1.00]
                  (This results in a list of the n-th roots of unity)
          2Z^     Take the cartesian product with itself (i.e. generate all 2-tuples of those points)
             !XG  Transpose and plot

Il convient de noter que vous pouvez utiliser la formule pour générer les N-ième racines de l' unité exp(2*pi*i*k/N)pour k=1,2,3,...,N. Mais puisque exp(pi*i/2) = ivous pouvez aussi écrire i^(4*k/N)pour k=1,2,3,...,Nce que je fais ici.

flawr
la source
1
Vous pouvez changer XH:Hde:G
DJMcMayhem
1
Aaah j'ai oublié Gmerci beaucoup!
mardi
11

PICO-8 , 131 octets

Je n'étais pas vraiment sûr de ne pas enfreindre les règles, mais je l'ai quand même fait!

Golfé

p={}for i=0,19 do add(p,{64+64*cos(i/20),64+64*sin(i/20)})end for x in all(p)do for y in all(p)do line(x[1],x[2],y[1],y[2])end end

Ungolfed

points={}

for i=0,19 do 
  x=64+64*cos(i/20)
  y=64+64*sin(i/20)
  add(points,{x,y})
end

for x in all(points) do
  for y in all(points) do
    line(x[1],x[2],y[1],y[2])
  end
end

Folie 128x128

PICO-8 est une console fantastique basée sur Lua avec une résolution native de 128x128. J'ai fait le cercle aussi grand que possible ...

Tyler MacDonell
la source
9

Mathematica, 42 octets

Crée un ensemble de 37 points disposés en cercle, puis trace des lignes entre tous les sous-ensembles possibles de deux points. Quelqu'un a posté une réponse plus courte qui tire parti de CompleteGraph, mais je crois que c'est la réponse la plus courte en dehors de celles qui s'appuient sur CompleteGraph.

Graphics@Line@Subsets[CirclePoints@37,{2}]

entrez la description de l'image ici

J. Antonio Perez
la source
3
Il n'est pas nécessaire d'éviter de tracer des lignes d'un point à l'autre, vous pouvez donc économiser 3 octets en utilisant Tuple. Vous devez également mettre à jour ceci pour accepter arbitraire n, mais cela ne vous coûtera aucun octet.
ngenisis
1
Conçu pour direTuples
ngenisis
9

HTML + JS (ES6), 34 + 177 164 162 = 196 octets

En utilisant le API HTML5 Canvas .

Voir sur CodePen .

f=n=>{with(Math)with(c.getContext`2d`)for(translate(S=300,S),O=n;O--;)for(rotate(a=PI*2/n),N=n;N--;)beginPath(stroke()),lineTo(0,S),lineTo(sin(a*N)*S,cos(a*N)*S)}


/* Demo */
f(20)
<canvas id=c width=600 height=600>

-13 octets : supprimé closePath(), déplacéstroke() intérieurbeginPath()

-2 octets : Variable définie à l' aintérieurrotate()

Darrylyeo
la source
8

Java, 346 338 322 301 octets

Cette solution fonctionne pour tous n>1 , même si le message d'origine ne l'exigeait pas.

Mon préféré est n=5, ne demandez pas pourquoi, aussi, si vous voulez une interface graphique plus cool, utilisez:

int a=Math.min(this.getHeight(),this.getWidth())/2;

À la place du 300 codé en dur, il utilisera la largeur ou la hauteur du cadre comme diamètre.

Sauvegardé 8 octets grâce à Shooqie. Sauvé 21 octets grâce à Geobits.

import java.awt.*;void m(final int n){new Frame(){public void paint(Graphics g){Point[]p=new Point[n];int a=300;for(int i=1;i<n+1;i++){p[i-1]=new Point(a+(int)(a*Math.cos(i*2*Math.PI/n)),a+(int)(a*Math.sin(i*2*Math.PI/n)));for(int j=0;j<i;j++){g.drawLine(p[i-1].x,p[i-1].y,p[j].x,p[j].y);}}}}.show();}

Sortie pour n=37:

entrez la description de l'image ici

Urne Magique De Pieuvre
la source
Vous pouvez laisser tomber Frame x=et final(je pense?)
shooqie
@shooqie oups, venait Frame xd'une autre solution qui impliquait un thread. Vous avez besoin de la version finale, car il s'agit d'une référence de classe interne à une variable externe de la classe propriétaire.
Urne magique Octopus
Cela fonctionne très bien sur ma machine. BTW, je pense que vous pouvez réduire quelques octets en déplaçant les intdéclarations en dehors des forboucles
shooqie
@shooqie dans Java 6, il est écrit "Impossible de faire référence à la variable locale non finale n dans une portée englobante" lors de la compilation.
Urne Octopus Magique
Cela a fonctionné pour moi sur Java 8, mais après avoir modifié votre message, je ne reçois plus qu'un écran blanc.
Shooqie
7

Python 2, 258 235 229 octets

import itertools as T,math as M
from PIL import Image as I,ImageDraw as D
s=300
n=input()
t=2*M.pi/n
o=I.new('RGB',(s*2,)*2)
for x in T.combinations([(s*M.cos(t*i)+s,s*M.sin(t*i)+s)for i in range(n)],2):D.Draw(o).line(x)
o.show()

Sortie pour n=37
n = 37

Barre
la source
1
Ne serait pas plus from PIL import*court?
Roman Gräf
@ RomanGräf PIL est un paquet bizarre, vous ne pouvez pas import *, en fonction de la manière dont vous installez, vous pouvez sauter le PIL et importer Image / ImageDraw directement
Rod
6

Octave, 88 69 octets

N=input('');t=0:2*pi/N:N;k=nchoosek(1:N,2)';line(cos(t)(k),sin(t)(k))

Sortie pour N=37:

entrez la description de l'image ici

Sortie pour N=19:

entrez la description de l'image ici

Stewie Griffin
la source
Oh, je ne remarquait même pas qu'il y avait déjà une autre réponse :) Octave
flawr
Quoi qu'il en soit, bravo :-)
flawr
Par mille! Ma première pensée a été gplotaussi, mais je n'ai pas réussi à le rendre assez court ...
Stewie Griffin
6

Perl, 229 octets

Il utilise la même formule que la plupart des langues qui n'ont pas été intégrée de manière pratique pour ce défi (même si je ne les ai pas regardées pour le trouver, mais c'est une formule assez facile à trouver). Donc, pas très intéressant, mais il n’ya généralement pas beaucoup de réponses Perl à ce type de défis, je voulais donc en proposer un.

$i=new Imager xsize=>700,ysize=>700;for$x(1..$_){for$y(1..$_){$i->line(color=>red,x1=>350+300*cos($a=2*pi*$x/$_),x2=>350+300*cos($b=2*pi*$y/$_),y1=>350+300*sin$a,y2=>350+300*sin$b)}}$i->write(file=>"t.png")

Et vous aurez besoin de -MImager(9 octets), -MMath::Trig(fournissant pi, 13 octets) et -n(1 octet) ==> + 23 octets.

Pour l'exécuter:

perl -MImager -MMath::Trig -ne '$i=new Imager xsize=>700,ysize=>700;for$x(1..$_){for$y(1..$_){$i->line(color=>red,x1=>350+300*cos($a=2*pi*$x/$_),x2=>350+300*cos($b=2*pi*$y/$_),y1=>350+300*sin$a,y2=>350+300*sin$b)}}$i->write(file=>"t.png")' <<< 27

Cela créera un fichier nommé t.pngcontenant l'image.

Vous aurez besoin d'installer Imagercependant, mais pas de soucis, c'est assez facile:

(echo y;echo) | perl -MCPAN -e 'install Imager'

(Le echos vous configurera cpan si vous ne l’avez jamais utilisé auparavant (en fait, cela ne fonctionnera que si votre perl est assez récent, je pense que pour la plupart d’entre vous, ce sera le cas, et je suis désolé pour les autres!)) .

Et la version la plus lisible (oui, c'est assez lisible pour un script Perl!):

#!/usr/bin/perl -n
use Imager;
use Math::Trig;
$i=Imager->new(xsize=>700,ysize=>700);
for $x (1..$_){
    for $y (1..$_){
    $i->line(color=>red,x1=>350+300*cos($a=2*pi*$x/$_), x2=>350+300*cos($b=2*pi*$y/$_),
         y1=>350+300*sin($a), y2=>350+300*sin($b));
    }
}
$i->write(file=>"t.png");

entrez la description de l'image ici

-1 octet grâce à Titus.

Dada
la source
Est-ce que Perl nécessite des accolades autour des commandes simples?
Titus
@ Titus Si vous faites référence aux accolades après les forboucles, alors oui, elles sont obligatoires.
Dada
Il y a un blanc avant y2. Je parie que vous n'en avez pas besoin. Et pouvez-vous écrire à STDOUT?
Titus
@ Titus hmm en effet, merci. Je pense que mon terminal a mis une nouvelle ligne ici, donc je n'ai pas vu l'espace.
Dada
5

GeoGebra , 92 octets

a=polygon((0,0),(1,0),20)
sequence(sequence(segment(vertex(a,i),vertex(a,j)),j,1,20),i,1,20)

Chaque ligne est entrée séparément dans la barre de saisie. Voici un gif montrant l'exécution:

Exécution

Comment ça marche

La polygoncommande crée un polygone à 20 côtés, avec les sommets de la ligne de base (0,0)et (1,0). La commande suivante parcourt ensuite chaque sommet du polygone indexé i, à l'aide des commandes sequenceand vertex, et pour chaque sommet indexé i, trace un segment de droite sur chaque autre sommet indexé jà l'aide de la segmentcommande.

TheBikingViking
la source
4

PHP, 186 184 196 octets

imagecolorallocate($i=imagecreate(601,601),~0,~0,~0);for(;$a<$p=2*M_PI;)for($b=$a+=$p/=$argv[1];$b>0;)imageline($i,(1+cos($a))*$r=300,$r+$r*sin($a),$r+$r*cos($b-=$p),$r+$r*sin($b),1);imagepng($i);

écrit l'image sur STDOUT

panne

// create image with white background
imagecolorallocate($i=imagecreate(601,601),~0,~0,~0);

// loop angle A from 0 to 2*PI
for(;$a<$p=2*M_PI;)
    // loop angle B from A down to 0
    for($b=$a+=$p/=$argv[1];$b;)    // ($a pre-increment)
        // draw black line from A to B
        imageline($i,                           // draw line
            (1+cos($a))*$r=300,$r+$r*sin($a),   // from A
            $r+$r*cos($b-=$p),$r+$r*sin($b),    // to B ($b pre-decrement)
            1                                   // undefined color=black
        );
// output
imagepng($i);

-12 octets pour fixe n=20

Remplacer $p=2*M_PIpar 6(-8), /=$argv[1]par =M_PI/10(-2) et $b>0par $b(-2)

L'utilisation exacte de PI / 10 ne fait pas mal. Avec .3142, les erreurs d'arrondis de la version paramétrée sont restées, mais avec M_PI/10elles ont disparu et je peux vérifier $b(<> 0) au lieu de $b>0. J'aurais pu économiser deux octets avec.314 , mais cela aurait compensé les points.

La limite $a<6est suffisamment précise pour 20 points.

graphique PI exact

174 octets pour fixe n=314

imagecolorallocate($i=imagecreate(601,601),~0,~0,~0);for(;$a<314;)for($b=$a++;$b--;)imageline($i,(1+cos($a))*$r=300,$r+$r*sin($a),$r+$r*cos($b),$r+$r*sin($b),1);imagepng($i);

En utilisant 314 points, on obtient un cercle rempli dans cette résolution (comme le font 136 140, chaque nombre pair supérieur à 317).

Titus
la source
1
Bonne réponse, mais il semble que vous ayez codé en dur 20 au lieu de prendre cela comme entrée?
Riking
1
@Riking: Vrai. Mais je ne vois aucune demande dans le défi pour le paramétrer.
Titus
4

NetLogo - 44 octets

cro 20[create-links-to other turtles fd 20]

Sortie NetLogo

wyldstallyns
la source
4

R, 127 123 octets

plot((e=cbind(sin(t<-seq(0,2*pi,l=(n=21)))*2,cos(t)*2)));for(i in 2:n)for(j in 1:i)lines(c(e[i,1],e[j,1]),c(e[i,2],e[j,2]))

Produit:

Les étiquettes de Nice Axe, euh?

-4 octets grâce à @Titus!

Frédéric
la source
1
Pas plus court, mais ça pourrait être plus rapide avec for(i in 2:n){for(j in 1:i)...}. Avez-vous Rbesoin des accolades?
Titus
@Titus Tu as raison! Et non, pas besoin d'accolades là-bas. Merci !
Frédéric
3

BBC BASIC, 98 caractères ascii

Taille de fichier en jetons 86 octets

r=600V.5142;29,r;r;:I.n:t=2*PI/n:F.i=1TOn*n:a=i DIVn*t:b=i MODn*t:L.r*SINa,r*COSa,r*SINb,r*COSb:N.

Téléchargez l'interprète à l' adresse http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Il n'y a rien de mal à tracer chaque ligne deux fois, l'apparence est identique :-P

Ungolfed

  r=600                              :REM Radius 600 units. 2 units per pixel, so 300 pixels
  VDU5142;29,r;r;                    :REM Set mode 20 (600 pixels high) and move origin away from screen corner
  INPUTn                             :REM Take input.
  t=2*PI/n                           :REM Step size in radians.
  FORi=1TOn*n                        :REM Iterate through all combinations.
    a=i DIVn*t                       :REM Get two angles a and b
    b=i MODn*t                       :REM by integer division and modlo
    LINEr*SINa,r*COSa,r*SINb,r*COSb  :REM calculate cartesian coordinates and draw line
  NEXT

Sortie n = 21

Cela semble beaucoup mieux dans le rendu original que dans le navigateur.

<code> entrez la description de l'image ici </ code>

Level River St
la source
Merci de me rappeler de la LINEfonction. Beats DRAW...
Steenbergh
3

Octave, 50 48 46 45 octets

@(N)gplot((k=0:2*pi/N:N)+k',[cos(k);sin(k)]')

C'est une fonction quelconque qui trace le graphique que nous recherchons.

Explication:

(k=0:2*pi/N:N)+k'Crée une N+1 x N+1matrice d'adressage complète et définit simultanément le vecteur kd'angles, que nous utilisons ensuite pour [cos(k);sin(k)]'une matrice de coordonnées où chaque nœud de graphe est positionné.gplottrace simplement le graphique que nous voulons.

Pour N = 29nous obtenons:

entrez la description de l'image ici

flawr
la source
2

JavaScript (ES5) / SVG (HTML5), 181 octets

document.write('<svg viewBox=-1e3,-1e3,2e3,2e3><path stroke=#000 fill=none d=M1e3,0')
with(Math)for(i=37;--i;)for(j=37;j--;)document.write('L'+1e3*cos(a=i*j*PI*2/37)+','+1e3*sin(a))

Ne fonctionne que pour les nombres premiers, tels que la suggestion initiale de 37. Vous pouvez diviser par deux (arrondi) la valeur initiale de ipour obtenir une image plus pâle. Vous pouvez également constamment ajuster les 1e3,2e3valeurs sur d’autres goûts (j’ai commencé 300,600mais j’ai décidé que c’était trop grossier).

Neil
la source
2

MATLAB, 36 octets

@(n)plot(graph(ones(n),'Om'),'La','c')

C'est une fonction anormale qui crée l'intrigue.

@(n)                                     Define an anonymous fuction of 𝘯
               ones(n)                   Create an 𝘯×𝘯 matrix of ones
         graph(       ,'Om')             Create a graph object with that adjacency
                                         matrix, omitting self-loops
    plot(                   ,'La','c')   Plot the graph with a circular layout

Exemple:

entrez la description de l'image ici

entrez la description de l'image ici

Luis Mendo
la source
Je suis surpris que cela graphne fasse pas partie de la boîte à outils bioinformatique ... je ne savais même pas qu'elle existait ... Nice :)
Stewie Griffin
1

QBasic 4.5, 398 271 octets

CLS:SCREEN 11:DEFSTR M-Z:DEFDBL A-L
INPUT"N",A:I=(360/A)*.0175:J=230
Q=",":FOR E=0 TO A
FOR F=E TO A
M=x$(COS(I*E)*J+J):N=x$(SIN(I*E)*J+J):O=x$(COS(I*F)*J+J):P=x$(SIN(I*F)*J+J):DRAW "BM"+M+Q+N+"M"+O+Q+P
NEXT:NEXT
FUNCTION x$(d):x$=LTRIM$(STR$(CINT(d))):END FUNCTION

L’écran de QBasic n’est que de 640x480, le cercle a donc un rayon de 230 px seulement, malheureusement. En outre, il y a des artefacts dus à la perte de précision float-to-int. Ressemble à ceci pour N=36: entrez la description de l'image ici

EDIT: Je n'ai pas eu besoin du stockage, de la déclaration de type ni de tout le bouclage. Le calcul de tous les Carthesians from Polars est 50% moins cher en nombre d'octets ...

Steenbergh
la source
1

QBIC , 98 94 octets

$SCREEN 11|:i=6.3/a j=230[0,a|[b,a|line(cos(b*i)*j+j,sin(b*i)*j+j)-(cos(c*i)*j+j,sin(c*o)*j+j)

J'ai converti ma réponse QBasic d'origine @LevelRiverSt en QBIC. Je pensais que cela reposerait trop sur des fonctions qui ne sont pas intégrées à QBIC pour être réalisables, mais il s'avère que cela économise 90 octets supplémentaires. En remplaçant le DRAWpour, vous LINEenregistrez 80 octets supplémentaires. Je savais que j'oubliais quelque chose de simple ...

Lorsqu'il est exécuté avec un paramètre de ligne de commande de 36, il ressemble à ceci:

entrez la description de l'image ici

Steenbergh
la source
1

Traitement, 274 octets (239 + sizeappel et appel de fonction)

void d(int s){float a=2*PI/s,x=0,y=-400,m,n;float[][]p=new float[2][s];translate(400,400);for(int i=0;i<s;i++){m=x*cos(a)-y*sin(a);n=x*sin(a)+y*cos(a);x=m;y=n;p[0][i]=x;p[1][i]=y;for(int j=0;j<i;j++)line(p[0][j],p[1][j],p[0][i],p[1][i]);}}
void setup(){size(800,800);d(50);}

Honnêtement, je ne sais pas pourquoi, mais je setupdevais être en deuxième ligne. j'ai utilisé https://en.wikipedia.org/wiki/Rotation_matrix pour m'aider à calculer le calcul de la rotation. Ce programme calcule les points et les place dans un tableau avec lequel nous utilisons pour tracer des lignes.

Voici une image d'un polygone à 50 arêtes (celle des 100 arêtes était presque entièrement noire)

50 points

Vous pouvez ajouter stroke(0,alpha);des bords transparents, où alphaest l'opacité de la ligne. Voici le même polygone avec alphade 20.

entrez la description de l'image ici

Kritixi Lithos
la source
1

Bash + Jelly + GraphViz, 52 caractères, 52 ou 63 octets

Étant donné que les programmes en question ne sont pas d’accord sur le codage de caractères à utiliser, le programme est rempli de caractères de contrôle. Voici à quoi cela ressemble en dessous xxd, en codage Latin-1 (qui représente chaque caractère sur un octet):

00000000: 6a65 6c6c 7920 6520 2793 5213 636a 0c8e  jelly e '.R.cj..
00000010: 2d2d 59fe 9a3f 1d15 dc65 34d3 8442 7f05  --Y..?...e4..B..
00000020: 1172 80cf fb3b ff7d 277c 6369 7263 6f20  .r...;.}'|circo 
00000030: 2d54 7073                                -Tps

Cependant, je ne pouvais pas exécuter le programme sans convertir l’entrée en UTF-8 pour une raison quelconque (ce qui lui donnerait une longueur de 63 octets). Logiquement, cela devrait fonctionner comme Latin-1 - aucun des caractères ne se trouve en dehors de la plage comprise entre 0 et 255 - mais je continue à avoir des erreurs "indice de chaîne hors de la plage", quelle que soit la configuration des variables d'environnement de codage de caractères. Il faudra donc compter 63 octets à moins que quelqu'un puisse trouver un moyen de l'exécuter sans le ré-encoder.

Le programme pourrait être légèrement plus lisible si nous l’interprétons dans le codage de Jelly:

jelly e 'ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}'|circo -Tps

Le programme prend le nombre de points sur l'entrée standard et génère une image PostScript sur la sortie standard. (Il peut être adapté de manière triviale à la sortie dans n’importe quel format pris en charge par GraphViz en modifiant le dernier -Tps; c’est simplement que PostScript porte le nom le plus court. On peut soutenir que vous pouvez enregistrer cinq caractères en supprimant le -Tps, mais vous obtenez une sortie au format d’image interne de GraphViz. que rien d’autre ne prend en charge, ce qui ne compte probablement pas pour les besoins de la question.)

Fondamentalement, il s’agit simplement d’un programme Jelly qui fait appel à GraphViz pour effectuer le dessin; Cependant, Jelly ne semble pas avoir de capacités pour exécuter des programmes externes, j'ai donc dû utiliser bash pour les lier ensemble. (Cela signifie également qu'il est moins coûteux de saisir manuellement les requêtes Jelly à partir de stdin; normalement, elles sont saisies à partir de la ligne de commande, mais cela signifierait des octets supplémentaires dans le wrapper bash.) circoOrganisera automatiquement tous les points qu'il est demandé de dessiner en cercle. , le code Jelly doit donc lui demander de dresser une liste de points, qui sont tous connectés les uns aux autres. Voici comment cela fonctionne:

ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}
Ɠ                               read number from stdin
 R                              produce range from 1 to that number
                                (here used to produce a list with
                                that many distinct elements)
  Œc                            select all unordered pairs from that
      ⁾--                       a string consisting of two hyphens
    j€                          join each pair via the string
         Y                      join on newlines
                            ;   prepend (in this context)
          “Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»    "graph{node[shape=point]"
                             ”} follow output with a "}" character

L'utilisation de Jelly nous permet de compresser légèrement la chaîne qui configure la sortie GraphViz via son dictionnaire intégré. Le dictionnaire a graph, nodeet point. Ennuyeusement, il n'a pas shape(il aSHAPE , mais GraphViz est sensible à la casse), nous devons donc encoder ce caractère par caractère.

Voici le résultat pour l'entrée 21 (avec une légère modification du programme pour le rendre dans un format pouvant être téléchargé sur Stack Exchange):

graphe complet sur 21 points


la source
0

PHP + HTML SVG, 316 263 octets

Version golfée avec npoints codés en dur et sans nparamètre d' entrée :

<svg height="610" width="610"><?for($i=1;$i<33;$i++){$x[]=300*sin(2*M_PI/32*$i)+305;$y[]=300*cos(2*M_PI/32)+305;}foreach($x as$j=>$w){foreach($y as$k=>$z){echo'<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" style="stroke:red;"/>';}}?></svg>

Version précédente avec paramètre d'entrée pour les npoints, 316 octets:

<svg height="610" width="610"><?$n=$_GET[n];$d=2*M_PI/$n;$r=300;$o=305;for($i=1;$i<=$n;$i++){$x[]=$r*sin($d*$i)+$o;$y[]=$r*cos($d*$i)+$o;}foreach($x as$j=>$w){foreach($y as$k=>$z){echo'<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" style="stroke:rgba(0,0,0,.15);stroke-width:1;" />';}}?></svg>

Utilisation: enregistrer dans un fichier et appeler depuis le navigateur:

http://localhost/codegolf/circle.php?n=32

Version non-golfée avec paramètre d'entrée pour les npoints et les CSS:

<style>
line {
    stroke: rgba(0,0,0,.15);
    stroke-width:1;
}
</style>
<svg height="610" width="610">
<?php
$n=$_GET[n]; // number of points
$d=2*M_PI/$n; // circle parts
$r=300; // circle radius
$o=305; // offset x,y
for ($i=1;$i<=$n;$i++){
    $x[]=$r*sin($d*$i)+$o; // store x,y coordinates in array
    $y[]=$r*cos($d*$i)+$o;
}
foreach($x as $j => $w){ // iterate all x,y points and connect to each other
    foreach($y as $k => $z) {
        echo '<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" />'."\n";   
    }
}
?>
</svg>

Impossible de joindre un extrait de code entièrement fonctionnel à 32 points en raison de la limite de 30 000 caractères pour un seul message. Voici une capture d'écran:

entrez la description de l'image ici

L'extrait joint est limité à 18 points en raison de la limite de 30 000 messages.

Mario
la source
0

R, 108 octets

plot(x<-cos(t<-seq(0,2*pi,l=21)),y<-sin(t),as=1);apply(expand.grid(1:21,1:21),1,function(e)lines(x[e],y[e]))

Pourrais perdre 5 octets si je me débarrassais de l'argument ,as=1qui force un rapport de forme de 1. Utilisé expand.gridpour créer une matrice avec toutes les paires de points possibles, et utilise applypour le parcourir en boucle.

N = 21

R + igraph, 87 octets

Une autre solution utilisant package igraph.

library(igraph);plot(make_full_graph(21),layout=cbind(cos(t<-seq(0,2*pi,l=21)),sin(t)))

N = 21

planificateur
la source