Aufgereihter Kreis, n Punkte

39

Zeichnen Sie Linien zwischen jedem Paar unterschiedlicher Punkte für nPunkte, die in einem Kreis angeordnet sind, und erzeugen Sie so etwas wie das folgende Ergebnis. Kürzester Code (in Bytes) gewinnt! Ihre Linien müssen nicht transparent sein, aber so sieht es besser aus. Die Ausgabe muss eine Vektorgrafik oder ein Bild von mindestens 600 x 600 Pixel sein (entweder in einer Datei gespeichert oder auf dem Bildschirm angezeigt). Um die Herausforderung abzuschließen, musst du mindestens 20 ziehen.

Bildbeschreibung hier eingeben

J. Antonio Perez
quelle
7
Es wäre cool, wenn Sie eine Zahl aufnehmen nund Linien für nPunkte ziehen müssten .
Yodle
2
Ich stimme dieser Idee zu. Ändern Sie es, bevor jemand die erste Antwort erhält.
Shooqie
2
@shooqie Dann würde der Titel aber keinen Sinn ergeben, es sei denn, das kann von den Mods bearbeitet werden?
Yodle
2
Ich glaube nicht, dass das Ändern von 37 in ein beliebiges nProblem die Herausforderung erheblich verschärfen würde, da ich davon ausgehe, dass die meisten Lösungen ohnehin mit einer beliebigen Zahl funktionieren, insbesondere, weil 37 ungerade ist und daher keine Spiegelsymmetrien vorliegen.
Laikoni
3
Nehmen wir nals Eingabe oder wählen Sie einfach eine beliebige nüber 20?
1.

Antworten:

26

Mathematica, 13 Bytes

CompleteGraph

aufgereihter Kreis-37-Punkte

Sieht so aus, als gäbe dies nur eine runde Einbettung für nicht n=4, aber die Frage lautetn>=20

