Ustawione koło, n punktów

39

Narysuj linie między każdą parą odrębnych punktów dla npunktów ułożonych w okrąg, tworząc coś takiego jak poniższy wynik. Najkrótszy kod (w bajtach) wygrywa! Twoje linie nie muszą być przezroczyste, ale tak wygląda lepiej. Wynik musi być grafiką wektorową lub obrazem o wymiarach co najmniej 600 na 600 pikseli (zapisanym w pliku lub wyświetlonym na ekranie). Aby ukończyć wyzwanie, musisz wylosować co najmniej 20.

wprowadź opis zdjęcia tutaj

J. Antonio Perez
źródło
7
Byłoby fajnie, gdybyś musiał wziąć liczbę ni narysować linie dla npunktów.
Yodle,
2
Popieram ten pomysł. Zmień to, zanim ktoś otrzyma pierwszą odpowiedź.
shooqie,
2
@shooqie W takim razie tytuł nie miałby sensu, chyba że można go edytować za pomocą modów?
Yodle,
2
Nie sądzę, aby zmiana 37 na arbitralną nznacznie zwiększyłaby to wyzwanie, ponieważ spodziewam się, że większość rozwiązań i tak będzie działać z dowolną liczbą, zwłaszcza, że ​​37 jest nieparzysta i dlatego nie ma lustrzanych symetrii.
Laikoni,
3
Czy przyjmujemy njako wkład, czy po prostu wybieramy dowolną z nponad 20?
Rɪᴋᴇʀ

Odpowiedzi:

26

Mathematica, 13 bajtów

CompleteGraph

uszeregowane-koło-37-punktów

Wygląda na to, że nie zapewnia to tylko okrągłego osadzenia n=4, ale pytanie brzmin>=20

