Lingkaran berbaris, n poin

39

Gambarlah garis di antara setiap pasangan titik berbeda untuk ntitik - titik yang diatur dalam lingkaran, menghasilkan sesuatu seperti hasil di bawah ini. Kode terpendek (dalam byte) menang! Garis Anda tidak harus transparan, tetapi terlihat lebih baik seperti itu. Outputnya harus berupa grafik vektor, atau menjadi gambar setidaknya 600 piksel dengan 600 piksel (baik disimpan ke file atau ditampilkan di layar). Untuk menyelesaikan tantangan, Anda harus menggambar setidaknya 20.

masukkan deskripsi gambar di sini

J. Antonio Perez
sumber
7
Ini akan keren jika Anda harus mengambil angka ndan menggambar garis untuk npoin.
Yodle
2
Saya mendukung ide ini. Ubahlah sebelum seseorang mendapat jawaban pertama.
shooqie
2
@shooqie Maka judulnya tidak masuk akal, kecuali kalau itu bisa diedit oleh mod?
Yodle
2
Saya tidak berpikir mengubah 37 menjadi sewenang-wenang nakan menambah banyak tantangan karena saya mengharapkan sebagian besar solusi untuk bekerja dengan nomor berapa pun, terutama karena 37 aneh dan karenanya tidak ada simetri cermin.
Laikoni
3
Apakah kita mengambil nsebagai masukan atau hanya memilih yang sewenang-wenang nlebih dari 20?
Rɪᴋᴇʀ

Jawaban:

26

Mathematica, 13 byte

CompleteGraph

berbaris-lingkaran-37-poin

Sepertinya ini hanya gagal memberikan penyematan melingkar n=4, tetapi pertanyaannya menyatakann>=20