Genisis
quelle
1
... und ich habe versucht, den richtigen Weg zu finden, um eine Funktion zu übernehmen n(ich hatte die Antwort von der festen 37 bereit) :(
Jonathan Allan
6
@carusocomputing Diese Funktion hat nichts mit "Graphing" im Sinne von Plotten zu tun. Mathematica ist auch sehr gut für Probleme mit der Graphentheorie geeignet , und es scheint mir das Erste zu sein, was ich hinzufügen würde, wenn ich meiner Sprache Unterstützung für Diagramme hinzufügen würde. Der einzige Grund, warum diese Funktion für diese Herausforderung nützlich ist, ist, dass vollständige Diagramme standardmäßig mit allen in einem Kreis angeordneten Scheitelpunkten gerendert werden.
Martin Ender
2
Wenn Sie Diagramme unterstützen möchten, sollten Sie eine integrierte vollständige Diagrammfunktion verwenden, IMO.
Genisis
2
@carusocomputing Willkommen bei Mathematica, der Sprache, in die jede vorhandene Funktion integriert ist. :-P
HyperNeutrino
1
Ich habe NetLogo heruntergeladen, weil ich dachte, "Multi-Turtle wird das schnell erledigen!" Dann haben Sie sich daran erinnert, dass Mathematiker die erwachsene Version verwenden.
Wyldstallyns
13

MATL , 16 bis 14 Bytes

Da ich mit MATL nicht besonders fließend bin, erwarte ich, dass dies etwas besser ist. (Wäre nett, wenigstens Mathematica zu schlagen :-) Dh der Flip wist nicht optimal, es könnte wohl vermieden werden ...

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

Online testen! (Danke @Suever für diesen Service, danke @DrMcMoylex für -2 Bytes.)

Erklärung (für 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

Es ist erwähnenswert, dass Sie zum Erzeugen der N-ten Wurzeln der Einheit die Formel exp(2*pi*i*k/N)für verwenden können k=1,2,3,...,N. Aber da exp(pi*i/2) = iman könnte auch schreiben i^(4*k/N)für k=1,2,3,...,Ndas ist , was ich hier tue.

fehlerhaft
quelle
1
Sie können XH:Hzu:G
DJMcMayhem wechseln.
1
Aaah, ich habe vergessen, Gvielen Dank!
Fehler
11

PICO-8 , 131 Bytes

Ich war mir nicht sicher, ob ich gegen Regeln verstoßen würde, aber ich tat es trotzdem!

Golf gespielt

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

128x128 Wahnsinn

PICO-8 ist eine Lua-basierte Fantasy-Konsole mit einer nativen Auflösung von 128x128. Ich habe den Kreis so groß wie möglich gemacht ...

Tyler MacDonell
quelle
9

Mathematica, 42 Bytes

Erstellt eine Menge von 37 Punkten, die in einem Kreis angeordnet sind, und zeichnet dann Linien zwischen allen möglichen Teilmengen von zwei Punkten. Jemand hat eine kürzere Antwort gepostet, die CompleteGraph nutzt, aber ich glaube, dies ist die kürzeste, abgesehen von denen, die sich auf CompleteGraph verlassen.

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

Bildbeschreibung hier eingeben

J. Antonio Perez
quelle
3
Es ist nicht nötig, das Zeichnen von Linien von einem Punkt zu sich selbst zu vermeiden, sodass Sie mit 3 Byte sparen können Tuple. Sie müssen dies auch aktualisieren, um willkürliche zu akzeptieren n, aber dies kostet Sie praktisch keine Bytes.
Genisis
1
Tuples
Gemeint
9

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

Verwenden der HTML5 Canvas-API .

Sehen Sie es auf 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 : entfernt closePath(), nach stroke()innen verschobenbeginPath()

-2 Bytes : Definierte Variable ainnerhalbrotate()

darrylyeo
quelle
8

Java, 346 338 322 301 Bytes

Diese Lösung funktioniert für alle n>1, auch wenn der ursprüngliche Beitrag dies nicht erforderte.

Mein Favorit ist n=5, nicht fragen, warum, auch wenn Sie eine coolere GUI wollen, verwenden Sie:

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

Anstelle des hartcodierten 300 wird die Breite oder Höhe des Rahmens als Durchmesser verwendet.

8 Bytes dank Shooqie gespart. 21 Bytes dank Geobits gespart.

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

Ausgabe für n=37:

Bildbeschreibung hier eingeben

Magische Kraken-Urne
quelle
Sie können fallen Frame x=und final(ich denke?)
Shooqie
@shooqie oops, Frame xwar von einer anderen Lösung, die einen Thread beinhaltete. Sie benötigen das Finale, da es eine interne Klassenreferenz auf eine externe Variable in der besitzenden Klasse ist.
Magic Octopus Urn
Es funktioniert gut auf meinem Computer. Übrigens, ich denke, Sie können einige Bytes abschneiden, indem Sie intDeklarationen außerhalb der forSchleifen verschieben
shooqie
@shooqie in Java 6 sagt "Kann nicht auf die nicht endgültige lokale Variable n in einem umschließenden Bereich verweisen" zur Kompilierungszeit.
Magic Octopus Urn
Es hat bei mir auf Java 8 funktioniert, aber nachdem Sie Ihren Beitrag bearbeitet haben, wird nur ein weißer Bildschirm angezeigt.
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()

Ausgabe für n=37
n = 37

Stange
quelle
1
Wäre nicht from PIL import*kürzer?
Roman Gräf
@ RomanGräf PIL ist ein seltsames Paket. import *Abhängig von Ihrer Installation können Sie die PIL nicht überspringen und Image / ImageDraw direkt importieren
Rod
6

Oktave, 88 69 Bytes

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

Ausgabe für N=37:

Bildbeschreibung hier eingeben

Ausgabe für N=19:

Bildbeschreibung hier eingeben

Stewie Griffin
quelle
Oh, ich habe nicht einmal bemerkt, dass es bereits eine andere Octave-Antwort gibt :)
Fehler
Wie auch immer, schlag dich :-)
flawr
Um eine Meile! Mein erster Gedanke war gplotauch, aber ich habe es nicht geschafft, es kurz genug zu machen ...
Stewie Griffin
6

Perl, 229 Bytes

