มีวงกลมเรียงกัน, n จุด


39

ลากเส้นระหว่างจุดที่แตกต่างกันทุกคู่สำหรับnจุดที่จัดเรียงเป็นวงกลมทำให้เกิดผลลัพธ์ดังนี้ รหัสที่สั้นที่สุด (เป็นไบต์) ชนะ! เส้นของคุณไม่จำเป็นต้องโปร่งใส แต่มันดูดีกว่านี้ ผลลัพธ์จะต้องเป็นกราฟิกแบบเวกเตอร์หรือเป็นภาพอย่างน้อย 600 พิกเซลคูณ 600 พิกเซล (บันทึกเป็นไฟล์หรือแสดงบนหน้าจอ) เพื่อให้การท้าทายคุณจะต้องวาดอย่างน้อย 20

ป้อนคำอธิบายรูปภาพที่นี่


7
มันจะเจ๋งถ้าคุณต้องใช้จำนวนnและวาดเส้นเพื่อให้ได้nคะแนน
Yodle

2
ฉันสองความคิดนี้ เปลี่ยนก่อนที่จะมีใครได้รับคำตอบแรก
shooqie

2
@shooqie ดังนั้นชื่อจะไม่สมเหตุสมผลเว้นแต่ว่า mods จะสามารถแก้ไขได้หรือไม่
Yodle

2
ฉันไม่คิดว่าการเปลี่ยน 37 เป็นข้อผิดพลาดnจะเพิ่มความท้าทายมากขึ้นเพราะฉันคาดว่าโซลูชันส่วนใหญ่จะทำงานกับหมายเลขใด ๆ โดยเฉพาะอย่างยิ่งเพราะ 37 เป็นเลขคี่และด้วยเหตุนี้จึงไม่มีกระจกสมมาตร
Laikoni

3
เราใช้nเป็นอินพุตหรือแค่เลือกnมากกว่า 20 ข้อ?
Rɪᴋᴇʀ

คำตอบ:


26

Mathematica ขนาด 13 ไบต์

CompleteGraph

เรียงรายขึ้นวงกลม-37 จุด

ดูเหมือนว่าสิ่งนี้จะไม่สามารถทำการฝังแบบวงกลมn=4ได้เท่านั้น แต่คำถามนั้นn>=20