ngenisis
sumber
1
... dan ada saya mencoba menemukan cara yang benar untuk membuat fungsi untuk mengambil n(saya punya jawaban siap dari 37 diperbaiki) :(
Jonathan Allan
6
@carusocomputing Fungsi ini tidak ada hubungannya dengan "grafik" dalam arti memplot. Mathematica juga sangat baik untuk masalah teori grafik dan memiliki built-in untuk menghasilkan grafik yang lengkap sepertinya hal pertama yang akan saya tambahkan jika saya menambahkan dukungan untuk grafik ke bahasa saya. Satu-satunya alasan fungsi ini berguna untuk tantangan ini adalah bahwa grafik lengkap secara default diberikan dengan semua simpul yang diatur dalam lingkaran.
Martin Ender
2
Jika Anda akan mendukung grafik, lebih baik Anda memiliki fungsi grafik yang lengkap, IMO.
ngenisis
2
@carusocomputing Selamat datang di Mathematica, bahasa yang memiliki bawaan untuk setiap fungsi yang ada. :-P
HyperNeutrino
1
Saya mengunduh NetLogo karena saya pikir "multi-kura-kura akan melakukan pekerjaan singkat ini!" kemudian ingat bahwa Anda para matematikawan menggunakan versi dewasa.
wyldstallyns
13

MATL , 16 14 byte

Karena saya tidak terlalu fasih dengan MATL saya berharap ini agak lebih golf. (Akan lebih baik untuk setidaknya mengalahkan Mathematica :-) Yaitu flip wtidak optimal, mungkin bisa dihindari ...

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

Uji Online! (Terima kasih @Suever untuk layanan ini, terima kasih @DrMcMoylex untuk -2 byte.)

Penjelasan (untuk 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

Perlu dicatat bahwa untuk menghasilkan akar ke-N kesatuan Anda dapat menggunakan rumus exp(2*pi*i*k/N)untuk k=1,2,3,...,N. Tapi karena exp(pi*i/2) = iAnda juga bisa menulis i^(4*k/N)untuk k=1,2,3,...,Napa yang saya lakukan di sini.

cacat
sumber
1
Anda dapat mengubah XH:Hke:G
DJMcMayhem
1
Aaah aku lupa tentang Gterima kasih banyak!
flawr
11

PICO-8 , 131 byte

Saya tidak begitu yakin apakah saya akan melanggar aturan, tapi saya tetap melakukannya!

Golf

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

Tidak disatukan

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 kegilaan

PICO-8 adalah konsol fantasi berbasis Lua dengan resolusi asli 128x128. Saya membuat lingkaran sebesar yang saya bisa ...

Tyler MacDonell
sumber
9

Mathematica, 42 byte

Buat satu set 37 poin yang diatur dalam lingkaran, dan kemudian buat garis di antara semua himpunan bagian yang mungkin dari dua titik. Seseorang memposting jawaban yang lebih pendek yang mengambil keuntungan dari CompleteGraph, tapi saya percaya ini adalah yang terpendek selain dari mereka yang mengandalkan CompleteGraph.

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

masukkan deskripsi gambar di sini

J. Antonio Perez
sumber
3
Tidak perlu menghindari menggambar garis dari satu titik ke titik itu sendiri, sehingga Anda bisa menghemat 3 byte dengan menggunakan Tuple. Anda juga perlu memperbarui ini untuk menerima sewenang-wenang n, tetapi mudah tidak akan dikenakan biaya byte.
ngenisis
1
Dimaksudkan untuk mengatakanTuples
ngenisis
9

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

Menggunakan HTML5 Canvas API .

Lihat di 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 byte : Dihapus closePath(), dipindahkan ke stroke()dalambeginPath()

-2 bytes : Defined variable ainsiderotate()

Darrylyeo
sumber
8

Java, 346 338 322 301 Bytes

Solusi ini berfungsi untuk semua n>1, meskipun posting asli tidak mensyaratkan itu, itu benar.

Favorit saya adalah n=5, jangan tanya kenapa, juga, jika Anda ingin GUI yang lebih dingin, gunakan:

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

Di tempat 300 hard-coded, itu akan menggunakan lebar atau tinggi bingkai sebagai diameter.

Disimpan 8 byte berkat Shooqie. Disimpan 21 byte berkat 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();}

Output untuk n=37:

masukkan deskripsi gambar di sini

Guci Gurita Ajaib
sumber
Anda dapat drop Frame x=dan final(saya pikir?)
shooqie
@shooqie oops, Frame xberasal dari solusi lain yang melibatkan utas. Anda memerlukan final karena ini adalah referensi kelas internal ke variabel eksternal di kelas pemilik.
Magic Gurita Guci
Ini bekerja dengan baik di mesin saya. BTW Saya pikir Anda dapat mencukur beberapa byte dengan memindahkan intdeklarasi di luar forloop
shooqie
@shooqie di Java 6 itu mengatakan "Tidak bisa merujuk ke variabel lokal non-final n dalam lingkup melampirkan" pada waktu kompilasi.
Magic Gurita Guci
Ini bekerja untuk saya di Java 8, tetapi setelah Anda mengedit posting Anda, saya hanya mendapatkan layar putih.
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()

Output untuk n=37
n = 37

tongkat
sumber
1
Bukankah lebih from PIL import*pendek?
Roman Gräf
@ RomanGräf PIL adalah paket aneh, Anda tidak bisa import *, tergantung bagaimana Anda menginstalnya, Anda bisa melewatkan PIL dan mengimpor Image / ImageDraw secara langsung
Rod
6

Oktaf, 88 69 byte

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

Output untuk N=37:

masukkan deskripsi gambar di sini

Output untuk N=19:

masukkan deskripsi gambar di sini

Stewie Griffin
sumber
Oh, saya bahkan tidak memperhatikan bahwa sudah ada jawaban Octave yang lain :)
flawr
Pokoknya, kalahkan ya :-)
flawr
Satu mil! Pikiran pertamaku gplotjuga, tapi aku tidak berhasil membuatnya cukup pendek ...
Stewie Griffin
6

Perl, 229 byte

Ini menggunakan rumus yang sama seperti kebanyakan bahasa yang tidak memiliki builtin nyaman untuk tantangan ini (bahkan jika saya tidak melihat mereka untuk menemukannya, tapi itu rumus yang cukup mudah ditemukan). Jadi tidak terlalu menarik, tetapi biasanya tidak ada banyak jawaban Perl untuk tantangan semacam ini, jadi saya hanya ingin mengusulkan satu.

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