Es verwendet die gleiche Formel wie die meisten anderen Sprachen, die für diese Herausforderung nicht geeignet sind (auch wenn ich sie nicht angeschaut habe, um sie zu finden, aber das ist eine ziemlich einfach zu findende Formel). Also nicht sehr interessant, aber normalerweise gibt es nicht viele Perl-Antworten auf diese Art von Herausforderungen, deshalb wollte ich nur eine vorschlagen.

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

Und Sie benötigen -MImager(9 Byte), -MMath::Trig( pi13 Byte) und -n(1 Byte) ==> + 23 Byte.

Um es auszuführen:

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

Es wird eine Datei mit dem Namen erstellt, t.pngdie das Bild enthält.

Sie müssen zwar installieren Imager, aber keine Sorge, es ist ganz einfach:

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

(Das echos konfiguriert dich cpan, wenn du es noch nie benutzt hast. (Eigentlich funktioniert das nur, wenn dein Perl aktuell genug ist. Ich denke, für die meisten von dir ist es das und es tut mir leid für die anderen!) .

Und die besser lesbare Version (ja, für ein Perl-Skript ist sie ziemlich gut lesbar!):

#!/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");

Bildbeschreibung hier eingeben

-1 Byte danke an Titus.

Dada
quelle
Benötigt Perl geschweifte Klammern um einzelne Befehle?
Titus
@Titus Wenn Sie sich auf die geschweiften Klammern nach den forSchleifen beziehen , dann sind sie obligatorisch.
Dada
Es gibt vorher ein Leerzeichen y2. Ich wette, das brauchst du nicht. Und kannst du STDOUT schreiben?
Titus
@Titus hmm ja danke. Ich glaube, mein Terminal hat hier eine neue Zeile eingefügt, sodass ich das Leerzeichen nicht gesehen habe.
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)

Jede Zeile wird separat in die Eingabeleiste eingegeben. Hier ist ein GIF, das die Ausführung zeigt:

Ausführung

Wie es funktioniert

Der polygonBefehl erstellt ein 20-seitiges Polygon mit den Eckpunkten der Grundlinie bei (0,0)und (1,0). Der nächste Befehl durchläuft dann imit den Befehlen und jeden Scheitelpunkt des Polygons mit Index sequenceund zeichnet mit dem Befehl vertexfür jeden Scheitelpunkt mit Index iein Liniensegment zu jedem anderen Scheitelpunkt mit Index .jsegment

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

schreibt das Bild nach STDOUT

Nervenzusammenbruch

// 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 für fest n=20

Ersetzen Sie $p=2*M_PImit 6(-8), /=$argv[1]mit =M_PI/10(-2) und $b>0mit $b(-2)

Die exakte Verwendung von PI / 10 schadet nicht. Mit .3142sind die Rundungsfehler aus der parametrisierten Version geblieben, aber mit sind M_PI/10sie verschwunden und ich kann $b(<> 0) statt überprüfen $b>0. Ich hätte mit zwei Bytes sparen können .314, aber das hätte die Punkte verschoben.

Das Limit $a<6ist für 20 Punkte ausreichend genau.

genauer PI-Graph

174 Bytes für fest 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);

Die Verwendung von 314 Punkten führt zu einem gefüllten Kreis in dieser Auflösung (ebenso wie 136.140, jede gerade Zahl darüber und alles über 317).

Titus
quelle
1
Gute Antwort, aber Sie haben anscheinend 20 fest codiert, anstatt diese als Eingabe zu verwenden?
Riking
1
@ Riking: Stimmt. Aber ich sehe keine Nachfrage in der Herausforderung, es zu parametrisieren.
Titus
4

NetLogo - 44 Bytes

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

NetLogo-Ausgabe

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

Produziert:

Schöne Achsenlabels, was?

-4 Bytes dank @Titus!

Frédéric
quelle
1
Nicht kürzer, aber es könnte mit schneller sein for(i in 2:n){for(j in 1:i)...}. Benötigt Rdie Hosenträger?
Titus
@Titus Du hast recht! Und nein, dort werden keine Zahnspangen benötigt. Vielen Dank !
Frédéric
3

BBC BASIC, 98 ASCII-Zeichen

Tokenized Dateigröße 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.

Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter

Es ist nichts Falsches daran, jede Linie zweimal zu zeichnen, das Aussehen ist identisch :-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

Ausgabe n = 21

Dies sieht im Original-Rendering viel besser aus als im Browser.

<code> Bildbeschreibung hier eingeben </ code>

Level River St
quelle
Vielen Dank für die Erinnerung an die LINEFunktion. Beats DRAW...
steenbergh
3

Oktave, 50 48 46 45 Bytes

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

Dies ist eine beliebige Funktion, die den gesuchten Graphen darstellt.

Erläuterung:

(k=0:2*pi/N:N)+k'Erstellt eine vollständige N+1 x N+1Adjekenzmatrix und definiert gleichzeitig den Winkelvektor k, für den wir dann [cos(k);sin(k)]'eine Koordinatenmatrix verwenden, in der jeder Graphknoten positioniert ist. gplotZeichnet einfach die Grafik, die wir wollen.

Denn N = 29wir bekommen:

Bildbeschreibung hier eingeben

fehlerhaft
quelle
2

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

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

Funktioniert nur für Primzahlen, z. B. den ursprünglichen Vorschlag von 37. Sie können den Anfangswert von halbieren (aufrunden) i, um ein blasseres Bild zu erhalten. Sie können die 1e3,2e3Werte auch konsequent an andere Geschmackswerte anpassen (ich habe angefangen, 300,600aber festgestellt, dass sie zu grob sind).

Neil
quelle
2

MATLAB, 36 Bytes

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

Dies ist eine nervige Funktion, die die Handlung erstellt.

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

Beispiel:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Luis Mendo
quelle
Ich bin überrascht, dass graphes nicht Teil der bioinformatischen Toolbox ist ... ich wusste gar nicht, dass es sie gibt ... Schön :)
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

Der Bildschirm in QBasic kann nur 640x480 sein, so dass der Kreis leider nur einen Radius von 230 px hat. Außerdem gibt es einige Artefakte aufgrund des Verlusts der Genauigkeit von Float-to-Int. Sieht so aus für N=36: Bildbeschreibung hier eingeben

EDIT: Ich brauchte nicht den Speicher, die Typdeklaration und die ganze Schleife. Die Berechnung aller Carthesians von Polars an Ort und Stelle ist in der Byteanzahl 50% billiger ...

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

Ich habe meine ursprüngliche Antwort von QBasic @LevelRiverSt auf QBIC konvertiert. Ich dachte, dies würde zu stark von Funktionen abhängen, die nicht in QBIC integriert sind, um durchführbar zu sein, aber wie sich herausstellt, werden weitere 90 Bytes eingespart. Durch Ersetzen DRAWvon werden LINEweitere 80 Byte eingespart. Ich wusste, dass ich etwas Einfaches vergessen hatte ...

Wenn es mit einem Befehlszeilenparameter von 36 ausgeführt wird, sieht es folgendermaßen aus:

Bildbeschreibung hier eingeben

steenbergh
quelle
1

Verarbeitung, 274 Bytes (239 + sizeAufruf und Funktionsaufruf)

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

Ich weiß ehrlich gesagt nicht warum, setupmusste aber in der zweiten Reihe sein. Ich habe https://en.wikipedia.org/wiki/Rotation_matrix verwendet , um die Mathematik für die Rotation zu berechnen. Dieses Programm berechnet die Punkte und verschiebt sie in ein Array, mit dem wir Linien zeichnen.

Hier ist ein Bild eines Polygons mit 50 Kanten (die 100 Kanten waren fast vollständig schwarz)

50 Punkte

Sie können hinzufügen stroke(0,alpha);, dass transparente Kanten vorhanden sind. Dabei alphahandelt es sich um die Deckkraft der Linie. Hier ist das gleiche Polygon mit alphavon 20.

Bildbeschreibung hier eingeben

Kritixi Lithos
quelle
1

Bash + Jelly + GraphViz, 52 Zeichen, 52 oder 63 Bytes

Angesichts der Tatsache, dass die fraglichen Programme nicht übereinstimmen, welche Zeichenkodierung verwendet werden soll, ist das Programm voll von Steuerzeichen. So sieht es xxdin der lateinischen 1-Kodierung aus (die jedes Zeichen in einem Byte darstellt):

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