ngenisis
źródło
1
... a ja próbowałem znaleźć właściwy sposób na wykonanie funkcji n(miałem gotową odpowiedź z ustalonego 37) :(
Jonathan Allan
6
@ carusocomputing Ta funkcja nie ma nic wspólnego z „grafowaniem” w sensie kreślenia. Mathematica jest również bardzo dobra w przypadku problemów z teorią grafów , a posiadanie wbudowanego narzędzia do generowania pełnego wykresu wydaje się pierwszą rzeczą, którą dodałbym, gdybym dodał obsługę grafów w moim języku. Jedynym powodem, dla którego ta funkcja jest przydatna w tym wyzwaniu, jest to, że pełne wykresy są domyślnie renderowane ze wszystkimi wierzchołkami ułożonymi w okrąg.
Martin Ender,
2
Jeśli zamierzasz obsługiwać wykresy, lepiej mieć wbudowaną pełną funkcję wykresu, IMO.
ngenisis,
2
@carusocomputing Witamy w Mathematica, języku, który ma wbudowane funkcje dla każdej istniejącej funkcji. :-P
HyperNeutrino
1
Pobrałem NetLogo, ponieważ myślałem, że „wielozadaniowy zrobi to krótko!” wtedy przypomniałem sobie, że matematycy używają wersji dla dorosłych.
wyldstallyns,
13

MATL , 16 14 bajtów

Ponieważ nie jestem zbyt biegły w posługiwaniu się MATLem, spodziewam się, że jest to coś bardziej golfowego. (Byłoby miło pokonać Mathematica :-) Tzn. Przewrócenie wnie jest optymalne, prawdopodobnie można tego uniknąć ...

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

Przetestuj online! (Dzięki @Suever za tę usługę, dzięki @DrMcMoylex za -2 bajty.)

Objaśnienie (dla 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

Warto zauważyć, że do generowania N-tych korzeni jedności można użyć wzoru exp(2*pi*i*k/N)na k=1,2,3,...,N. Ale skoro exp(pi*i/2) = imożesz także pisać, i^(4*k/N)o k=1,2,3,...,Nco właśnie tutaj robię.

wada
źródło
1
Możesz zmienić XH:Hna:G
DJMcMayhem
1
O tak, zapomniałem o Gbardzo dziękuję!
flawr
11

PICO-8 , 131 bajtów

Nie byłam do końca pewna, czy będę łamać jakieś zasady, ale i tak to zrobiłam!

Grał w golfa

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

Bez golfa

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

Szaleństwo 128x128

PICO-8 to oparta na Lua konsola fantasy z natywną rozdzielczością 128x128. Zrobiłem koło tak duże, jak tylko mogłem ...

Tyler MacDonell
źródło
9

Mathematica, 42 bajty

Tworzy zestaw 37 punktów ułożonych w okrąg, a następnie rysuje linie między wszystkimi możliwymi podzbiorami dwóch punktów. Ktoś opublikował krótszą odpowiedź, która korzysta z CompleteGraph, ale uważam, że jest to najkrótsza odpowiedź oprócz tych, którzy polegają na CompleteGraph.

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

wprowadź opis zdjęcia tutaj

J. Antonio Perez
źródło
3
Nie ma potrzeby unikania rysowania linii od punktu do siebie, dzięki czemu można zaoszczędzić 3 bajty za pomocą Tuple. Musisz także zaktualizować to, aby zaakceptować dowolne n, ale wygodnie to nie kosztuje żadnych bajtów.
ngenisis,
1
To znaczyTuples
ngenisis,
9

HTML + JS (ES6), 34 + 177 164 162 = 196 bajtów

Korzystanie z interfejsu API HTML5 Canvas .

Zobacz na 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 bajtów : Usunięto closePath(), przeniesiono do stroke()środkabeginPath()

-2 bajty : zdefiniowana zmienna awewnątrzrotate()

darrylyeo
źródło
8

Java, 346 338 322 301 bajtów

To rozwiązanie działa na wszystkich n>1, nawet jeśli oryginalny post tego nie wymagał, to działa.

Moim ulubionym jest n=5, nie pytaj dlaczego, a także, jeśli chcesz mieć fajniejszy GUI, użyj:

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

Zamiast zakodowanego na stałe 300, użyje szerokości lub wysokości ramy jako średnicy.

Zaoszczędź 8 bajtów dzięki Shooqie. Zaoszczędzono 21 bajtów dzięki 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();}

Dane wyjściowe dla n=37:

wprowadź opis zdjęcia tutaj

Urna Magicznej Ośmiornicy
źródło
Możesz upuścić Frame x=i final(tak myślę?)
shooqie
@shooqie oops, Frame xpochodzi z innego rozwiązania, które dotyczyło wątku. Potrzebny jest jednak ostatni, ponieważ jest to wewnętrzne odwołanie do zmiennej zewnętrznej w klasie będącej właścicielem.
Magic Octopus Urn
Działa dobrze na moim komputerze. BTW Myślę, że możesz ogolić niektóre bajty, przenosząc intdeklaracje poza forpętle
shooqie
@shooqie w Javie 6 mówi „Nie można odwoływać się do nie końcowej zmiennej lokalnej n w zakresie obejmującym” w czasie kompilacji.
Magic Octopus Urn
To działało dla mnie na Javie 8, ale po zredagowaniu twojego postu pojawia się tylko biały ekran.
shooqie,
7

Python 2, 258 235 229 bajtów

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

Wyjście dla n=37
n = 37

Pręt
źródło
1
Nie byłby from PIL import*krótszy?
Roman Gräf,
@ RomanGräf PIL to dziwny pakiet, nie możesz import *, w zależności od sposobu instalacji, pominąć PIL i zaimportować bezpośrednio Image / ImageDraw
Rod
6

Oktawa, 88 69 bajtów

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

Dane wyjściowe dla N=37:

wprowadź opis zdjęcia tutaj

Dane wyjściowe dla N=19:

wprowadź opis zdjęcia tutaj

Stewie Griffin
źródło
Och, nawet nie zauważyłem, że była już kolejna odpowiedź Octave :)
flawr
W każdym razie pokonaj :-)
flawr
O milę! Moja pierwsza myśl gplotteż była , ale nie udało mi się wystarczająco krótko ...
Stewie Griffin
6

Perl, 229 bajtów