1
... และมีฉันพยายามหาวิธีที่ถูกต้องเพื่อให้ฟังก์ชั่นที่จะใช้n(ฉันมีคำตอบพร้อมจากคงที่ 37) :(
Jonathan Allan

6
@carusocomputing ฟังก์ชั่นนี้ไม่มีอะไรเกี่ยวข้องกับ "กราฟ" ในแง่ของการวางแผน Mathematica ยังดีมากสำหรับปัญหาทฤษฎีกราฟและการมีในตัวเพื่อสร้างกราฟที่สมบูรณ์ดูเหมือนสิ่งแรกที่ฉันจะเพิ่มถ้าฉันเพิ่มการสนับสนุนกราฟให้กับภาษาของฉัน เหตุผลเดียวที่ฟังก์ชั่นนี้มีประโยชน์สำหรับความท้าทายนี้คือกราฟที่สมบูรณ์จะแสดงตามค่าเริ่มต้นพร้อมกับทุกจุดในวงกลม
Martin Ender

2
หากคุณจะสนับสนุนกราฟคุณควรมีฟังก์ชันกราฟที่สมบูรณ์แบบในตัว IMO
ngenisis

2
@carusocomputing ยินดีต้อนรับสู่ Mathematica ภาษาที่มีอยู่ในตัวสำหรับทุกฟังก์ชั่นที่มีอยู่ :-P
HyperNeutrino

1
ฉันดาวน์โหลด NetLogo เพราะฉันคิดว่า "เต่าหลายตัวจะทำงานสั้น ๆ นี้!" จากนั้นก็จำได้ว่าคุณนักคณิตศาสตร์ใช้เวอร์ชั่นที่โตแล้ว
wyldstallyns

13

MATL , 16 14 ไบต์

เนื่องจากฉันไม่คล่องแคล่วอย่างมากกับ MATL ฉันคาดหวังว่าสิ่งนี้จะสามารถเล่นกอล์ฟได้มากกว่า (จะดีที่จะชนะอย่างน้อย Mathematica :-) คือพลิกwไม่ดีที่สุดก็อาจจะหลีกเลี่ยง ...

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

ทดสอบออนไลน์! (ขอบคุณ @Suever สำหรับบริการนี้ขอบคุณ @DrMcMoylex สำหรับ -2 ไบต์)

คำอธิบาย (สำหรับ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-TH รากของความสามัคคีคุณสามารถใช้สูตรสำหรับexp(2*pi*i*k/N) k=1,2,3,...,Nแต่เนื่องจากexp(pi*i/2) = iคุณยังสามารถเขียนi^(4*k/N)สำหรับk=1,2,3,...,Nซึ่งเป็นสิ่งที่ผมกำลังทำอะไรที่นี่


1
คุณสามารถเปลี่ยนXH:Hเป็น:G
DJMcMayhem

1
Aaah ฉันลืมGขอบคุณมาก!
ข้อบกพร่อง

11

PICO-8 , 131 ไบต์

ฉันไม่แน่ใจจริง ๆ ว่าฉันจะทำผิดกฎใด ๆ แต่ฉันก็ทำมันต่อไป!

แข็งแรงเล่นกอล์ฟ

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

PICO-8 เป็นคอนโซลแฟนตาซีจาก Lua ที่มีความละเอียดเนสต์128x128 ฉันสร้างวงกลมให้ใหญ่ที่สุดเท่าที่จะทำได้ ...


9

Mathematica ขนาด 42 ไบต์

สร้างชุดของ 37 คะแนนที่จัดเรียงในวงกลมแล้ววาดเส้นระหว่างชุดย่อยที่เป็นไปได้ทั้งหมดของสองจุด มีคนโพสต์คำตอบสั้น ๆ ที่ใช้ประโยชน์จาก CompleteGraph แต่ฉันเชื่อว่านี่เป็นคำตอบที่สั้นที่สุดนอกเหนือจากที่ใช้ CompleteGraph

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

ป้อนคำอธิบายรูปภาพที่นี่


3
ไม่มีความจำเป็นที่จะหลีกเลี่ยงการวาดเส้นจากจุดของตัวเองเพื่อให้คุณสามารถบันทึก 3 Tupleไบต์โดยใช้ คุณต้องอัปเดตสิ่งนี้เพื่อยอมรับโดยพลการnแต่สะดวกสบายที่จะไม่เสียค่าใช้จ่ายใด ๆ กับไบต์
ngenisis

1
หมายถึงการพูดTuples
ngenisis

9

HTML + JS (ES6), 34 + 177 164 162 = 196 ไบต์

ใช้ผ้าใบ HTML5 API

เห็นมันบน 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 ไบต์ : ลบclosePath()ย้ายไปstroke()ด้านในbeginPath()

-2 ไบต์ : ตัวแปรที่กำหนดไว้aภายในrotate()


8

Java, 346 338 322 301 Bytes

วิธีนี้ใช้ได้ผลกับทุกคนn>1แม้ว่าโพสต์ดั้งเดิมจะไม่ต้องการก็ตาม

สิ่งที่ฉันชอบคือn=5อย่าถามว่าทำไมถ้าคุณต้องการ GUI ที่มีความเย็นกว่าให้ใช้:

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

แทนที่ฮาร์ดโค้ด 300 มันจะใช้ความกว้างหรือความสูงของกรอบเป็นเส้นผ่านศูนย์กลาง

บันทึกไปแล้ว 8 ไบต์ขอบคุณ Shooqie บันทึกแล้ว 21 ไบต์ขอบคุณ 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();}

เอาท์พุทสำหรับn=37:

ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถวางFrame x=และfinal(ฉันคิดว่า?)
shooqie

@shooqie oops Frame xมาจากโซลูชันอื่นที่เกี่ยวข้องกับเธรด คุณต้องการขั้นสุดท้ายเนื่องจากเป็นการอ้างอิงคลาสภายในกับตัวแปรภายนอกในคลาสที่เป็นเจ้าของ
Magic Octopus Urn

มันใช้งานได้ดีบนเครื่องของฉัน BTW ฉันคิดว่าคุณสามารถโกนบาง bytes โดยย้ายintประกาศนอกforลูป
shooqie

@shooqie ใน Java 6 กำลังพูดว่า "ไม่สามารถอ้างถึงตัวแปรท้องถิ่นที่ไม่ใช่ครั้งสุดท้าย n ในขอบเขตการปิดล้อม" ในเวลารวบรวม
Magic Octopus Urn

มันใช้งานได้สำหรับฉันบน Java 8 แต่หลังจากที่คุณแก้ไขโพสต์ของคุณฉันจะได้รับหน้าจอสีขาว
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()

ผลผลิตสำหรับ n=37
n = 37


1
จะไม่from PIL import*สั้นลงหรือ
Roman Gräf

@ RomanGräf PIL เป็นแพ็คเกจแปลก ๆ ที่คุณไม่สามารถทำได้import *คุณสามารถข้าม PIL และนำเข้า Image / ImageDraw ได้โดยตรง
Rod

6

ระดับแปดเสียง88 69 ไบต์

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

เอาท์พุทสำหรับN=37:

ป้อนคำอธิบายรูปภาพที่นี่

เอาท์พุทสำหรับN=19:

ป้อนคำอธิบายรูปภาพที่นี่


โอ้ฉันไม่ได้แจ้งให้ทราบว่ามีอยู่แล้วอีกคำตอบ Octave :)
flawr