Dan Anda akan membutuhkan -MImager(9 byte), -MMath::Trig(menyediakanpi , 13 byte), dan -n(1 byte) ==> 23 byte.

Untuk menjalankannya:

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

Itu akan membuat file bernama t.png yang berisi gambar.

Anda harus menginstalnya Imager, tetapi jangan khawatir, ini cukup mudah:

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

(Itu echo S akan mengonfigurasi Anda cpan jika Anda belum pernah menggunakannya sebelumnya (sebenarnya itu hanya akan bekerja jika perl Anda cukup baru, saya pikir untuk sebagian besar dari Anda akan, dan saya minta maaf untuk yang lain!)) .

Dan versi yang lebih mudah dibaca (ya, itu cukup mudah dibaca untuk skrip 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");

masukkan deskripsi gambar di sini

-1 byte terima kasih kepada Titus.

Dada
sumber
Apakah Perl membutuhkan kawat gigi di sekitar perintah tunggal?
Titus
@Titus Jika Anda merujuk ke kawat gigi setelah forloop, maka ya, itu wajib.
Dada
Ada yang kosong sebelumnya y2. Saya yakin Anda tidak membutuhkannya. Dan bisakah Anda menulis ke STDOUT?
Titus
@Titus hmm memang, terima kasih. Saya pikir saya terminal saya meletakkan baris baru di sini jadi saya tidak melihat ruang.
Dada
5

GeoGebra , 92 byte

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

Setiap baris dimasukkan secara terpisah ke bilah masukan. Berikut adalah gif yang menunjukkan eksekusi:

Eksekusi

Bagaimana itu bekerja

The polygonPerintah menciptakan poligon 20 sisi, dengan simpul dari baseline di (0,0)dan (1,0). Perintah selanjutnya kemudian mengulangi setiap titik dari poligon dengan indeks i, menggunakan sequencedan vertexperintah, dan untuk setiap titik dengan indeks i, menggambar segmen garis ke setiap titik lainnya dengan indeks jmenggunakan segmentperintah.

TheBikingViking
sumber
4

PHP, 186 184 196 byte

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

menulis gambar ke STDOUT

kerusakan

// 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 byte untuk diperbaiki n=20

Ganti $p=2*M_PIdengan 6(-8), /=$argv[1]dengan =M_PI/10(-2), dan $b>0dengan $b(-2)

Menggunakan tepat PI / 10 tidak sakit. Dengan .3142, kesalahan pembulatan dari versi parametrized tetap, tetapi dengan M_PI/10mereka lenyap dan saya dapat memeriksa $b(<> 0) alih-alih $b>0. Saya bisa menyimpan dua byte dengan.314 , tapi itu akan mengesampingkan poin.

Batasnya $a<6cukup tepat untuk 20 poin.

grafik PI yang tepat

174 byte untuk diperbaiki 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);

Menggunakan 314 poin menghasilkan lingkaran yang diisi dalam resolusi itu (seperti halnya 136.140, setiap angka genap di atas itu, dan semua yang di atas 317).

Titus
sumber
1
Jawaban yang bagus, tetapi sepertinya Anda telah melakukan hardcode 20 alih-alih menganggapnya sebagai input?
Bersepeda
1
@Riking: Benar. Tetapi saya tidak melihat adanya tuntutan dalam tantangan untuk parametrizing itu.
Titus
4

NetLogo - 44 byte

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

Output NetLogo

wyldstallyns
sumber
4

R, 127 123 byte

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

Menghasilkan:

Label sumbu yang bagus, eh?

-4 byte terima kasih kepada @Titus!

Frédéric
sumber
1
Tidak lebih pendek, tetapi bisa lebih cepat dengan for(i in 2:n){for(j in 1:i)...}. Apakah Rmembutuhkan kawat gigi?
Titus
@Itus Anda benar! Dan tidak, tidak ada kawat gigi yang dibutuhkan di sana. Terima kasih!
Frédéric
3

BBC BASIC, 98 karakter ascii

File Tokenised berukuran 86 byte

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.

