Xếp thành vòng tròn, n điểm


39

Vẽ các đường giữa mỗi cặp điểm khác biệt cho ncác điểm được sắp xếp trong một vòng tròn, tạo ra kết quả giống như kết quả bên dưới. Mã ngắn nhất (tính bằng byte) sẽ thắng! Các dòng của bạn không phải trong suốt, nhưng nó có vẻ tốt hơn theo cách đó. Đầu ra phải là một đồ họa vector hoặc là một hình ảnh ít nhất 600 pixel x 600 pixel (được lưu vào một tệp hoặc được hiển thị trên màn hình). Để hoàn thành thử thách, bạn phải vẽ ít nhất 20.

nhập mô tả hình ảnh ở đây


7
Thật tuyệt nếu bạn phải lấy một số nvà vẽ các đường cho nđiểm.
Yodle

2
Tôi thứ hai ý tưởng này. Thay đổi nó trước khi ai đó nhận được câu trả lời đầu tiên.
shooqie

2
@shooqie Sau đó, tiêu đề sẽ không có ý nghĩa, trừ khi điều đó có thể được chỉnh sửa bởi các mod?
Yodle

2
Tôi không nghĩ việc thay đổi 37 thành tùy ý nsẽ thêm nhiều thách thức vì tôi hy vọng hầu hết các giải pháp sẽ hoạt động với bất kỳ số nào, đặc biệt là vì 37 là số lẻ và do đó không có đối xứng gương.
Laikoni

3
Chúng ta có nlàm đầu vào hay chỉ chọn một tùy ý ntrên 20?
Rɪᴋᴇʀ

Câu trả lời:


26

Toán học, 13 byte

CompleteGraph

xếp hàng-vòng tròn-37 điểm

Có vẻ như điều này chỉ thất bại trong việc nhúng hình tròn n=4, nhưng câu hỏi nêu rõn>=20


