Círculo alineado, n puntos

39

Dibuje líneas entre cada par de puntos distintos para los npuntos dispuestos en un círculo, produciendo algo así como el resultado a continuación. ¡El código más corto (en bytes) gana! Sus líneas no tienen que ser transparentes, pero se ve mejor así. La salida debe ser un gráfico vectorial o una imagen de al menos 600 píxeles por 600 píxeles (ya sea guardada en un archivo o mostrada en la pantalla). Para completar el desafío debes dibujar al menos 20.

ingrese la descripción de la imagen aquí

J. Antonio Perez
fuente
77
Sería genial si tuviera que tomar un número ny dibujar líneas para obtener npuntos.
Yodle
2
Secundo esta idea. Cámbielo antes de que alguien obtenga la primera respuesta.
shooqie
2
@shooqie ¿Entonces el título no tendría sentido, a menos que los mods puedan editarlo?
Yodle
2
No creo que cambiar 37 a un arbitrario nagregaría mucho al desafío, ya que espero que la mayoría de las soluciones funcionen con cualquier número de todos modos, especialmente porque 37 es impar y, por lo tanto, no hay simetrías espejo.
Laikoni
3
¿Tomamos ncomo entrada o simplemente elegimos un arbitrario nsobre 20?
Rɪᴋᴇʀ

Respuestas:

26

Mathematica, 13 bytes

CompleteGraph

alineado-círculo-37-puntos

Parece que esto solo no puede dar una incrustación circular n=4, pero la pregunta dicen>=20

ngenisis
fuente
1
... y estaba tratando de encontrar la forma correcta de hacer una función n(tenía la respuesta lista de los 37 arreglados) :(
Jonathan Allan
66
@carusocomputing Esta función no tiene nada que ver con "graficar" en el sentido de trazar. Mathematica también es muy bueno para problemas de teoría de grafos y tener un incorporado para generar un gráfico completo parece ser lo primero que agregaría si agregara soporte para gráficos a mi idioma. La única razón por la que esta función resulta útil para este desafío es que los gráficos completos se representan por defecto con todos los vértices dispuestos en un círculo.
Martin Ender
2
Si va a admitir gráficos, es mejor que tenga una función gráfica completa, IMO.
ngenisis
2
@carusocomputing Bienvenido a Mathematica, el lenguaje que tiene incorporado una función para cada función existente. :-P
HyperNeutrino
1
Estaba descargando NetLogo porque pensé "¡la tortuga múltiple hará un trabajo corto de esto!" luego recordé que los matemáticos están usando la versión adulta.
wyldstallyns
13

MATL , 16 14 bytes

Como no soy terriblemente fluido con MATL, espero que esto sea algo más golfable. (Sería bueno al menos vencer a Mathematica :-) Es decir, el cambio wno es óptimo, probablemente podría evitarse ...

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

¡Pruébelo en línea! (Gracias @Suever por este servicio, gracias @DrMcMoylex por -2 bytes).

Explicación (para 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

Vale la pena señalar que para generar las enésimas raíces de la unidad, puede usar la fórmula exp(2*pi*i*k/N)para k=1,2,3,...,N. Pero ya exp(pi*i/2) = ique también podrías escribir i^(4*k/N)para k=1,2,3,...,Nque es lo que estoy haciendo aquí.

falla
fuente
1
Puede cambiar XH:Ha:G
DJMcMayhem
1
Aaah me olvidé de Gmuchas gracias!
defecto
11

PICO-8 , 131 bytes

No estaba realmente seguro si estaría rompiendo alguna regla, ¡pero lo hice de todos modos!

Golfed

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

Sin golf

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

128x128 locura

PICO-8 es una consola de fantasía basada en Lua con una resolución nativa de 128x128. Hice el círculo lo más grande que pude ...

Tyler MacDonell
fuente
9

Mathematica, 42 bytes

Crea un conjunto de 37 puntos dispuestos en un círculo y luego dibuja líneas entre todos los subconjuntos posibles de dos puntos. Alguien publicó una respuesta más corta que aprovecha CompleteGraph, pero creo que esta es la más corta, aparte de las que dependen de CompleteGraph.

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

ingrese la descripción de la imagen aquí

J. Antonio Perez
fuente
3
No es necesario evitar dibujar líneas desde un punto en sí mismo, por lo que puede ahorrar 3 bytes al usar Tuple. También necesita actualizar esto para aceptar arbitrario n, pero convenientemente eso no le costará ningún byte.
ngenisis
1
Tuples
Me refiero
9

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

Usando la API HTML5 Canvas .

Véalo en 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 bytes : eliminado closePath(), movido stroke()dentrobeginPath()

-2 bytes : variable definida adentrorotate()

Darrylyeo
fuente
8

Java, 346 338 322 301 Bytes

Esta solución funciona para todos n>1, aunque la publicación original no lo requería, sí lo hace.

Mi favorito es n=5, no preguntes por qué, también, si quieres una GUI más fresca, usa:

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

En lugar del 300 codificado, usará el ancho o la altura del marco como el diámetro.

Guardado 8 bytes gracias a Shooqie. Guardado 21 bytes gracias a 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();}

Salida para n=37:

ingrese la descripción de la imagen aquí

Urna de pulpo mágico
fuente
Puedes caer Frame x=y final(creo)
shooqie
@shooqie oops, Frame xera de otra solución que involucraba un hilo. Sin embargo, necesita el final ya que es una referencia de clase interna a una variable externa en la clase propietaria.
Urna de pulpo mágico el
Funciona bien en mi máquina. Por cierto, creo que puede reducir algunos bytes moviendo las intdeclaraciones fuera de los forbucles
shooqie
@shooqie en Java 6 dice "No se puede hacer referencia a la variable local no final n en un ámbito de inclusión" en tiempo de compilación.
Urna mágica del pulpo del
Funcionó para mí en Java 8, pero después de editar su publicación, solo obtengo una pantalla en blanco.
shooqie
7

Python 2, 258 235 229 Bytes

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

Salida para n=37
n = 37

Barra
fuente
1
¿No sería from PIL import*más corto?
Roman Gräf
@ RomanGräf PIL es un paquete extraño, no puedes import *, dependiendo de cómo lo instales, puedes saltear el PIL e importar Image / ImageDraw directamente
Rod
6

Octava, 88 69 bytes

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

Salida para N=37:

ingrese la descripción de la imagen aquí

Salida para N=19:

ingrese la descripción de la imagen aquí

Stewie Griffin
fuente
Oh, no me había dado cuenta de que ya existía otra respuesta Octave :)
flawr
De todos modos, batir ya :-)
flawr
Por una milla! Mi primer pensamiento gplottambién fue , pero no pude hacerlo lo suficientemente corto ...
Stewie Griffin
6

