Círculo alinhado, n pontos


39

Desenhe linhas entre cada par de pontos distintos para npontos dispostos em círculo, produzindo algo como o resultado abaixo. O código mais curto (em bytes) vence! Suas linhas não precisam ser transparentes, mas parece melhor assim. A saída deve ser um gráfico vetorial ou uma imagem com pelo menos 600 pixels por 600 pixels (salvos em um arquivo ou exibidos na tela). Para completar o desafio, você deve desenhar pelo menos 20.

insira a descrição da imagem aqui


7
Seria legal se você tivesse que digitar um número ne desenhar linhas para ganhar npontos.
Yodle

2
Eu apóio essa ideia. Altere-o antes que alguém obtenha a primeira resposta.
Shooqie

2
@shooqie Então o título não faria sentido, a menos que possa ser editado pelos mods?
Yodle

2
Eu não acho que mudar 37 para um arbitrário ntraria muito mais ao desafio, pois espero que a maioria das soluções funcione com qualquer número de qualquer maneira, especialmente porque 37 é ímpar e, portanto, não há simetrias de espelho.
Laikoni 01/12/16

3
Tomamos ncomo entrada ou apenas escolhe um arbitrário nacima de 20?
Rɪᴋᴇʀ

Respostas:


26

Mathematica, 13 bytes

CompleteGraph

círculo alinhado-37-pontos

Parece que isso apenas não fornece uma incorporação circular para n=4, mas a pergunta afirman>=20


1
... e lá estava eu ​​tentando encontrar a maneira correta de executar uma função n(eu tinha a resposta pronta dos 37 fixos) :(
Jonathan Allan

6
@carusocomputing Esta função não tem nada a ver com "gráficos" no sentido de plotagem. O Mathematica também é muito bom para problemas de teoria de grafos e ter um built-in para gerar um gráfico completo parece ser a primeira coisa que eu acrescentaria se adicionasse suporte a gráficos ao meu idioma. A única razão pela qual essa função é útil para esse desafio é que gráficos completos são renderizados por padrão com todos os vértices organizados em um círculo.
Martin Ender

2
Se você deseja suportar gráficos, é melhor ter uma função gráfica completa, IMO.
Ngenisis

2
@carusocomputing Bem-vindo ao Mathematica, a linguagem incorporada a todas as funções existentes. :-P
HyperNeutrino 2/16/16

1
Eu estava baixando o NetLogo porque pensei que "multi-tartarugas farão pouco trabalho com isso!" então lembrei que os matemáticos estão usando a versão adulta.
Wyldstallyns 02/12/16

13

MATL , 16 14 bytes

Como não sou muito fluente com o MATL, espero que isso seja um pouco mais fácil de jogar. (Seria bom, pelo menos, vencer o Mathematica :-) Ou seja, o flip wnão é o ideal, provavelmente poderia ser evitado ...

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

Teste on-line! (Obrigado @Suever por este serviço, obrigado @DrMcMoylex por -2 bytes.)

Explicação (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 a pena notar que, para gerar as enésimas raízes da unidade, você pode usar a fórmula exp(2*pi*i*k/N)para k=1,2,3,...,N. Mas desde que exp(pi*i/2) = ivocê também pode escrever i^(4*k/N)para o k=1,2,3,...,Nque é o que estou fazendo aqui.


1
Você pode mudar XH:Hpara:G
DJMcMayhem

1
Aaah eu esqueci Gmuito obrigado!
flawr

11

PICO-8 , 131 bytes

Eu não tinha muita certeza se infringiria alguma regra, mas fiz de qualquer maneira!

Golfe

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

Loucura de 128x128

PICO-8 é um console de fantasia baseado em Lua com uma resolução nativa de 128x128. Eu fiz o círculo o maior que pude ...


9

Mathematica, 42 bytes

Cria um conjunto de 37 pontos organizados em um círculo e desenha linhas entre todos os subconjuntos possíveis de dois pontos. Alguém postou uma resposta mais curta que tira proveito do CompleteGraph, mas acredito que este seja o mais curto, além daqueles que dependem do CompleteGraph.

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

insira a descrição da imagem aqui


3
Não há necessidade de evitar desenhar linhas de um ponto para si mesmo, para que você possa salvar 3 bytes usando Tuple. Você também precisa atualizar isso para aceitar arbitrariamente n, mas convenientemente isso não lhe custará bytes.
Ngenisis

1
Significou a dizerTuples
ngenisis

9

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

Usando a API Canvas do HTML5 .

Veja no 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 : removido closePath(), movido para stroke()dentrobeginPath()

-2 bytes : variável definida adentrorotate()


8

Java, 346 338 322 301 bytes

Esta solução funciona para todos n>1, mesmo que a postagem original não exija isso, ela exige.

O meu favorito é n=5não perguntar por que, também, se você quiser uma GUI mais legal, use:

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

No lugar dos 300 codificados, ele usará a largura ou a altura do quadro como diâmetro.

Economizou 8 bytes graças ao Shooqie. Economizou 21 bytes graças ao 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();}

Saída para n=37:

insira a descrição da imagem aqui


Você pode cair Frame x=e final(eu acho?)
shooqie

@shooqie oops, Frame xera de outra solução que envolvia um thread. Você precisa da final, pois é uma referência de classe interna a uma variável externa na classe proprietária.
Magic Octopus Urn

Funciona muito bem na minha máquina. BTW eu acho que você pode raspar alguns bytes movendo intdeclarações fora do forloops de
shooqie

@shooqie no Java 6 está dizendo "Não é possível se referir à variável local não final n em um escopo de fechamento" em tempo de compilação.
Magic Octopus Urn

Funcionou para mim no Java 8, mas depois que você editou sua postagem, eu só estava recebendo uma tela branca.
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()

Saída para n=37
n = 37


1
Não seria from PIL import*mais curto?
Roman Gräf

@ RomanGräf PIL é um pacote estranho, você não pode import *, dependendo de como instalar, você pode pular o PIL e importar o Image / ImageDraw diretamente
Rod /

6

Oitava, 88 69 bytes

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

Saída para N=37:

insira a descrição da imagem aqui

Saída para N=19:

insira a descrição da imagem aqui


Oh, eu nem percebi que já havia outra resposta Octave :)
flawr