อย่างไรก็ตามเอาชนะ ya :-)
flawr

อีกหนึ่งไมล์! ความคิดแรกของฉันก็gplotเช่นกัน แต่ฉันก็ไม่สามารถทำให้มันสั้นพอ ...
Stewie Griffin

6

Perl, 229 ไบต์

มันใช้สูตรเดียวกับภาษาส่วนใหญ่ที่ไม่มี builtin ที่สะดวกสำหรับความท้าทายนี้ (แม้ว่าฉันจะไม่ได้มองหาพวกเขา แต่มันก็เป็นสูตรที่หาง่ายพอสมควร) ไม่ค่อยน่าสนใจเท่าไหร่ แต่มักจะมีคำตอบ Perl ไม่มากสำหรับความท้าทายแบบนี้ดังนั้นฉันแค่อยากจะเสนอ

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

และคุณจะต้อง-MImager(9 ไบต์), -MMath::Trig(ให้บริการpi, 13 ไบต์) และ-n(1 ไบต์) ==> + 23 ไบต์

วิธีเรียกใช้:

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.pngซึ่งมีภาพ

คุณจะต้องติดตั้งImagerแต่ไม่ต้องกังวลมันค่อนข้างง่าย:

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

( echoมันจะกำหนดค่าคุณ cpan ถ้าคุณไม่เคยใช้มันมาก่อน (อันที่จริงแล้วมันจะใช้ได้ก็ต่อเมื่อ Perl ของคุณเร็วพอฉันคิดว่าส่วนใหญ่ของคุณจะเป็นและฉันขอโทษสำหรับคนอื่น ๆ !) .

และรุ่นที่อ่านได้มากขึ้น (ใช่มันค่อนข้างอ่านได้สำหรับสคริปต์ 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");

ป้อนคำอธิบายรูปภาพที่นี่

-1 ไบต์ขอบคุณ Titus


Perl ต้องการการจัดฟันด้วยคำสั่งเดี่ยวหรือไม่?
ติตัส

@Titus หากคุณอ้างถึงวงเล็บปีกกาหลังforลูปแล้วใช่พวกเขามีผลบังคับใช้
Dada

ที่y2นั่นว่างเปล่ามาก่อน ฉันพนันได้เลยว่าคุณไม่ต้องการมัน และคุณเขียนถึง STDOUT ได้ไหม?
ติตัส

@Tios hmm แน่นอนขอบคุณ ฉันคิดว่าฉันเทอร์มินัลของฉันใส่บรรทัดใหม่ที่นี่ดังนั้นฉันจึงไม่เห็นพื้นที่
Dada

5

GeoGebra , 92 ไบต์

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

แต่ละบรรทัดถูกป้อนแยกกันในแถบป้อนข้อมูล นี่คือ gif แสดงการดำเนินการ:

การกระทำ

มันทำงานอย่างไร

polygonคำสั่งสร้างรูปหลายเหลี่ยม 20 เหลี่ยมกับจุดของพื้นฐานที่และ(0,0) (1,0)คำสั่งต่อไปแล้ว iterates กว่าจุดสุดยอดของรูปหลายเหลี่ยมที่มีค่าดัชนีแต่ละiการใช้sequenceและvertexคำสั่งและสำหรับแต่ละจุดสุดยอดที่มีค่าดัชนีiดึงส่วนของเส้นตรงทุกจุดสุดยอดอื่น ๆ ที่มีค่าดัชนีjการใช้segmentคำสั่ง


4

PHP, 186 184 196 ไบต์

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

เขียนภาพไปยัง STDOUT

ชำรุด

// 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 ไบต์สำหรับการแก้ไข n=20

แทนที่$p=2*M_PIด้วย6(-8) /=$argv[1]ด้วย=M_PI/10(-2) และ$b>0ด้วย$b(-2)

การใช้ PI / 10 ที่แน่นอนจะไม่เจ็บ ด้วย.3142การปัดเศษข้อผิดพลาดจากรุ่น parametrized ยังคงอยู่ แต่กับM_PI/10พวกเขาหายไปและฉันสามารถตรวจสอบ$b(<> 0) $b>0แทน ฉันสามารถบันทึกสองไบต์ด้วย.314แต่นั่นจะมีการปิดจุด

ขีด จำกัด$a<6นั้นแน่นอนเพียงพอสำหรับ 20 คะแนน

กราฟ PI ที่แน่นอน

174 ไบต์สำหรับการแก้ไข 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 คะแนนจะทำให้ได้วงกลมที่มีการเติมเต็มในความละเอียดนั้น (เช่นเดียวกับ 136,140 ทุกเลขคู่ข้างต้นและทุกอย่างที่สูงกว่า 317)


1
คำตอบที่ดี แต่ดูเหมือนว่าคุณ hardcoded 20 แทนที่จะใช้เป็นอินพุต?
Riking

1
@Riking: จริง แต่ฉันไม่เห็นความต้องการในสิ่งที่ท้าทายสำหรับการสกัดกั้นมัน
ติตัส


4

R, 127 123 ไบต์

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

ผลิต:

ป้ายกำกับแกนที่ดีเอ่อ?

-4 ไบต์ขอบคุณ @Titus!


1
ไม่สั้น for(i in 2:n){for(j in 1:i)...}แต่มันอาจจะเร็วขึ้นด้วย ไม่Rจำเป็นต้องมีการจัดฟันหรือไม่
ติตัส

@Titus คุณพูดถูก! และไม่ไม่จำเป็นต้องมีเครื่องมือจัดฟัน ขอบคุณมาก!
Frédéric

3

BBC BASIC, 98 ascii ตัวละคร

Tokenised ขนาดไฟล์ 86 ไบต์

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 ที่http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

ไม่มีอะไรผิดปกติกับการวาดทุกบรรทัดสองครั้ง

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

เอาท์พุท n = 21

สิ่งนี้ดูดีกว่าในการเรนเดอร์ดั้งเดิมมากกว่าเบราว์เซอร์

<code> ป้อนคำอธิบายภาพที่นี่ </code>


ขอบคุณที่เตือนฉันถึงLINEฟังก์ชั่น Beats DRAW...
steenbergh

3

Octave, 50 48 46 45 bytes

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

นี่คือฟังก์ชั่นที่ไม่ซ้ำใครและกราฟที่เรากำลังมองหา

คำอธิบาย:

(k=0:2*pi/N:N)+k'สร้างN+1 x N+1เมทริกซ์ adjecency เต็มรูปแบบและกำหนดเวกเตอร์kของมุมที่เราใช้[cos(k);sin(k)]'เป็นเมทริกซ์ของพิกัดที่แต่ละตำแหน่งของโหนดกราฟ gplotเพียงแปลงกราฟที่เราต้องการ

สำหรับN = 29เราได้รับ:

ป้อนคำอธิบายรูปภาพที่นี่


2

JavaScript (ES5) / SVG (HTML5), 181 ไบต์

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

ใช้งานได้กับหมายเลขเฉพาะเช่นคำแนะนำดั้งเดิมที่ 37 คุณสามารถลดครึ่งแรก (ปัดเศษขึ้น) เป็นค่าเริ่มต้นiเพื่อให้ได้ภาพที่ซีดกว่า คุณยังสามารถปรับ1e3,2e3ค่าเป็นค่าอื่น ๆ เพื่อลิ้มรสอย่างสม่ำเสมอ(ฉันเริ่มต้นด้วย300,600แต่ตัดสินใจว่ามันหยาบเกินไป)


2

MATLAB, 36 ไบต์

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

นี่คือฟังก์ชั่น anoymous ที่สร้างพล็อต

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

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


ฉันประหลาดใจที่graphไม่ได้เป็นส่วนหนึ่งของกล่องเครื่องมือทางชีวินวิทยา ... ไม่รู้ด้วยซ้ำว่ามันมีอยู่จริง ... Nice :)
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

หน้าจอใน QBasic สามารถ onl เป็น 640x480 ดังนั้นวงกลมมีรัศมีเพียง 230 พิกเซลโชคไม่ดี นอกจากนี้ยังมีสิ่งประดิษฐ์บางอย่างเนื่องจากการสูญเสียความแม่นยำแบบ float-to-int ดูเหมือนว่านี้สำหรับN=36: ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: ฉันไม่ต้องการที่เก็บข้อมูล, การประกาศประเภทและการวนซ้ำทั้งหมด การคำนวณ Carthesians ทั้งหมดจาก Polars ในสถานที่นั้นถูกกว่า 50% ในจำนวนไบต์ ...


1

QBIC , 98 94 ไบต์

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

ฉันได้แปลงคำตอบ QBasic ดั้งเดิมของ @LevelRiverSt เป็น QBIC ฉันคิดว่าสิ่งนี้จะต้องอาศัยฟังก์ชั่นที่ไม่ได้สร้างไว้ใน QBIC มากเกินไป แต่เป็นไปได้ว่าจะช่วยประหยัดได้อีก 90 ไบต์ การแทนที่ DRAWสำหรับLINEบันทึกอีก 80 ไบต์ ฉันรู้ว่าฉันลืมสิ่งที่ง่าย ...

เมื่อรันด้วยพารามิเตอร์บรรทัดคำสั่งที่ 36 จะมีลักษณะดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


1

กำลังประมวลผล 274 ไบต์ (239 + การsizeโทรและการเรียกใช้ฟังก์ชัน)

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

ฉันไม่รู้จริง ๆ ว่าทำไม แต่setupต้องอยู่ในบรรทัดที่สอง ฉันใช้https://en.wikipedia.org/wiki/Rotation_matrixเพื่อช่วยฉันคำนวณการหมุน โปรแกรมนี้จะคำนวณคะแนนและผลักพวกเขาไปยังอาร์เรย์ที่เราใช้ในการวาดเส้น

นี่คือรูปภาพของรูปหลายเหลี่ยมที่มี 50 ขอบ (100 ขอบที่หนึ่งเกือบดำสนิท)

50 คะแนน

คุณสามารถเพิ่มstroke(0,alpha);เพื่อให้มีขอบโปร่งใสซึ่งalphaเป็นความทึบของเส้น นี่เป็นรูปหลายเหลี่ยมเช่นเดียวกันกับของalpha20

ป้อนคำอธิบายรูปภาพที่นี่


1

Bash + Jelly + GraphViz, 52 ตัวอักษร, 52 หรือ 63 ไบต์

เนื่องจากโปรแกรมที่มีปัญหาไม่เห็นด้วยกับการเข้ารหัสอักขระที่จะใช้โปรแกรมเต็มไปด้วยอักขระควบคุม นี่คือลักษณะที่ปรากฏxxdในการเข้ารหัสละติน -1 (ซึ่งแสดงถึงอักขระแต่ละตัวในหนึ่งไบต์):

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

ฉันไม่สามารถทำให้โปรแกรมทำงานได้จริงโดยไม่ต้องแปลงอินพุตเป็น UTF-8 ด้วยเหตุผลบางอย่าง (ซึ่งจะทำให้ยาว 63 ไบต์) เหตุผลมันควรทำงานเป็น Latin-1 - ไม่มีตัวอักษรใดอยู่นอกช่วง 0 ถึง 255 - แต่ฉันยังคงได้รับข้อผิดพลาด "ดัชนีสตริงอยู่นอกช่วง" ไม่ว่าฉันจะกำหนดค่าตัวแปรสภาพแวดล้อมการเข้ารหัสอักขระอย่างไร ดังนั้นจะต้องมีการนับเป็น 63 ไบต์ยกเว้นว่ามีบางคนสามารถหาวิธีในการเรียกใช้โดยไม่ต้องเข้ารหัสซ้ำ

โปรแกรมอาจอ่านได้มากกว่านี้เล็กน้อยหากเราตีความในการเข้ารหัสของเยลลี่:

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

โปรแกรมใช้จำนวนคะแนนในอินพุตมาตรฐานและส่งออกอิมเมจ PostScript บนเอาต์พุตมาตรฐาน (มันสามารถนิด ๆ นำไปปรับใช้กับการส่งออกในรูปแบบใด GraphViz สนับสนุนโดยการเปลี่ยน-Tpsในตอนท้ายมันเป็นเพียงแค่ว่า PostScript มีชื่อสั้นเบบี้คุณสามารถบันทึกห้าตัวอักษรโดยการลบ. -Tpsแต่แล้วคุณจะได้รับการส่งออกในรูปแบบภาพภายใน GraphViz ของ ไม่มีสิ่งใดรองรับซึ่งอาจไม่นับรวมกับจุดประสงค์ของคำถาม)

โดยพื้นฐานแล้วนี่เป็นเพียงโปรแกรม Jelly ที่เรียกใช้ GraphViz เพื่อวาดรูป อย่างไรก็ตามดูเหมือนว่า Jelly จะไม่มีความสามารถในการใช้งานโปรแกรมภายนอกดังนั้นฉันจึงต้องใช้ bash เพื่อเชื่อมโยงเข้าด้วยกัน (ยังเป็นที่ซึ่งหมายความว่ามันถูกกว่าที่จะทำให้การป้อนข้อมูลคำขอวุ้นจาก stdin ด้วยตนเองตามปกติจะใช้เวลาในการป้อนข้อมูลจากบรรทัดคำสั่ง แต่นั่นก็หมายความว่าไบต์พิเศษในการห่อหุ้มทุบตี.) circoจะจัดให้มีทุกจุดก็ขอให้วาดเป็นวงกลมโดยอัตโนมัติ ดังนั้นรหัส Jelly ต้องขอให้วาดรายการคะแนนทั้งหมดเชื่อมต่อซึ่งกันและกัน นี่คือวิธีการทำงาน:

Ɠ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 ช่วยให้เราบีบอัดสตริงที่กำหนดค่าเอาต์พุต GraphViz ผ่านพจนานุกรมในตัวเล็กน้อย พจนานุกรมมีgraph, และnode pointน่ารำคาญที่มันไม่มีshape(มันมีSHAPEแต่ GraphViz เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ดังนั้นเราต้องเข้ารหัสตัวอักษรแบบตัวอักษรต่ออักขระ

ต่อไปนี้เป็นผลลัพธ์สำหรับอินพุต 21 (โดยมีการดัดแปลงเล็กน้อยกับโปรแกรมเพื่อให้เอาต์พุตในรูปแบบที่สามารถอัปโหลดไปยัง Stack Exchange):

กราฟที่สมบูรณ์ใน 21 คะแนน


0

PHP + HTML SVG, 316 263 ไบต์

เวอร์ชัน Golfed ที่มีnคะแนนฮาร์ดโค้ดและไม่มี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>

รุ่น golfed ก่อนหน้าพร้อมพารามิเตอร์อินพุตสำหรับnจุด 316 ไบต์:

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

การใช้งาน: บันทึกในไฟล์และโทรจากเบราว์เซอร์:

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

เวอร์ชันที่ไม่อัปโหลดพร้อมพารามิเตอร์อินพุตสำหรับnคะแนนและ 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>

ไม่สามารถแนบตัวอย่างข้อมูลที่ใช้งานได้ 32 คะแนนอย่างเต็มที่เนื่องจากความยาวสูงสุดที่ จำกัด ของตัวอักษร 30k สำหรับโพสต์เดียว นี่คือภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างข้อมูลที่แนบมานั้นถูก จำกัด ไว้ที่ 18 คะแนนเนื่องจากขีด จำกัด การโพสต์เดียวขนาด 30k


0

R, 108 ไบต์

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

สามารถโกนออกได้ 5 ไบต์ถ้าฉันกำจัดอาร์กิวเมนต์,as=1ซึ่งบังคับให้อัตราส่วนกว้างยาวเป็น 1 ใช้expand.gridเพื่อสร้างเมทริกซ์ที่มีจุดที่เป็นไปได้ทั้งหมดและใช้applyในการวนรอบมัน

N = 21

R + igraph, 87 ไบต์

igraphทางออกก็ใช้แพคเกจ

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

N = 21

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.