Wykorzystuje tę samą formułę, co większość języków, które nie mają wygodnego wbudowanego rozwiązania dla tego wyzwania (nawet jeśli nie patrzyłem na nie, aby je znaleźć, ale jest to dość łatwa do znalezienia formuła). To niezbyt interesujące, ale zwykle nie ma zbyt wielu odpowiedzi Perla na tego rodzaju wyzwania, więc chciałem tylko zaproponować jedno.

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

Będziesz potrzebował -MImager(9 bajtów), -MMath::Trig(zapewniając pi13 bajtów) i -n(1 bajt) ==> + 23 bajty.

Aby uruchomić:

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

Utworzy plik o nazwie t.pngzawierającej obraz.

Musisz Imagerjednak zainstalować , ale nie martw się, to dość proste:

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

( echoS skonfigurują ci cpan, jeśli nigdy wcześniej go nie używałeś (tak naprawdę zadziała tylko wtedy, gdy twój perl jest wystarczająco nowy, myślę, że dla większości z was tak będzie i przepraszam za innych!)) .

I bardziej czytelna wersja (tak, jest dość czytelna dla skryptu 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");

wprowadź opis zdjęcia tutaj

-1 bajt dzięki Tytusowi.

Dada
źródło
Czy Perl wymaga nawiasów klamrowych wokół pojedynczych poleceń?
Tytus
@Tytus Jeśli odwołujesz się do nawiasów klamrowych po forpętli, to tak, są one obowiązkowe.
Dada,
Wcześniej jest pusty y2. Założę się, że nie potrzebujesz tego. Czy możesz napisać do STDOUT?
Tytus
@Titus hmm rzeczywiście, dzięki. Myślę, że mój terminal umieścił tutaj nową linię, więc nie widziałem miejsca.
Dada,
5

GeoGebra , 92 bajty

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

Każda linia jest osobno wprowadzana do paska wprowadzania. Oto gif przedstawiający wykonanie:

Wykonanie

Jak to działa

polygonPolecenie tworzy 20-stronny wielokąt z wierzchołków linii podstawowej w (0,0)i (1,0). Następne polecenie iteruje następnie każdy wierzchołek wielokąta z indeksem i, używając poleceń sequencei vertex, i dla każdego wierzchołka z indeksem irysuje segment linii do każdego innego wierzchołka z indeksem jza pomocą segmentpolecenia.

TheBikingViking
źródło
4

PHP, 186 184 196 bajtów

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

zapisuje obraz do STDOUT

awaria

// 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 bajtów na naprawę n=20

Wymienić $p=2*M_PIz 6(-8), /=$argv[1]z =M_PI/10(-2), a $b>0z $b(-2)

Używanie dokładnego PI / 10 nie boli. Z .3142pozostały błędy zaokrąglania z sparametryzowanej wersji, ale M_PI/10zniknęły i mogę sprawdzić $b(<> 0) zamiast $b>0. Mógłbym zaoszczędzić dwa bajty .314, ale to zrównoważyłoby punkty.

Limit $a<6jest wystarczająco dokładny dla 20 punktów.

dokładny wykres PI

174 bajty na naprawę 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);

Użycie 314 punktów powoduje wypełnienie koła w tej rozdzielczości (podobnie jak 136 140, każda liczba parzysta powyżej i wszystko powyżej 317).

Tytus
źródło
1
Dobra odpowiedź, ale wygląda na to, że zakodowałeś 20 zamiast brać to jako wkład?
Riking
1
@Riking: True. Ale nie widzę zapotrzebowania na wyzwanie dotyczące parametryzacji.
Tytus
4

NetLogo - 44 bajty

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

Wyjście NetLogo

wyldstallyns
źródło
4

R, 127 123 bajtów

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

Produkuje:

Ładne etykiety osi?

-4 bajty dzięki @Titus!

Frédéric
źródło
1
Nie krótszy, ale może być szybszy for(i in 2:n){for(j in 1:i)...}. Czy Rwymaga aparatu ortodontycznego?
Tytus
@Titus Masz rację! I nie, nie ma tam żadnych aparatów ortodontycznych. Dzięki !
Frédéric,
3

BBC BASIC, 98 znaków ascii