Perl, 229 bytes

Utiliza la misma fórmula que la mayoría de los idiomas que no tienen una solución integrada conveniente para este desafío (incluso si no los miré para encontrarlo, pero esa es una fórmula bastante fácil de encontrar). Por lo tanto, no es muy interesante, pero por lo general no hay muchas respuestas de Perl para este tipo de desafíos, así que solo quería proponer uno.

$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")

Y necesitará -MImager(9 bytes), -MMath::Trig(proporcionando pi, 13 bytes) y -n(1 byte) ==> + 23 bytes.

Para ejecutarlo:

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

Creará un archivo llamado t.pngque contiene la imagen.

Sin Imagerembargo, deberá instalarlo , pero no se preocupe, es bastante fácil:

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

(Los echos lo configurarán cpan si nunca lo ha usado antes (en realidad, eso solo funcionará si su perl es lo suficientemente reciente, creo que para la mayoría de ustedes lo será, ¡y lo siento por los demás!)) .

Y la versión más legible (sí, ¡es bastante legible para 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");

ingrese la descripción de la imagen aquí

-1 byte gracias a Titus.

Dada
fuente
¿Perl requiere llaves alrededor de comandos individuales?
Titus
@Titus Si se refiere a las llaves después de los forbucles, entonces sí, son obligatorios.
Dada
Hay un espacio en blanco antes y2. Apuesto a que no necesitas eso. ¿Y puedes escribir a STDOUT?
Titus
@Titus hmm de hecho, gracias. Creo que mi terminal puso una nueva línea aquí, así que no vi el espacio.
Dada
5

GeoGebra , 92 bytes

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

Cada línea se ingresa por separado en la barra de entrada. Aquí hay un gif que muestra la ejecución:

Ejecución

Cómo funciona

El polygoncomando crea un polígono de 20 lados, con los vértices de la línea base en (0,0)y (1,0). El siguiente comando itera sobre cada vértice del polígono con índice i, usando los comandos sequencey vertex, y para cada vértice con índice i, dibuja un segmento de línea a cada vértice con índice jusando el segmentcomando.

TheBikingViking
fuente
4

PHP, 186 184 196 bytes

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

escribe la imagen en STDOUT

Descompostura

// 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 bytes para fijo n=20

Reemplace $p=2*M_PIcon 6(-8), /=$argv[1]con =M_PI/10(-2) y $b>0con $b(-2)

Usar PI / 10 exacto no hace daño. Con .3142, los errores de redondeo de la versión parametrizada permanecieron, pero con M_PI/10ellos desaparecieron y puedo verificar $b(<> 0) en lugar de $b>0. Podría haber guardado dos bytes con .314, pero eso habría compensado los puntos.

El límite $a<6es suficientemente exacto para 20 puntos.

gráfico PI exacto

174 bytes para fijo 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);