1
... và có tôi đã cố gắng tìm ra cách chính xác để thực hiện một chức năng n(Tôi đã có sẵn câu trả lời từ bản sửa lỗi 37) :(
Jonathan Allan

6
@carusocomputing Chức năng này không liên quan gì đến "vẽ đồ thị" theo nghĩa âm mưu. Mathematica cũng rất tốt cho các vấn đề lý thuyết đồ thị và có tích hợp để tạo ra một biểu đồ hoàn chỉnh có vẻ như là điều đầu tiên tôi sẽ thêm nếu tôi thêm hỗ trợ cho biểu đồ vào ngôn ngữ của mình. Lý do duy nhất mà hàm này xảy ra là hữu ích cho thử thách này là các biểu đồ hoàn chỉnh theo mặc định được hiển thị với tất cả các đỉnh được sắp xếp trong một vòng tròn.
Martin Ender

2
Nếu bạn sẽ hỗ trợ biểu đồ, tốt hơn là bạn nên tích hợp chức năng biểu đồ hoàn chỉnh, IMO.
ngenisis

2
@carusocomputing Chào mừng bạn đến với Mathematica, ngôn ngữ được tích hợp sẵn cho mọi chức năng hiện có. :-P
HyperNeutrino

1
Tôi đã tải xuống NetLogo vì tôi nghĩ rằng "nhiều con rùa sẽ tạo ra tác phẩm ngắn này!" sau đó nhớ bạn Mathicalans đang sử dụng phiên bản trưởng thành.
wyldstallyns

13

MATL , 16 14 byte

Vì tôi không rành về MATL lắm, tôi hy vọng rằng điều này có phần dễ chơi hơn. (Sẽ tốt hơn nếu ít nhất đánh bại Mathicala :-) Tức là cú lật wkhông tối ưu, có lẽ có thể tránh được ...

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

Kiểm tra nó trực tuyến! (Cảm ơn @Suever cho dịch vụ này, cảm ơn @DrMcMoylex cho -2 byte.)

Giải thích (cho 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

Điều đáng chú ý là để tạo ra nguồn gốc thống nhất N-th, bạn có thể sử dụng công thức exp(2*pi*i*k/N)cho k=1,2,3,...,N. Nhưng vì exp(pi*i/2) = ibạn cũng có thể viết i^(4*k/N)cho k=1,2,3,...,Nnhững gì tôi đang làm ở đây.


1
Bạn có thể đổi XH:Hthành:G
DJMcMayhem

1
Aaah tôi quên Gcảm ơn bạn rất nhiều!
flawr

11

PICO-8 , 131 byte

Tôi đã không thực sự chắc chắn nếu tôi vi phạm bất kỳ quy tắc nào, nhưng dù sao tôi cũng đã làm điều đó!

Chơi gôn

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

Bị đánh cắp

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

Sự điên rồ 128x128

PICO-8 là một bảng điều khiển giả tưởng dựa trên Lua với độ phân giải 128x128. Tôi đã làm cho vòng tròn lớn nhất có thể ...


9

Toán học, 42 byte

Tạo một tập hợp gồm 37 điểm được sắp xếp trong một vòng tròn và sau đó vẽ các đường thẳng giữa tất cả các tập hợp con có thể có của hai điểm. Ai đó đã đăng một câu trả lời ngắn hơn tận dụng lợi thế của CompleteGraph, nhưng tôi tin rằng đây là câu trả lời ngắn nhất ngoài những người dựa vào CompleteGraph.

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

nhập mô tả hình ảnh ở đây


3
Không cần phải tránh vẽ các đường từ một điểm đến chính nó, vì vậy bạn có thể tiết kiệm 3 byte bằng cách sử dụng Tuple. Bạn cũng cần cập nhật điều này để chấp nhận tùy ý n, nhưng thuận tiện là bạn sẽ không tốn bất kỳ byte nào.
ngenisis

1
Có nghĩa là để nóiTuples
ngenisis

9

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

Sử dụng API Canvas HTML5 .

Xem nó trên 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 : Đã xóa closePath(), di chuyển stroke()bên trongbeginPath()

-2 byte : Biến xác định abên trongrotate()


8

Java, 346 338 322 301 byte

Giải pháp này hoạt động cho tất cả n>1, mặc dù bài đăng gốc không yêu cầu điều đó, nhưng nó có.

Yêu thích của tôi là n=5, đừng hỏi tại sao, ngoài ra, nếu bạn muốn có một GUI mát hơn, hãy sử dụng:

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

Thay cho 300 mã hóa cứng, nó sẽ sử dụng chiều rộng hoặc chiều cao của khung làm đường kính.

Đã lưu 8 byte nhờ Shooqie. Đã lưu 21 byte nhờ 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();}

Đầu ra cho n=37:

nhập mô tả hình ảnh ở đây


Bạn có thể thả Frame x=final(tôi nghĩ vậy?)
shooqie

@shooqie oops, Frame xlà từ một giải pháp khác có liên quan đến một chủ đề. Bạn cần cuối cùng mặc dù đó là một tham chiếu lớp bên trong đến một biến bên ngoài trong lớp sở hữu.
Bạch tuộc ma thuật Urn

Nó hoạt động tốt trên máy của tôi. BTW Tôi nghĩ rằng bạn có thể tắt một số byte bằng cách di chuyển các intkhai báo bên ngoài các forvòng lặp
shooqie

@shooqie trong Java 6 có câu "Không thể tham chiếu đến biến cục bộ n không phải là cuối cùng trong phạm vi kèm theo" tại thời điểm biên dịch.
Bạch tuộc ma thuật Urn

Nó hoạt động với tôi trên Java 8, nhưng sau khi bạn chỉnh sửa bài đăng của mình, tôi chỉ nhận được màn hình trắng.
shooqie

7

Python 2, 258 235 229 byte

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

Đầu ra cho n=37
n = 37


1
Sẽ không from PIL import*ngắn hơn?
Roman Gräf

@ RomanGräf PIL là một gói kỳ lạ, bạn không thể import *, tùy thuộc vào cách bạn cài đặt, bạn có thể bỏ qua PIL và nhập trực tiếp Image / ImageDraw
Rod

6

Octave, 88 69 byte

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

Đầu ra cho N=37:

nhập mô tả hình ảnh ở đây

Đầu ra cho N=19:

nhập mô tả hình ảnh ở đây


Ồ, tôi thậm chí không nhận thấy rằng đã có một câu trả lời khác của Octave :)
flawr

Dù sao, đánh bại ya :-)
flawr

Bằng một dặm! Suy nghĩ đầu tiên của tôi gplotcũng vậy, nhưng tôi đã không xoay sở đủ ngắn ...
Stewie Griffin