Juru bahasa Dowload di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Tidak ada yang salah dengan menggambar setiap garis dua kali, penampilannya identik :-P

Tidak disatukan

  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

Output n = 21

Ini terlihat jauh lebih baik di rendering asli daripada di browser.

<code> masukkan deskripsi gambar di sini </code>

Level River St
sumber
Terima kasih telah mengingatkan saya pada LINEfungsinya. Beats DRAW...
steenbergh
3

Oktaf, 50 48 46 45 byte

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

Ini adalah fungsi anyonmous yang memplot grafik yang kita cari.

Penjelasan:

(k=0:2*pi/N:N)+k'Membuat N+1 x N+1matriks adjecency penuh dan secara bersamaan mendefinisikan vektor ksudut, yang kemudian kita gunakan untuk [cos(k);sin(k)]', matriks koordinat di mana setiap node grafik diposisikan. gplothanya plot grafik yang kita inginkan.

Untuk N = 29kita dapatkan:

masukkan deskripsi gambar di sini

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

Hanya berfungsi untuk bilangan prima, seperti saran asli 37. Anda dapat membagi dua (dibulatkan) nilai awal iuntuk mendapatkan gambar yang lebih redup. Anda juga dapat secara konsisten menyesuaikan nilai 1e3,2e3-nilai lain dengan selera (saya mulai dengan 300,600tetapi memutuskan bahwa itu terlalu kasar).

Neil
sumber
2

MATLAB, 36 byte

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

Ini adalah fungsi anoymous yang menciptakan plot.

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

Contoh:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Luis Mendo
sumber
Saya terkejut graphbukan bagian dari kotak peralatan bioinformatika ... bahkan tidak tahu itu ada ... Bagus :)
Stewie Griffin
1

QBasic 4.5, 398 271 byte

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

Layar di QBasic hanya dapat menjadi 640x480, jadi lingkaran memiliki radius hanya 230 px, sayangnya. Juga, ada beberapa artefak karena kehilangan presisi float-to-int. Sepertinya ini untuk N=36: masukkan deskripsi gambar di sini

EDIT: Saya tidak perlu penyimpanan, deklarasi tipe dan semua perulangan. Menghitung semua Carthesians dari Polar di tempat adalah 50% lebih murah dalam hitungan byte ...

steenbergh
sumber
1

QBIC , 98 94 byte

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

Saya telah mengonversi jawaban QBasic asli saya @LevelRiverSt ke QBIC. Saya pikir ini akan terlalu bergantung pada fungsi-fungsi yang tidak dibangun ke dalam QBIC menjadi layak, tetapi ternyata, ia menghemat 90 byte lagi. Mengganti DRAWuntukLINE menghemat 80 byte lainnya. Saya tahu saya lupa sesuatu yang sederhana ...

Saat dijalankan dengan parameter baris perintah 36, tampilannya seperti ini:

masukkan deskripsi gambar di sini

steenbergh
sumber
1

Memproses, 274 byte (239 + sizepanggilan dan panggilan fungsi)

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

Jujur saya tidak tahu kenapa, tetapi setupharus di baris kedua. Saya menggunakan https://en.wikipedia.org/wiki/Rotation_matrix untuk membantu saya menghitung matematika untuk rotasi. Program ini menghitung poin dan mendorongnya ke array, yang kita gunakan untuk menggambar garis.

Ini adalah gambar poligon dengan 50 sisi (yang 100 sisi hampir hitam)

50 poin

Anda dapat menambahkan stroke(0,alpha);untuk memiliki tepi transparan, di mana alphaopacity garis. Berikut poligon yang sama dengan alphadari 20.

masukkan deskripsi gambar di sini

Kritixi Lithos
sumber
1

Bash + Jelly + GraphViz, 52 karakter, 52 atau 63 byte