El uso de 314 puntos da como resultado un círculo lleno en esa resolución (al igual que 136,140, ​​cada número par por encima de eso y todo por encima de 317).

Titus
fuente
1
Buena respuesta, pero parece que has codificado 20 en lugar de tomar eso como entrada.
Riking
1
@Riking: cierto. Pero no veo ninguna demanda en el desafío de parametrizarlo.
Titus
4

NetLogo - 44 bytes

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

Salida de NetLogo

wyldstallyns
fuente
4

R, 127 123 bytes

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

Produce:

Etiquetas de eje agradable ¿eh?

-4 bytes gracias a @Titus!

Frédéric
fuente
1
No más corto, pero podría ser más rápido con for(i in 2:n){for(j in 1:i)...}. ¿ RRequiere los frenos?
Titus
@Titus Tienes razón! Y no, no se necesitan frenos allí. Gracias !
Frédéric
3

BBC BASIC, 98 caracteres ascii

Tamaño de archivo tokenizado 86 bytes

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.

Descargar intérprete en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

No hay nada de malo en dibujar cada línea dos veces, la apariencia es idéntica :-P

Sin golf

  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

Salida n = 21

Esto se ve mucho mejor en la representación original que en el navegador.

<code> ingrese la descripción de la imagen aquí </code>

Level River St
fuente
Gracias por recordarme la LINEfunción. Beats DRAW...
steenbergh
3

Octava, 50 48 46 45 bytes

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

Esta es una función anónima que traza el gráfico que estamos buscando.

Explicación:

(k=0:2*pi/N:N)+k'N+1 x N+1Crea una matriz de adyacencia completa y simultáneamente define el vector kde ángulos, que usamos para [cos(k);sin(k)]'una matriz de coordenadas donde se ubica cada nodo del gráfico. gplotsimplemente traza el gráfico que queremos.

Porque N = 29obtenemos:

ingrese la descripción de la imagen aquí

falla
fuente
2

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

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

Solo funciona para números primos, como la sugerencia original de 37. Puede reducir a la mitad (redondear) el valor inicial de ipara obtener una imagen más débil. También puede ajustar consistentemente 1e3,2e3a otros valores al gusto (comencé con, 300,600pero decidí que era demasiado grueso).

Neil
fuente
2

MATLAB, 36 bytes

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

Esta es una función anónima que crea la trama.

@(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

Ejemplo:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Luis Mendo
fuente
Me sorprende graphque no sea parte de la caja de herramientas bioinformáticas ... ni siquiera sabía que existía ... Agradable :)
Stewie Griffin
1

QBasic 4.5, 398 271 bytes

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

La pantalla en QBasic solo puede ser 640x480, por lo que el círculo tiene un radio de solo 230 px, desafortunadamente. Además, hay algunos artefactos debido a la pérdida de precisión flotante a int. Se ve así para N=36: ingrese la descripción de la imagen aquí

EDITAR: no necesitaba el almacenamiento, la declaración de tipo y todo el bucle. Calcular todos los carthesianos a partir de Polares en su lugar es un 50% más barato en conteo de bytes ...

Steenbergh
fuente
1

QBIC , 98 94 bytes

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

He convertido mi respuesta original de QBasic @LevelRiverSt 's respuesta a QBIC. Pensé que esto dependería demasiado de las funciones que no están integradas en QBIC para ser factible, pero resulta que ahorra otros 90 bytes. Sustituyendo DRAWpor LINEguarda otros 80 bytes. Sabía que estaba olvidando algo simple ...

Cuando se ejecuta con un parámetro de línea de comando de 36, se ve así:

ingrese la descripción de la imagen aquí

Steenbergh
fuente
1