6

Perl, 229 byte

Nó sử dụng cùng một công thức như hầu hết các ngôn ngữ không có nội dung thuận tiện cho thử thách này (ngay cả khi tôi không nhìn vào chúng để tìm nó, nhưng đó là một công thức khá dễ tìm). Vì vậy, không thú vị lắm, nhưng thường không có nhiều câu trả lời của Perl cho loại thử thách này, vì vậy tôi chỉ muốn đề xuất một câu hỏi.

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

Và bạn sẽ cần -MImager(9 byte), -MMath::Trig(cung cấp pi, 13 byte) và -n(1 byte) ==> + 23 byte.

Để chạy nó:

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

Nó sẽ tạo một tập tin có tên t.pngchứa hình ảnh.

Bạn sẽ cần phải cài đặt Imagermặc dù, nhưng không phải lo lắng, nó khá dễ dàng:

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

(Các echos sẽ cấu hình cpan của bạn nếu bạn chưa từng sử dụng nó trước đây (thực ra điều đó sẽ chỉ hoạt động nếu perl của bạn đủ gần đây, tôi nghĩ rằng đối với hầu hết các bạn sẽ như vậy, và tôi xin lỗi cho những người khác!)) .

Và phiên bản dễ đọc hơn (vâng, nó khá dễ đọc đối với tập lệnh 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");

nhập mô tả hình ảnh ở đây

-1 byte nhờ Titus.


Perl có yêu cầu niềng răng xung quanh các lệnh đơn không?
Tít

@Titus Nếu bạn đề cập đến niềng răng sau các forvòng, thì có, chúng là bắt buộc.
Dada

Có trốngsa trống trước y2. Tôi cá là bạn không cần. Và bạn có thể viết cho STDOUT không?
Tít

@Titus hmm thật, cảm ơn. Tôi nghĩ rằng thiết bị đầu cuối của tôi đặt một dòng mới ở đây vì vậy tôi đã không nhìn thấy không gian.
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)

Mỗi dòng được nhập riêng vào thanh đầu vào. Đây là một gif hiển thị việc thực thi:

Chấp hành

Làm thế nào nó hoạt động

Các polygonlệnh tạo ra một đa giác 20 mặt, với các đỉnh của đường cơ sở tại (0,0)(1,0). Lệnh tiếp theo sau đó lặp qua mỗi đỉnh của đa giác với chỉ số i, sử dụng sequencevertexcác lệnh, và đối với mỗi đỉnh với chỉ số i, vẽ một đoạn thẳng cho mọi đỉnh khác với chỉ số jbằng cách sử dụng segmentlệnh.


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

ghi hình ảnh vào STDOUT

phá vỡ

// 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 cho cố định n=20

Thay thế $p=2*M_PIbằng 6(-8), /=$argv[1]bằng =M_PI/10(-2) và $b>0bằng $b(-2)

Sử dụng chính xác PI / 10 không làm tổn thương. Với .3142, các lỗi làm tròn từ phiên bản tham số vẫn còn, nhưng với M_PI/10chúng đã biến mất và tôi có thể kiểm tra $b(<> 0) thay vì $b>0. Tôi có thể đã lưu hai byte với .314, nhưng điều đó sẽ đặt ra các điểm.

Giới hạn $a<6này đủ chính xác cho 20 điểm.

đồ thị PI chính xác

Đã sửa lỗi 174 byte 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);

Sử dụng 314 điểm dẫn đến một vòng tròn được lấp đầy trong độ phân giải đó (cũng như 136.140, mọi số chẵn trên đó và mọi thứ trên 317).


1
Câu trả lời hay, nhưng có vẻ như bạn đã mã hóa 20 thay vì lấy đó làm đầu vào?
Đi xe đạp

1
@ Đi xe đạp: Đúng. Nhưng tôi có thể thấy không có nhu cầu trong thách thức đối với việc bán nó.
Tít


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

Sản xuất:

Trục đẹp 'nhãn hả?

-4 byte nhờ @Titus!


1
Không ngắn hơn, nhưng nó có thể nhanh hơn với for(i in 2:n){for(j in 1:i)...}. Có Ryêu cầu niềng răng?
Tít