De qualquer forma, vencê-lo :-)
flawr

Por uma milha! Meu primeiro pensamento foi gplottambém, mas eu não conseguem fazê-lo curto o suficiente ...
Stewie Griffin

6

Perl, 229 bytes

Ele usa a mesma fórmula que a maioria dos idiomas que não possuem recursos convenientes para esse desafio (mesmo que eu não os tenha encontrado, mas é uma fórmula bastante fácil de encontrar). Portanto, não é muito interessante, mas geralmente não há muitas respostas de Perl para esse tipo de desafio, então eu só queria propor uma.

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

E você precisará -MImager(9 bytes), -MMath::Trig(fornecendo pi, 13 bytes) e -n(1 byte) ==> + 23 bytes.

Para executá-lo:

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

Ele criará um arquivo chamado t.pngque contém a imagem.

Você precisará instalar Imager, mas não se preocupe, é bastante fácil:

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

(O echos irá configurá-lo cpan se você nunca o usou antes. (Na verdade, isso só funcionará se o seu perl for recente o suficiente, acho que para a maioria de vocês será e sinto muito pelos outros!)) .

E a versão mais legível (sim, é bastante legível para um 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");

insira a descrição da imagem aqui

-1 byte graças a Titus.


O Perl requer chaves em torno de comandos únicos?
Titus

@Titus Se você se referir aos aparelhos após os forloops, sim, eles são obrigatórios.
Dada

Há um espaço em branco antes y2. Aposto que você não precisa disso. E você pode escrever para STDOUT?
Titus

@ Titus hmm de fato, obrigado. Acho que meu terminal colocou uma nova linha aqui para não ver o espaço.
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 linha é inserida separadamente na barra de entrada. Aqui está um gif mostrando a execução:

Execução

Como funciona

O polygoncomando cria um polígono de 20 lados, com os vértices da linha de base em (0,0)e (1,0). O próximo comando itera sobre cada vértice do polígono com índice i, usando os comandos sequencee vertex, e para cada vértice com índice i, desenha um segmento de linha para todos os outros vértices com índice jusando o segmentcomando


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

grava a imagem em STDOUT

demolir

// 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 fixo n=20

Substitua $p=2*M_PIpor 6(-8), /=$argv[1]por =M_PI/10(-2) e $b>0por$b (-2)

Usar PI / 10 exato não dói. Com .3142, os erros de arredondamento da versão parametrizada permaneceram, mas com M_PI/10eles desapareceram e posso verificar $b(<> 0) em vez de $b>0. Eu poderia ter salvo dois bytes com .314, mas isso teria compensado os pontos.

O limite $a<6é suficientemente exato para 20 pontos.

gráfico exato do PI

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

Usar 314 pontos resulta em um círculo preenchido nessa resolução (como 136.140, todos os números pares acima disso e tudo acima de 317).


1
Boa resposta, mas parece que você codificou 20 em vez de usar isso como entrada?
Riking 01/12/19

1
@Riking: Verdade. Mas não vejo demanda no desafio de parametrizá-lo.
Titus


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

Produz:

Etiquetas do eixo legal, não é?

-4 bytes graças a @Titus!


1
Não é mais curto, mas poderia ser mais rápido for(i in 2:n){for(j in 1:i)...}. Será que Rexigem as chaves?
Titus

@ Titus Você está certo! E não, nenhum aparelho é necessário lá. Obrigado !
Frédéric

3

BBC BASIC, 98 caracteres ascii

Tamanho do arquivo 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.

Intérprete Dowload em http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Não há nada errado em desenhar cada linha duas vezes, a aparência é idêntica :-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

Saída n = 21

Isso parece muito melhor na renderização original do que no navegador.

<code> insira a descrição da imagem aqui </code>


Obrigado por me lembrar da LINEfunção. Beats DRAW...
steenbergh

3

Oitava, 50 48 46 45 bytes

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

Essa é uma função anônima que plota o gráfico que estamos procurando.

Explicação:

(k=0:2*pi/N:N)+k'Cria uma N+1 x N+1matriz de adjecência completa e define simultaneamente o vetor kde ângulos, para o qual usamos então [cos(k);sin(k)]', uma matriz de coordenadas em que cada nó do gráfico está posicionado. gplotapenas plota o gráfico que queremos.

Pois N = 29temos:

insira a descrição da imagem aqui


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

Funciona apenas para números primos, como a sugestão original de 37. Você pode reduzir pela metade (arredondado para cima) o valor inicial de ipara obter uma imagem mais fraca. Você também pode ajustar consistentemente os 1e3,2e3outros valores a gosto (comecei com, 300,600mas decidi que era muito grosseiro).


2

MATLAB, 36 bytes

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

Essa é uma função anômala que cria o enredo.

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

Exemplo:

insira a descrição da imagem aqui

insira a descrição da imagem aqui


Estou surpreso graphnão é parte da caixa de ferramentas de bioinformática ... nem sabia que existia ... agradável :)
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