Procesamiento, 274 bytes (239 + sizellamada y llamada a función)

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

Sinceramente, no sé por qué, pero setuptenía que estar en la segunda línea. Usé https://en.wikipedia.org/wiki/Rotation_matrix para ayudarme a calcular las matemáticas para la rotación. Este programa calcula los puntos y los empuja a una matriz, con la que estamos utilizando para dibujar líneas.

Aquí hay una imagen de un polígono con 50 bordes (el de 100 bordes era casi completamente negro)

50 puntos

Puede agregar stroke(0,alpha);para tener bordes transparentes, donde alphaestá la opacidad de la línea. Aquí está el mismo polígono con alphade 20.

ingrese la descripción de la imagen aquí

Kritixi Lithos
fuente
1

Bash + Jelly + GraphViz, 52 caracteres, 52 o 63 bytes

Dado que los programas en cuestión no están de acuerdo sobre qué codificación de caracteres utilizar, el programa está lleno de caracteres de control. Esto es lo que parece debajo xxd, en la codificación Latin-1 (que representa cada carácter en un byte):

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

Sin embargo, no pude hacer que el programa se ejecute sin convertir la entrada en UTF-8 por alguna razón (lo que lo haría 63 bytes de largo). Lógicamente, debería funcionar como Latin-1 (ninguno de los caracteres está fuera del rango de 0 a 255), pero sigo obteniendo errores de "índice de cadena fuera de rango" sin importar cómo configuro las variables de entorno de codificación de caracteres. Por lo tanto, esto tendrá que contarse como 63 bytes, a menos que alguien pueda encontrar una manera de ejecutarlo sin volver a codificarlo.

El programa podría ser un poco más legible si lo interpretamos en la codificación de Jelly:

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

El programa toma el número de puntos en la entrada estándar y genera una imagen PostScript en la salida estándar. (Se puede adaptar trivialmente a la salida en cualquier formato que GraphViz admita cambiando -Tpsal final; es solo que PostScript tiene el nombre más corto. Posiblemente, puede guardar cinco caracteres quitando el -Tps, pero luego obtiene la salida en el formato de imagen interno de GraphViz que nada más admite, lo que probablemente no cuenta para los propósitos de la pregunta).

Básicamente, este es solo un programa Jelly que llama a GraphViz para hacer el dibujo; sin embargo, Jelly no parece tener ninguna capacidad para ejecutar programas externos, por lo que tuve que usar bash para vincularlos. (Esto también significa que es más barato hacer que Jelly solicite la entrada de stdin manualmente; normalmente toma la entrada de la línea de comando, pero eso significaría bytes adicionales en el contenedor bash). Organizará circoautomáticamente todos los puntos que se le pide que dibuje en un círculo. , por lo que el código Jelly solo tiene que pedirle que dibuje una lista de puntos, todos los cuales están conectados entre sí. Así es como funciona:

Ɠ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

El uso de Jelly nos permite comprimir ligeramente la cadena que configura la salida de GraphViz a través de su diccionario incorporado. El diccionario tiene graph, nodey point. Molesto, no tiene shape(tiene SHAPE, pero GraphViz distingue entre mayúsculas y minúsculas), por lo que tenemos que codificar ese carácter por carácter.

Aquí está la salida para la entrada 21 (con una ligera modificación en el programa para que salga en un formato que pueda cargarse en Stack Exchange):

gráfico completo en 21 puntos


fuente
0

PHP + HTML SVG, 316 263 bytes

Versión de golf con npuntos codificados y sin nparámetro de entrada :

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

Versión anterior de golf con parámetro de entrada para npuntos, 316 bytes:

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

Uso: guardar en un archivo y llamar desde el navegador:

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

Versión sin golf con parámetro de entrada para npuntos y 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>

No se pudo adjuntar un fragmento totalmente funcional de 32 puntos debido al límite de 30k caracteres para una sola publicación. Aquí hay una captura de pantalla:

ingrese la descripción de la imagen aquí

El fragmento adjunto está limitado a 18 puntos debido al límite de 30,000 mensajes individuales.

Mario
fuente
0

R, 108 bytes

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

Podría eliminar 5 bytes si me deshago del argumento ,as=1que fuerza una relación de aspecto de 1. Usa expand.gridpara crear una matriz con todos los pares de puntos posibles, y usa applypara recorrerlo.

N = 21

R + igraph, 87 bytes

Otra solución usando paquete igraph.

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

N = 21

plannapus
fuente