Dizilmiş daire, n noktaları


39

nAşağıdaki sonuç gibi bir şey üreterek, bir daire içinde düzenlenmiş noktalar için her farklı nokta çifti arasına çizgi çizin . En kısa kod (bayt cinsinden) kazanır! Çizgilerinizin saydam olması gerekmez, ancak bu şekilde daha iyi görünür. Çıktı bir vektör grafiği olmalı veya en az 600 piksel x 600 piksel boyutunda bir görüntü olmalıdır (bir dosyaya kaydedilir veya ekranda görüntülenir). Meydan okumayı tamamlamak için en az 20 puan almalısın.

görüntü tanımını buraya girin


7
Bir numara alıp puanlar niçin çizgiler çekmek zorunda kalsan çok iyi olurdu n.
Yodle

2
İkinci olarak bu fikri. Birisi ilk cevabı almadan önce değiştirin.
shooqie

2
@shooqie Öyleyse, başlık modlar tarafından düzenlenemezse, bir şey olmaz mıydı?
Yodle

2
37'yi keyfi olarak değiştirmenin nzorluğa daha fazla katkı sağlayacağını sanmıyorum , çünkü çoğu çözümün herhangi bir sayı ile çalışmasını beklerim, özellikle 37 tuhaf ve dolayısıyla ayna simetrileri olmadığı için.
Laikoni

3
nGirdi olarak mı alıyoruz yoksa n20'den fazla bir keyfi mi seçiyoruz ?
Rɪᴋᴇʀ

Yanıtlar:


26

Mathematica, 13 bayt

CompleteGraph

dizilmiş daire-37-noktaları

Görünüşe göre bu sadece dairesel bir yerleştirme yapamamaktadır n=4, fakat soru belirtilmektedir.n>=20