Mengingat bahwa program yang dipertanyakan tidak setuju pada pengkodean karakter mana yang akan digunakan, program ini penuh dengan karakter kontrol. Berikut tampilannya di bawah xxd, dalam pengodean Latin-1 (yang mewakili setiap karakter dalam satu 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

Saya benar-benar tidak bisa menjalankan program, meskipun, tanpa mengubah input ke UTF-8 untuk beberapa alasan (yang akan membuatnya 63 byte panjang). Logikanya seharusnya berfungsi sebagai Latin-1 - tidak ada karakter yang berada di luar rentang 0 hingga 255 - tapi saya terus mendapatkan kesalahan "string index out of range" tidak peduli bagaimana saya mengkonfigurasi variabel lingkungan pengkodean karakter. Jadi ini harus dihitung sebagai 63 byte kecuali jika seseorang dapat menemukan cara untuk menjalankannya tanpa melakukan pengkodean ulang.

Program ini mungkin sedikit lebih mudah dibaca jika kita menafsirkannya dalam pengkodean Jelly:

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

Program ini mengambil sejumlah titik pada input standar dan menghasilkan gambar PostScript pada output standar. (Ini dapat dengan mudah diadaptasi ke keluaran dalam format apa pun yang didukung GraphViz dengan mengubah-Tps di akhir; Hanya saja PostScript memiliki nama terpendek. Bisa dibilang, Anda dapat menyimpan lima karakter dengan menghapus -Tps, tetapi kemudian Anda mendapatkan output dalam format gambar internal GraphViz yang tidak didukung oleh hal lain, yang mungkin tidak diperhitungkan untuk tujuan pertanyaan.)

Pada dasarnya, ini hanya program Jelly yang memanggil GraphViz untuk melakukan menggambar; Namun, Jelly tampaknya tidak memiliki kemampuan untuk menjalankan program eksternal, jadi saya harus menggunakan bash untuk menghubungkannya bersama. (Ini juga berarti bahwa lebih murah untuk membuat input permintaan Jelly dari stdin secara manual; biasanya dibutuhkan input dari baris perintah, tetapi itu berarti byte tambahan dalam bash wrapper.) Secara circootomatis akan mengatur semua poin yang diminta untuk menggambar dalam lingkaran. , jadi kode Jelly hanya perlu memintanya untuk menggambar daftar poin, yang semuanya terhubung satu sama lain. Begini cara kerjanya:

Ɠ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

Penggunaan Jelly memungkinkan kita sedikit mengompresi string yang mengkonfigurasi output GraphViz melalui kamus bawaannya. Kamus memiliki graph, node, dan point. Menjengkelkan, tidak ada shape(yaSHAPE , tetapi GraphViz peka terhadap huruf besar-kecil), jadi kita harus menyandikan karakter per karakter.

Berikut ini adalah output untuk input 21 (dengan sedikit modifikasi pada program untuk membuatnya output dalam format yang dapat diunggah ke Stack Exchange):

grafik lengkap pada 21 poin


sumber
0

PHP + HTML SVG, 316 263 byte

Versi golf dengan ntitik hardcoded dan tanpa nparameter input :

<svg height="610" width="610"><?for($i=1;$i<33;$i++){$x[]=300*sin(2*M_PI/32*$i)+305;$y[]=300*cos(2*M_PI/32)+305;}foreach($x as$j=>$w){foreach($y as$k=>$z){echo'<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" style="stroke:red;"/>';}}?></svg>

Versi golf sebelumnya dengan parameter input untuk npoin, 316 byte:

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

Penggunaan: simpan dalam file dan panggilan dari browser:

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

Versi tidak dikoleksi dengan parameter input untuk npoin dan 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>

Tidak dapat melampirkan cuplikan 32 poin yang berfungsi penuh karena batas karakter 30k untuk satu pos. Ini screenshotnya:

masukkan deskripsi gambar di sini

Cuplikan terlampir terbatas pada 18 poin karena batas posting 30k tunggal.

Mario
sumber
0

R, 108 byte

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

Bisa memotong 5 byte jika saya menyingkirkan argumen ,as=1yang memaksa rasio aspek 1. Menggunakan expand.griduntuk membuat matriks dengan semua kemungkinan pasangan poin, dan menggunakan applyuntuk mengulanginya.

N = 21

R + igraph, 87 byte

Solusi lain menggunakan paket igraph.

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

N = 21

plannapus
sumber