Ich konnte das Programm jedoch nicht zum Laufen bringen, ohne die Eingabe aus irgendeinem Grund in UTF-8 umzuwandeln (was eine Länge von 63 Byte zur Folge hätte). Logischerweise sollte es als Latin-1 funktionieren - keines der Zeichen liegt außerhalb des Bereichs von 0 bis 255 -, aber ich erhalte weiterhin Fehler "String-Index außerhalb des Bereichs", egal wie ich die Umgebungsvariablen für die Zeichencodierung konfiguriere. Dies muss also als 63 Byte gezählt werden, es sei denn, jemand kann eine Möglichkeit finden, es auszuführen, ohne es neu zu codieren.

Das Programm ist möglicherweise etwas besser lesbar, wenn wir es in Jellys Codierung interpretieren:

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

Das Programm nimmt die Anzahl der Punkte auf der Standardeingabe und gibt ein PostScript-Bild auf der Standardausgabe aus. (Es kann trivial angepasst werden, um in jedem von GraphViz unterstützten Format auszugeben, indem das -Tpsam Ende geändert wird . Es ist nur so, dass PostScript den kürzesten Namen hat. Sie können -Tpswahrscheinlich fünf Zeichen speichern, indem Sie das entfernen , aber dann werden Sie im internen GraphViz-Bildformat ausgegeben das unterstützt sonst nichts, was für die zwecke der frage wohl nicht zählt.)

Grundsätzlich ist dies nur ein Jelly-Programm, das GraphViz zum Zeichnen aufruft. Jelly scheint jedoch keine Fähigkeiten zum Ausführen externer Programme zu haben, daher musste ich bash verwenden, um sie miteinander zu verknüpfen. (Dies bedeutet auch, dass es billiger ist, Jelly-Eingaben von stdin manuell anzufordern; normalerweise werden sie über die Befehlszeile eingegeben, dies würde jedoch zusätzliche Bytes im Bash-Wrapper bedeuten.) circoAlle Punkte, die gezeichnet werden sollen, werden automatisch in einem Kreis angeordnet Der Jelly-Code muss ihn also nur bitten, eine Liste von Punkten zu zeichnen, die alle miteinander verbunden sind. So funktioniert das:

Ɠ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

Durch die Verwendung von Jelly können wir den String, der die GraphViz-Ausgabe konfiguriert, über das integrierte Wörterbuch leicht komprimieren. Das Wörterbuch hat graph, nodeund point. Dummerweise hat es nicht shape(es hat SHAPE, aber GraphViz ist case-sensitive), so haben wir zu kodieren , die Zeichen- für -Zeichen.

Hier ist die Ausgabe für Eingabe 21 (mit einer geringfügigen Änderung am Programm, damit es in einem Format ausgegeben wird, das auf Stack Exchange hochgeladen werden kann):

vollständige Grafik auf 21 Punkten


quelle
0

PHP + HTML SVG, 316 263 Bytes

Golf-Version mit fest codierten nPunkten und ohne Eingabeparameter n:

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

Vorherige Golfversion mit Eingabeparameter für nPunkte, 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>

Verwendung: In einer Datei speichern und vom Browser aus aufrufen:

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

Ungolfed-Version mit Eingabeparameter für nPunkte und 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>

Ein voll funktionsfähiges 32-Punkte-Snippet konnte nicht angehängt werden, da für einen einzelnen Beitrag maximal 30.000 Zeichen zulässig sind. Hier ist ein Screenshot:

Bildbeschreibung hier eingeben

Das angehängte Snippet ist aufgrund des 30-KB-Limits für einzelne Posts auf 18 Punkte begrenzt.

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

Konnte 5 Bytes sparen, wenn ich das Argument loswurde, ,as=1das ein Seitenverhältnis von 1 erzwingt. Erstellt expand.grideine Matrix mit allen möglichen Punktpaaren und verwendet diese applyzum Durchlaufen.

N = 21

R + igraph 87 Bytes

Eine andere Lösung mit Paket igraph.

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

N = 21

Plannapus
quelle