@Titus Bạn nói đúng! Và không, không cần niềng răng ở đó. Cảm ơn !
Frédéric

3

BBC BASIC, 98 ký tự ascii

Kích thước tệp được mã hóa 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.

Thông dịch viên tải xuống tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Không có gì sai khi vẽ mỗi dòng hai lần, ngoại hình giống hệt nhau :-P

Bị đánh cắp

  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

Đầu ra n = 21

Điều này có vẻ tốt hơn nhiều trong kết xuất ban đầu so với trong trình duyệt.

<code> nhập mô tả hình ảnh tại đây </ code>


Cảm ơn đã nhắc nhở tôi về LINEchức năng. Nhịp đập DRAW...
steenbergh

3

Octave, 50 48 46 45 byte

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

Đây là một hàm bất thường vẽ đồ thị mà chúng ta đang tìm kiếm.

Giải trình:

(k=0:2*pi/N:N)+k'Tạo một N+1 x N+1ma trận điều chỉnh đầy đủ và đồng thời xác định vectơ kcác góc mà chúng ta sử dụng sau đó cho [cos(k);sin(k)]'một ma trận tọa độ nơi mỗi nút đồ thị được định vị. gplotchỉ vẽ đồ thị mà chúng ta muốn

Đối với N = 29chúng tôi nhận được:

nhập mô tả hình ảnh ở đây


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

Chỉ hoạt động đối với các số nguyên tố, chẳng hạn như đề xuất ban đầu là 37. Bạn có thể giảm một nửa (làm tròn lên) giá trị ban đầu iđể có được hình ảnh mờ hơn. Bạn cũng có thể điều chỉnh nhất quán 1e3,2e3các giá trị khác theo sở thích (tôi đã bắt đầu 300,600nhưng quyết định rằng nó quá thô).


2

MATLAB, 36 byte

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

Đây là một chức năng anoymous tạo ra cốt truyện.

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

Thí dụ:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Tôi ngạc nhiên graphkhông phải là một phần của hộp công cụ tin sinh học ... thậm chí còn không biết nó tồn tại ... Nice :)
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

Màn hình trong QBasic có thể onl là 640x480, vì vậy, vòng tròn có bán kính chỉ 230 px, thật không may. Ngoài ra, có một số tạo tác vì mất độ chính xác float-to-int. Hình như thế này cho N=36: nhập mô tả hình ảnh ở đây

EDIT: Tôi không cần lưu trữ, khai báo kiểu và tất cả các vòng lặp. Tính toán tất cả các Carthesian từ Polar tại chỗ rẻ hơn 50% tính theo byte ...


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)

Tôi đã chuyển đổi câu trả lời QBasic ban đầu của mình @LevelRiverSt 's sang QBIC. Tôi nghĩ rằng điều này sẽ phụ thuộc quá nhiều vào các chức năng không được tích hợp vào QBIC để có thể khả thi, nhưng khi nó bật ra, nó sẽ tiết kiệm được 90 byte khác. Thay thế DRAWcho việc LINElưu 80 byte khác. Tôi biết tôi đã quên một cái gì đó đơn giản ...

Khi chạy với tham số dòng lệnh là 36, nó trông như thế này:

nhập mô tả hình ảnh ở đây


1

Đang xử lý, 274 byte ( sizecuộc gọi 239 + và chức năng gọi)

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

Tôi thực sự không biết tại sao, nhưng setupphải ở dòng thứ hai. Tôi đã sử dụng https://en.wikipedia.org/wiki/Rotation_matrix để giúp tôi tính toán các phép quay. Chương trình này tính toán các điểm và đẩy chúng vào một mảng mà chúng ta đang sử dụng để vẽ các đường.

Dưới đây là hình ảnh của một đa giác có 50 cạnh (một cạnh 100 gần như hoàn toàn màu đen)

50 điểm

Bạn có thể thêm stroke(0,alpha);để có các cạnh trong suốt, alphađộ mờ của đường kẻ. Dưới đây là các đa giác cùng với alphacác 20.

nhập mô tả hình ảnh ở đây


1

Bash + Jelly + GraphViz, 52 ký tự, 52 hoặc 63 byte