A tela no QBasic pode ser apenas 640x480, portanto o círculo tem um raio de apenas 230 px, infelizmente. Além disso, há alguns artefatos por causa da perda de precisão de flutuação para int. É assim N=36: insira a descrição da imagem aqui

Edição: Eu não precisava do armazenamento, a declaração de tipo e todo o loop. Calcular todos os cartesianos de Polars no local é 50% mais barato na contagem de bytes ...


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)

Eu converti minha resposta QBasic original da resposta de @LevelRiverSt para QBIC. Eu pensei que isso dependeria muito de funções que não são incorporadas ao QBIC para serem viáveis, mas, como se vê, ele salva outros 90 bytes. A substituição de DRAWfor LINEsalva outros 80 bytes. Eu sabia que estava esquecendo algo simples ...

Quando executado com um parâmetro de linha de comando 36, fica assim:

insira a descrição da imagem aqui


1

Processamento, 274 bytes (239 + sizechamada e chamada de função)

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, não sei por que, mas setuptinha que estar na segunda linha. eu usei https://en.wikipedia.org/wiki/Rotation_matrix para me ajudar a calcular a matemática para rotação. Este programa calcula os pontos e os empurra para uma matriz, com a qual estamos usando para desenhar linhas.

Aqui está uma foto de um polígono com 50 arestas (as 100 arestas eram quase completamente pretas)

