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.