Cho rằng các chương trình trong câu hỏi không đồng ý sử dụng mã hóa ký tự nào, chương trình có đầy đủ các ký tự điều khiển. Đây là những gì nó trông giống như bên dưới xxd, trong mã hóa Latin-1 (đại diện cho mỗi ký tự trong một 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

Tuy nhiên, tôi thực sự không thể chạy chương trình mà không chuyển đổi đầu vào thành UTF-8 vì một số lý do (điều này sẽ khiến chương trình dài 63 byte). Về mặt logic, nó sẽ hoạt động như Latin-1 - không có ký tự nào nằm ngoài phạm vi 0 đến 255 - nhưng tôi cứ bị lỗi "chỉ số chuỗi ngoài phạm vi" bất kể tôi định cấu hình các biến môi trường mã hóa ký tự như thế nào. Vì vậy, điều này sẽ phải được tính là 63 byte trừ khi ai đó có thể tìm ra cách chạy nó mà không cần mã hóa lại.

Chương trình có thể dễ đọc hơn một chút nếu chúng tôi diễn giải nó theo mã hóa của Jelly:

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

Chương trình lấy số điểm trên đầu vào tiêu chuẩn và xuất ra hình ảnh PostScript trên đầu ra tiêu chuẩn. (Nó trivially có thể được điều chỉnh để đầu ra trong bất kỳ định dạng hỗ trợ GraphViz bằng cách thay đổi -Tpsở cuối; nó chỉ là PostScript có tên ngắn nhất Có thể cho rằng, bạn có thể tiết kiệm năm nhân vật bằng cách loại bỏ. -Tps, Nhưng sau đó bạn sẽ có được đầu ra trong định dạng hình ảnh nội GraphViz của không có gì khác hỗ trợ, có lẽ không được tính cho mục đích của câu hỏi.)

Về cơ bản, đây chỉ là một chương trình Jelly gọi vào GraphViz để thực hiện bản vẽ; tuy nhiên, Jelly dường như không có bất kỳ khả năng nào để chạy các chương trình bên ngoài, vì vậy tôi đã phải sử dụng bash để liên kết chúng lại với nhau. (Điều này cũng có nghĩa là rẻ hơn khi tạo Jelly yêu cầu nhập từ stdin theo cách thủ công; thông thường, nó lấy đầu vào từ dòng lệnh, nhưng điều đó có nghĩa là các byte bổ sung trong trình bao bọc bash.) circoSẽ tự động sắp xếp tất cả các điểm mà nó yêu cầu vẽ trong một vòng tròn , vì vậy mã Jelly chỉ cần yêu cầu nó vẽ một danh sách các điểm, tất cả đều được kết nối với nhau. Đây là cách nó hoạt động:

Ɠ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

Việc sử dụng Jelly cho phép chúng tôi nén nhẹ chuỗi cấu hình đầu ra GraphViz thông qua từ điển tích hợp. Từ điển có graph, nodepoint. Khó chịu, nó không có shape(nó có SHAPE, nhưng GraphViz phân biệt chữ hoa chữ thường), vì vậy chúng ta phải mã hóa từng ký tự đó.

Đây là đầu ra cho đầu vào 21 (với một sửa đổi nhỏ cho chương trình để làm cho đầu ra ở định dạng có thể được tải lên Stack Exchange):

hoàn thành đồ thị trên 21 điểm


0

PHP + HTML SVG, 316 263 byte

Phiên bản chơi gôn với nđiểm mã hóa cứng và không có ntham số đầu vào :

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

Phiên bản golf trước đó với tham số đầu vào cho nđiểm, 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>

Cách sử dụng: lưu trong tệp và gọi từ trình duyệt:

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

Phiên bản không phù hợp với tham số đầu vào cho nđiểm và 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>

Không thể đính kèm đoạn trích 32 điểm đầy đủ chức năng vì giới hạn 30k ký tự cho một bài đăng. Đây là một ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây

Đoạn mã đính kèm được giới hạn ở 18 điểm vì giới hạn bài đăng 30k.


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

Có thể tắt 5 byte nếu tôi loại bỏ đối số ,as=1buộc tỷ lệ khung hình là 1. Sử dụng expand.gridđể tạo ma trận với tất cả các cặp điểm có thể và sử dụng applyđể lặp qua nó.

N = 21

R + igraph, 87 byte

Một giải pháp khác sử dụng gói igraph.

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

N = 21

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.