50 pontos

Você pode adicionar stroke(0,alpha);para ter arestas transparentes, onde alphaestá a opacidade da linha. Aqui está o mesmo polígono com alphade 20.

insira a descrição da imagem aqui


1

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

Dado que os programas em questão discordam sobre qual codificação de caracteres usar, o programa está cheio de caracteres de controle. Aqui está o que parece embaixo xxd, na codificação Latin-1 (que representa cada caractere em um 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

Na verdade, não consegui executar o programa sem converter a entrada em UTF-8 por algum motivo (o que tornaria 63 bytes de comprimento). Logicamente deveria funcionar como Latin-1 - nenhum dos caracteres está fora do intervalo de 0 a 255 -, mas continuo recebendo erros de "índice de string fora do intervalo", não importa como eu configure as variáveis ​​de ambiente de codificação de caracteres. Portanto, isso terá que ser contado como 63 bytes, a menos que alguém possa descobrir uma maneira de executá-lo sem recodificá-lo.

O programa pode ser um pouco mais legível se o interpretarmos na codificação de Jelly:

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

O programa pega o número de pontos na entrada padrão e gera uma imagem PostScript na saída padrão. (Ele pode ser adaptado trivialmente para produzir em qualquer formato que o GraphViz suporte, alterando o -Tpsno final; é apenas que o PostScript tem o nome mais curto. É possível salvar cinco caracteres removendo o -Tps, mas obtém o resultado no formato de imagem interno do GraphViz que nada mais suporta, o que provavelmente não conta para os propósitos da pergunta.)

Fundamentalmente, este é apenas um programa Jelly que chama o GraphViz para fazer o desenho; no entanto, o Jelly não parece ter recursos para executar programas externos, então tive que usar o bash para vinculá-los. (Isso também significa que é mais barato fazer com que o Jelly solicite a entrada do stdin manualmente; normalmente ele recebe a entrada da linha de comando, mas isso significaria bytes extras no wrapper do bash.) circoOrganizará automaticamente todos os pontos solicitados a desenhar em um círculo , portanto, o código Jelly precisa solicitar que ele desenhe uma lista de pontos, todos conectados entre si. Veja 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

O uso do Jelly permite compactar levemente a string que configura a saída do GraphViz por meio de seu dicionário embutido. O dicionário tem graph, nodee point. Irritantemente, ele não possui shape(possui SHAPE, mas o GraphViz faz distinção entre maiúsculas e minúsculas), portanto, precisamos codificar esse caractere por caractere.

Aqui está a saída da entrada 21 (com uma ligeira modificação no programa para torná-lo em um formato que pode ser carregado no Stack Exchange):

gráfico completo com 21 pontos


0

PHP + HTML SVG, 316 263 bytes

Versão golfed com npontos codificados e sem 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>

Versão golfada anterior com parâmetro de entrada para npontos, 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: salve em um arquivo e ligue no navegador:

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

Versão ungolfed com parâmetro de entrada para npontos e 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>

Não foi possível anexar um snippet totalmente funcional de 32 pontos devido ao limite de 30k caracteres para uma única postagem. Aqui está uma captura de tela:

insira a descrição da imagem aqui

O snippet anexado é limitado a 18 pontos por causa do limite de postagem única de 30k.


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

Poderia raspar 5 bytes se eu me livrasse do argumento ,as=1que força uma proporção de 1. Usa expand.gridpara criar uma matriz com todo o possível par de pontos e usa applypara fazer um loop através dela.

N = 21

Gráfico R +, 87 bytes

Outra solução usando o pacote igraph.

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

N = 21

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.