Tokenizowany rozmiar pliku 86 bajtów

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.

Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Nie ma nic złego w rysowaniu każdej linii dwa razy, wygląd jest identyczny :-P

Bez golfa

  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

Wyjście n = 21

Wygląda to znacznie lepiej w oryginalnym renderowaniu niż w przeglądarce.

<code> wprowadź opis obrazu tutaj </code>

Level River St
źródło
Dzięki za przypomnienie mi o LINEfunkcji. Beats DRAW...
steenbergh
3

Oktawa, 50 48 46 45 bajtów

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

Jest to dowolna funkcja rysująca wykres, którego szukamy.

Wyjaśnienie:

(k=0:2*pi/N:N)+k'Tworzy pełną N+1 x N+1macierz adjecencji i jednocześnie definiuje wektor kkątów, do którego wówczas używamy [cos(k);sin(k)]', macierz współrzędnych, w których umieszczony jest każdy węzeł wykresu. gplotpo prostu kreśli wykres, który chcemy.

Dla N = 29otrzymujemy:

wprowadź opis zdjęcia tutaj

wada
źródło
2

JavaScript (ES5) / SVG (HTML5), 181 bajtów

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

Działa tylko dla liczb pierwszych, takich jak pierwotna sugestia 37. Możesz zmniejszyć o połowę (zaokrąglić w górę) wartość początkową, iaby uzyskać słabszy obraz. Możesz także konsekwentnie dostosowywać 1e3,2e3inne wartości do smaku (zacząłem od, 300,600ale zdecydowałem, że jest zbyt gruby).

Neil
źródło
2

MATLAB, 36 bajtów

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

To anonimowa funkcja, która tworzy wykres.

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

Przykład:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Luis Mendo
źródło
Dziwię się, że graphnie jest częścią bioinformatycznego zestawu narzędzi ... nawet nie wiedziałem, że istnieje ... Fajnie :)
Stewie Griffin
1

QBasic 4.5, 398 271 bajtów

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

Ekran w QBasic może mieć tylko 640x480, więc promień koła ma tylko 230 px, niestety. Ponadto istnieje pewne artefaktowanie z powodu utraty precyzji zmiennoprzecinkowej. Wygląda to tak N=36: wprowadź opis zdjęcia tutaj

EDYCJA: Nie potrzebowałem pamięci, deklaracji typu i całej pętli. Obliczanie wszystkich Kartezjanów na podstawie biegunów jest o 50% tańsze pod względem liczby bajtów ...

Steenbergh
źródło
1

QBIC , 98 94 bajtów

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

Przekształciłem pierwotną odpowiedź QBasic @LevelRiverSt na QBIC. Myślałem, że byłoby to zbyt mocno oparte na funkcjach, które nie są wbudowane w QBIC, aby były wykonalne, ale jak się okazuje, oszczędza kolejne 90 bajtów. Zastąpienie parametru DRAWfor LINEpozwala zaoszczędzić kolejne 80 bajtów. Wiedziałem, że zapomniałem czegoś prostego ...

Po uruchomieniu z parametrem wiersza poleceń 36 wygląda następująco:

wprowadź opis zdjęcia tutaj

Steenbergh
źródło
1

Przetwarzanie, 274 bajtów (239 + sizewywołanie i wywołanie funkcji)

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

Naprawdę nie wiem dlaczego, ale setupmusiałem być na drugiej linii. Użyłem https://en.wikipedia.org/wiki/Rotation_matrix, aby pomóc mi obliczyć matematykę rotacji. Ten program oblicza punkty i wypycha je do tablicy, za pomocą której rysujemy linie.

Oto zdjęcie wielokąta z 50 krawędziami (100 krawędzi było prawie całkowicie czarne)

50 punktów

Możesz dodać, stroke(0,alpha);aby mieć przezroczyste krawędzie, gdzie alphajest krycie linii. Oto ten sam wielobok z alphaod 20.

wprowadź opis zdjęcia tutaj

Kritixi Lithos
źródło
1

Bash + Galaretka + GraphViz, 52 znaki, 52 lub 63 bajty