1
... ve bir işlevi yerine getirmenin doğru yolunu bulmaya çalışıyordum n(cevabı sabit 37'den hazırladım) :(
Jonathan Allan 18

6
@ carusocomputing Bu fonksiyonun çizim anlamında "grafik" ile ilgisi yoktur. Mathematica, grafik teorisi problemleri için de çok iyidir ve eksiksiz bir grafik oluşturmak için yerleşik bir sisteme sahip olmak, grafikler için dilime destek eklersem ekleyeceğim ilk şey gibi görünüyor. Bu işlevin bu meydan okuma için kullanışlı olmasının tek nedeni, tam grafiklerin varsayılan olarak bir daire içinde düzenlenmiş tüm köşeleri oluşturmasıdır.
Martin Ender

2
Grafikleri destekleyecekseniz, yerleşik bir grafik işlevine (IMO) sahip olsanız iyi olur.
ngenis,

2
@carusocomputing Varolan her işlev için yerleşik bir dil olan Mathematica'ya hoş geldiniz. :-P
HyperNeutrino

1
NetLogo'yu indiriyordum çünkü "çok kaplumbağanın bu işi kısa süreceğini düşünüyorum!" Sonra hatırladım, matematikçiler yetişkin versiyonunu kullanıyorlar.
wyldstallyns

13

MATL , 16 14 bayt

MATL ile çok akıcı olmadığım için bunun biraz daha golf oynanabilir olmasını bekliyorum. (En azından Mathematica'yı yenmek güzel olurdu :-) Yani, kapak wen uygun değil, muhtemelen önlenebilirdi ...

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

Çevrimiçi Test Edin! (Bu servis için @Suever @ teşekkürler, -2 bayt için @DrMcMoylex'e teşekkürler.)

Açıklama (için 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

N'inci birlik köklerini oluşturmak için formül exp(2*pi*i*k/N)için kullanabileceğinizi belirtmekte fayda var k=1,2,3,...,N. Ama bu yana exp(pi*i/2) = ida yazabilirim i^(4*k/N)için k=1,2,3,...,Nhangi burada ne işim budur.


1
Değişebilirsin XH:Hiçin:G
DJMcMayhem

1
Aaah Ben unuttum Gçok teşekkür ederim!
kusur

11

PICO-8 , 131 bayt

Herhangi bir kuralı ihlal edip edemeyeceğimden emin değildim ama yine de yaptım!

golfed

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 delilik

PICO-8, 128x128 çözünürlüğe sahip bir Lua tabanlı fantezi konsolu . Çevreyi olabildiğince büyük yaptım ...


9

Mathematica, 42 bayt

Bir daire içinde düzenlenmiş 37 nokta kümesi oluşturur ve ardından iki noktadaki olası tüm alt kümeler arasında çizgiler çizer. Birisi CompleteGraph’tan yararlanan daha kısa bir cevap gönderdi, ancak bunun CompleteGraph’a güvenenler arasında en kısa cevap olduğuna inanıyorum.

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

görüntü tanımını buraya girin


3
Bir noktadan kendisine çizgi çizmekten kaçınmanıza gerek yoktur, böylece 3 bayt kullanarak tasarruf edebilirsiniz Tuple. Ayrıca keyfi olarak kabul etmek için bunu güncellemeniz gerekir n, ancak uygun bir şekilde size herhangi bir bayta mal olmaz.
ngenis

1
Söylemeye gerek yokTuples
ngenisis

9

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

HTML5 Canvas API'sini kullanma .

CodePen'de görün .

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 bayt : kaldırıldı closePath(), taşınan stroke()içindebeginPath()

-2 bayt : aİçinde tanımlanmış değişkenrotate()


8

Java, 346 338 322 301 Bayt

Bu çözüm herkes için işe yarıyor n>1, orijinal gönderi gerektirmese de, gerektiriyor.

En sevdiğim, n=5neden daha soğuk bir GUI istiyorsanız, neden kullanmayın:

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

Kodlanmış 300'ün yerine, çerçevenin genişliğini veya yüksekliğini çap olarak kullanır.

Shooqie sayesinde 8 byte kurtarıldı. Geobits sayesinde 21 byte kurtarıldı.

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

İçin çıktı n=37:

görüntü tanımını buraya girin


Sen düşebilir Frame x=ve final(sanırım?)
shooqie

@shooqie ayy, Frame xbir iş parçacığı içeren başka bir çözüm oldu. Sahip sınıftaki harici değişkene dahili bir sınıf referansı olduğu için final finaline ihtiyacınız var.
Sihirli Ahtapot Urn

Makinemde gayet iyi çalışıyor. intfor
Btw

@shooqie, Java 6'da derleme zamanında "Nihai yerel değişkene ekte bir kapsam dahilinde değinilemiyor" diyor.
Sihirli Ahtapot Urn

Java 8'de benim için çalıştı, ancak yazınızı düzenledikten sonra sadece beyaz ekran alıyorum.
shooqie

7

Python 2, 258 235 229 Bayt

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

İçin çıktı n=37
n = 37


1
Daha from PIL import*kısa olmaz mıydı ?
Roman Gräf

@ RomanGräf PIL garip bir pakettir, import *nasıl kuracağınıza bağlı olarak , PIL'i atlayıp doğrudan Image / ImageDraw'ı içe aktarabilirsiniz
Rod

6

Octave, 88 69 bayt

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

İçin çıktı N=37:

görüntü tanımını buraya girin

İçin çıktı N=19:

görüntü tanımını buraya girin


Ah, daha önce başka bir Octave cevabı olduğunu bile fark etmedim :)
kusur

Her neyse, ya yenmek :-)
kusur

Bir mil kadar! İlk düşüncem de oldu gplot, ama yeterince kısa tutamamıştım ...
Stewie Griffin

6

Perl, 229 bayt

Bu zorluk için uygun yerleşik yapıya sahip olmayan birçok dille aynı formülü kullanır (bulmak için onlara bakmasam bile, ancak bu formül bulmak oldukça kolaydır). Bu yüzden çok ilginç değil, ancak bu tür zorluklara genellikle çok fazla Perl cevabı yok, bu yüzden sadece bir tane teklif etmek istedim.

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

Ve -MImager(9 bayt), -MMath::Trig(sağlama pi, 13 bayt) ve -n(1 bayt) ==> + 23 bayta ihtiyacınız olacak.

Çalıştırmak için:

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

t.pngGörüntüyü içeren bir dosya oluşturacaktır .

ImagerYine de yüklemeniz gerekecek , ancak endişelenmenize gerek yok, oldukça kolay:

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

(Daha echoönce hiç kullanmadıysanız, sizi cpan yapılandıracak. (Aslında perl'iniz yeterince yakınsa işe yarayacak, bence çoğunuz için olacak ve diğerleri için üzgünüm!) .

Ve daha okunabilir versiyon (evet, bir Perl betiği için oldukça okunabilir!):

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

görüntü tanımını buraya girin

Titus sayesinde -1 bayt.


Perl, tek bir komut etrafında parantez gerektiriyor mu?
Titus,

@Titus Döngüden sonraki ayraçları belirtirseniz for, evet, zorunludur.
Dada

Daha önce boş yer var y2. İddiaya girerim buna ihtiyacın yok. Ve STDOUT'a yazabilir misin?
Titus,

@Titus hmm gerçekten, teşekkürler. Sanırım terminalim buraya yeni bir çizgi koydu, bu yüzden alanı görmedim.
Dada

5

GeoGebra , 92 bayt

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

Her satır ayrı ayrı giriş çubuğuna girilir. İşte yürütmeyi gösteren bir gif:

infaz

Nasıl çalışır

polygonKomut başlangıca köşeleri ile, bir 20 yüzlü çokgen oluşturur (0,0)ve (1,0). Ardından bir sonraki komut i, sequenceve vertexkomutlarını kullanarak çokgenin her bir köşesi üzerinde, index ile yinelenir ve index ile her bir köşe için , komutu kullanarak idizini olan her diğer köşe için bir çizgi parçası çizer .jsegment


4

PHP, 186 184 196 bayt

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

görüntüyü STDOUT'a yazar

Yıkmak

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

Yerine $p=2*M_PIile 6(-8), /=$argv[1]ile =M_PI/10(2), ve $b>0ile $b(-2)

Tam PI / 10 kullanılması zarar vermez. İle .3142, parametreli hale getirilmiş versiyondaki yuvarlama hataları kaldı, fakat M_PI/10ortadan kayboldu ve $byerine (<> 0) kontrol edebiliyorum $b>0. İki bayt ile kurtarabilirdim .314, ama bu puanları mahvedebilir.

Sınır $a<620 puan için yeterince kesin.

kesin PI grafiği

Sabit için 174 bayt 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);

314 puan kullanmak, bu çözünürlükte doldurulmuş bir daireyle sonuçlanır (136,140 gibi, bunun üzerindeki her çift sayı ve 317'nin üzerindeki her şey).


1
İyi cevap, ancak bunu girdi olarak almak yerine 20 kod yazmışsınız gibi görünüyor?
Riking

1
@Riking: Doğru. Ancak parametrizize girme mücadelesinde talep göremiyorum.
Titus 11


4

R, 127 123 bayt

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

Üretir:

Güzel eksenin etiketleri?

@Titus sayesinde -4 bayt !


1
Daha kısa değil, ancak daha hızlı olabilirdi for(i in 2:n){for(j in 1:i)...}. Does Rdiş telleri gerektirir?
Titus,

@Titus Haklısın! Ve hayır, orada hiçbir teli gerekmez. Teşekkürler !
Frederic

3

BBC BASIC, 98 ascii karakter

Tokenised dosya boyutu 86 bayt

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.

Dowload tercümanı http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Her çizgiyi iki kez çizerken yanlış bir şey yoktur, görünüm aynıdır :-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

Çıktı n = 21

Bu, orijinal görüntülemede tarayıcıdan daha iyi görünüyor.

<code> buraya resim açıklamasını girin </code>


Bana LINEfonksiyonu hatırlattığın için teşekkür ederim . Beats DRAW...
steenbergh

3

Octave, 50 48 46 45 bayt

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

Bu, aradığımız grafiği çizen önemli bir işlevdir.

Açıklama:

(k=0:2*pi/N:N)+k'Tam bir N+1 x N+1bitişik matris yapar ve eşzamanlı olarak her bir grafik düğümün konumlandırıldığı bir koordinat matrisi kiçin kullandığımız açı vektörünü tanımlar [cos(k);sin(k)]'. gplotsadece istediğimiz grafiği çizer.

İçin N = 29biz almak:

görüntü tanımını buraya girin


2

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

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

Yalnızca 37 olan asıl öneri gibi asal sayılar için çalışır i. Daha soluk bir görüntü elde etmek için başlangıç ​​değerini yarıya indirebilir (yuvarlayabilirsiniz) . Ayrıca 1e3,2e3tatmak için sürekli olarak diğer değerlere de ayarlayabilirsiniz (ile başladım 300,600ama çok kaba olduğuna karar verdim).


2

MATLAB, 36 bayt

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

Bu, arsa yaratan çok büyük bir işlevdir.

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

Örnek:

görüntü tanımını buraya girin

görüntü tanımını buraya girin


graphBiyoinformatik araç kutusunun bir parçası olmadığına şaşırdım ... var olduğunu bile bilmiyordum ... Güzel :)
Stewie Griffin

1

QBasic 4.5, 398 271 bayt

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

QBasic'deki ekran 640x480 olabilir, bu nedenle daire maalesef sadece 230 piksellik bir yarıçapa sahiptir. Ayrıca, float-int hassasiyet kaybı nedeniyle bazı eserler var. Şunun için gibi görünüyor N=36: görüntü tanımını buraya girin

EDIT: Depolamaya, tip bildirgesine ve tüm döngüye ihtiyacım yoktu. Tüm Carthesians'ları Polar'lardan yerinde hesaplamak bayt sayısında% 50 daha ucuz ...


1

QBIC , 98 94 bayt

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

Ben dönüştürdüğünüz benim orijinal QBasic cevabım Qbic için @LevelRiverSt cevabını. Bunun, QBIC'e yapılamayacak fonksiyonlara çok fazla güvenebileceğini düşündüm, ancak ortaya çıktığı gibi, başka bir 90 byte tasarruf sağlıyor. İkame DRAWFOR LINEbaşka 80 bayt kaydeder. Basit bir şeyi unuttuğumu biliyordum.

36 komut satırı parametresiyle çalıştırdığınızda şöyle görünür:

görüntü tanımını buraya girin


1

İşlem, 274 bayt (239 + sizeçağrı ve işlev çağrısı)

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

Gerçekten nedenini bilmiyorum ama setupikinci sırada olmak zorundaydım. Rotasyon için matematiği hesaplamama yardımcı olmak için https://en.wikipedia.org/wiki/Rotation_matrix kullandım . Bu program noktaları hesaplar ve bunları çizgiler çizmek için kullandığımız diziye iter.

İşte 50 kenarlı bir poligonun resmi (100 kenar, neredeyse tamamen siyahtı)

50 puan

Çizginin opaklığının stroke(0,alpha);olduğu alpha, saydam kenarlara sahip olmak için ekleyebilirsiniz . Burada aynı poligon var alphaiçinde 20.

görüntü tanımını buraya girin


1

Bash + Jelly + GraphViz, 52 karakter, 52 veya 63 bayt

Söz konusu programların hangi karakter kodlamanın kullanılacağı konusunda anlaşamadığı göz önüne alındığında, program kontrol karakterleriyle doludur. xxdLatin-1 kodlamasının altında (her bir karakteri bir bayt olarak gösterir), altında göründüğü gibi :

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

Gerçi, bir nedenden dolayı girişi UTF-8'e dönüştürmeden programın çalışmasını sağlayamadım (63 bayt uzunluğunda olacaktı). Mantıksal olarak, Latin-1 olarak çalışması gerekir - karakterlerden hiçbiri 0 - 255 aralığının dışında değil - ancak karakter kodlama ortamı değişkenlerini nasıl yapılandırsam da, "dizge dizini aralık dışında" hataları alıyorum. Bu yüzden, birileri yeniden kodlamadan çalıştırmanın bir yolunu bulamazsa, bu 63 bayt olarak sayılmalıdır.

Jelly’in kodunda yorum yaparsak program biraz daha okunabilir olabilir:

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

Program standart girdideki nokta sayısını alır ve standart çıktıdaki PostScript görüntüsünü çıkarır. (Teorik olarak değiştirerek herhangi bir biçimde GraphViz desteklerde çıkışına adapte edilebilir -TpsTartışılır sen kaldırarak beş karakter kaydedebilirsiniz PostScript kısa adı vardır bu sadece var;. Uçta -Tps, ancak o zaman Graphviz dahili görüntü formatında çıktısını almak Başka hiçbir şeyin desteklemediğini, muhtemelen sorunun amaçlarına sayılmaz.)

Temel olarak, bu sadece çizim yapmak için GraphViz'e çağrı yapan bir Jelly programıdır; Ancak, Jelly dış programları çalıştırmak için herhangi bir yeteneğe sahip görünmüyor, bu yüzden bunları birbirine bağlamak için bash kullanmak zorunda kaldım. (Bu aynı zamanda Jelly istek girişini elle stdin'den daha ucuz hale getirmenin daha ucuz olduğu anlamına gelir; normal olarak komut satırından girdi alır, ancak bu, bash paketleyicide fazladan bayt anlamına gelir.) circoBir daire içinde çizmesi istenen tüm noktaları otomatik olarak düzenler . Jöle kodu, yalnızca birbirlerine bağlı bir nokta listesi çizmesini istemek zorundadır. İşte nasıl çalışıyor:

Ɠ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

Jelly kullanımı, GraphViz çıktısını yerleşik sözlüğü aracılığıyla yapılandıran dizeyi hafifçe sıkıştırmamıza izin veriyor. Sözlük sahiptir graph, nodeve point. Can sıkıcı bir şekilde yok shape( sahip değil SHAPE, ancak GraphViz büyük / küçük harf duyarlıdır), o yüzden karakter karakterini kodlamamız gerekiyor.

İşte giriş 21 için çıktı (programın Stack Exchange'e yüklenebilecek bir biçimde çıktısı alınmasını sağlamak için program üzerinde küçük bir değişiklikle):

21 noktada tam grafik


0

PHP + HTML SVG, 316 263 bayt

Sabit kodlanmış nve giriş nparametresi bulunmayan golflü versiyon :

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

n316 baytlık puanlar için giriş parametresi olan önceki golf versiyonu :

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

Kullanım: bir dosyaya kaydedin ve tarayıcıdan çağrı yapın:

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

Puanlar nve CSS için giriş parametresiyle sınıflandırılmamış sürüm :

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

Tek bir gönderi için 30k karakter sınırı nedeniyle, 32 nokta tamamen işlevsel bir snippet eklenemedi. İşte bir ekran görüntüsü:

görüntü tanımını buraya girin

Ekteki snippet, 30k tek gönderi sınırı nedeniyle 18 puanla sınırlandırıldı.


0

R, 108 bayt

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

,as=11 en boy oranını zorlayan bir argümandan kurtulursam 5 bayt'ı tıraş edebilirim expand.grid, tüm olası nokta çiftleriyle bir matris oluşturmak için kullanır applyve üzerinden geçmek için kullanır .

N = 21

R + igraph, 87 bayt

Paketi kullanan başka bir çözüm igraph.

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

N = 21

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.