Biorąc pod uwagę, że omawiane programy nie zgadzają się co do tego, jakiego kodowania znaków użyć, program jest pełen znaków kontrolnych. Oto, jak to wygląda pod xxdkodowaniem Latin-1 (które reprezentuje każdy znak w jednym bajcie):

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

Nie udało mi się jednak uruchomić programu bez przekonwertowania danych wejściowych na UTF-8 z jakiegoś powodu (co spowodowałoby, że miałyby one 63 bajty). Logicznie powinno to działać jako Latin-1 - żaden ze znaków nie jest poza zakresem od 0 do 255 - ale ciągle pojawiają się błędy „indeksu ciągu poza zakresem” bez względu na to, jak skonfiguruję zmienne środowiskowe kodowania znaków. Będzie to więc musiało być policzone jako 63 bajty, chyba że ktoś wymyśli sposób na uruchomienie go bez ponownego kodowania.

Program może być nieco bardziej czytelny, jeśli zinterpretujemy go w kodowaniu Jelly:

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

Program pobiera liczbę punktów na standardowym wejściu i wyświetla obraz PostScript na standardowym wyjściu. (Można go trywialnie dostosować do wyświetlania w dowolnym formacie obsługiwanym przez GraphViz, zmieniając -Tpsna końcu; po prostu PostScript ma najkrótszą nazwę. Prawdopodobnie możesz zapisać pięć znaków, usuwając -Tps, ale wtedy otrzymasz wynik w wewnętrznym formacie graficznym GraphViz że nic więcej nie obsługuje, co prawdopodobnie nie ma znaczenia dla celów pytania).

Zasadniczo jest to tylko program Jelly, który wywołuje GraphViz, aby wykonać rysunek; jednak Jelly nie wydaje się mieć żadnych możliwości uruchamiania zewnętrznych programów, więc musiałem użyć bash, aby połączyć je ze sobą. (Oznacza to również, że tańsze jest ręczne wprowadzanie żądania Jelly ze standardowego wejścia; zwykle pobiera dane z wiersza poleceń, ale oznaczałoby to dodatkowe bajty w opakowaniu bash). circoAutomatycznie ustawi wszystkie punkty, o które proszony jest o narysowanie w okręgu , więc kod Jelly musi tylko poprosić go o narysowanie listy punktów, z których wszystkie są ze sobą połączone. Oto jak to działa:

Ɠ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

Zastosowanie Jelly pozwala nam delikatnie skompresować ciąg, który konfiguruje wyjście GraphViz za pomocą wbudowanego słownika. Słownik ma graph, nodei point. Irytujące, nie ma shape(ma SHAPE, ale GraphViz rozróżnia wielkość liter), więc musimy zakodować tę postać po znaku.

Oto dane wyjściowe dla danych wejściowych 21 (z niewielką modyfikacją programu, aby uzyskać dane wyjściowe w formacie, który można przesłać do Stack Exchange):

pełny wykres na 21 punktach


źródło
0

PHP + HTML SVG, 316 263 bajtów

Wersja golfowa z zakodowanymi npunktami i bez nparametru wejściowego :

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

Poprzednia wersja golfowa z parametrem wejściowym dla npunktów, 316 bajtów:

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

Sposób użycia: zapisz w pliku i zadzwoń z przeglądarki:

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

Wersja bez golfa z parametrem wejściowym dla npunktów i 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>

Nie można dołączyć 32-punktowego w pełni funkcjonalnego fragmentu z powodu limitu 30 000 znaków dla jednego posta. Oto zrzut ekranu:

wprowadź opis zdjęcia tutaj

Dołączony fragment kodu jest ograniczony do 18 punktów ze względu na limit 30 000 pojedynczych wpisów.

Mario
źródło
0

R, 108 bajtów

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

Mógłbym ogolić 5 bajtów, gdybym pozbył się argumentu, ,as=1który wymusza współczynnik proporcji wynoszący 1. Używa expand.griddo tworzenia macierzy ze wszystkimi możliwymi parami punktów i używa applydo jej zapętlenia.

N = 21

R + igraph, 87 bajtów

Inne rozwiązanie wykorzystujące pakiet igraph.

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

N = 21

plannapus
źródło