Выстроились по кругу, n баллов


39

Нарисуйте линии между каждой парой отдельных точек для nточек, расположенных по кругу, получая что-то вроде приведенного ниже результата. Самый короткий код (в байтах) побеждает! Ваши линии не должны быть прозрачными, но так выглядит лучше. Выходные данные должны быть векторной графикой или изображением размером не менее 600 на 600 пикселей (либо сохраненным в файле, либо отображенным на экране). Чтобы выполнить вызов, вы должны нарисовать не менее 20.

введите описание изображения здесь


7
Было бы здорово, если бы вам пришлось взять число nи нарисовать линии для nочков.
Йодль

2
Я придерживаюсь этой идеи. Измените это, прежде чем кто-то получит первый ответ.
Shooqie

2
@shooqie Тогда название не будет иметь смысла, разве что это может быть отредактировано модами?
Йодль

2
Я не думаю, что изменение 37 на произвольное nдобавит много проблем, так как я ожидаю, что большинство решений в любом случае будет работать с любым числом, особенно потому, что 37 нечетно и, следовательно, зеркальных симметрий нет.
Лайкони

3
Мы принимаем в nкачестве входных данных или просто выбираем произвольно nболее 20?
Rɪᴋᴇʀ

Ответы:


26

Mathematica, 13 байт

CompleteGraph

подкладка вверх-круг-37-точка

Похоже, что это не дает только круговое вложение n=4, но вопрос гласитn>=20


1
... и я пытался найти правильный способ заставить функцию выполнять n(у меня был готов ответ из фиксированного 37) :(
Джонатан Аллан

6
@carusocomputing Эта функция не имеет ничего общего с «графикой» в смысле построения. Mathematica также очень хороша для задач теории графов, и наличие встроенного средства для генерации полного графа кажется первым, что я бы добавил, если бы добавил поддержку графов в свой язык. Единственная причина, по которой эта функция оказывается полезной для этой задачи, состоит в том, что полные графы по умолчанию отображаются со всеми вершинами, расположенными по кругу.
Мартин Эндер

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-го корня единства можно использовать формулу 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
Аааа я забыл про Gбольшое спасибо!
flawr

11

PICO-8 , 131 байт

Я не был уверен, нарушу ли я какие-либо правила, но все равно сделал это!

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 безумие

PICO-8 - это фэнтезийная консоль на основе Lua с собственным разрешением 128x128. Я сделал круг настолько большим, насколько мог ...


9

Mathematica, 42 байта

Создает набор из 37 точек, расположенных по кругу, а затем рисует линии между всеми возможными подмножествами двух точек. Кто-то опубликовал более короткий ответ, который использует CompleteGraph, но я считаю, что это самый короткий ответ, кроме тех, которые полагаются на CompleteGraph.

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

введите описание изображения здесь


3
Нет необходимости избегать рисования линий от точки к себе, поэтому вы можете сэкономить 3 байта с помощью Tuple. Вы также должны обновить это, чтобы принять произвольные n, но удобно, что это не будет стоить вам никаких байтов.
ngenisis

1
Tuples
Значит

9

HTML + JS (ES6), 34 + 177 164 162 = 196 байт

Использование HTML5 Canvas 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

Ява, 346 338 322 301 байт

Это решение работает для всех 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 упс, Frame xбыло из другого решения, которое включало поток. Вам нужен финал, хотя это внутренняя ссылка на класс на внешнюю переменную в классе-владельце.
Волшебная Урна Осьминога

На моей машине все работает отлично. Кстати, я думаю, что вы можете сбрить некоторые байты, перемещая intобъявления вне forциклов
shooqie

@shooqie в Java 6 гласит: «Невозможно сослаться на неконечную локальную переменную n во вложенной области видимости» во время компиляции.
Волшебная Урна Осьминога

У меня это работало на Java 8, но после того, как вы отредактировали ваше сообщение, у меня только белый экран.
shooqie

7

Python 2, 258 235 229 байт

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
п = 37


1
Не будет from PIL import*короче?
Роман Грэф

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

введите описание изображения здесь


О, я даже не заметил, что уже был другой ответ Октавы :)
flawr

Во всяком случае, бить тебя :-)
flawr

На милю! Моя первая мысль была gplotслишком, но мне не удалось сделать ее достаточно короткой ...
Стьюи Гриффин

6

Perl, 229 байт

Он использует ту же формулу, что и большинство языков, которые не имеют удобной встроенной функции для этой задачи (даже если я не смотрел на них, чтобы найти ее, но это довольно легко найти формулу). Так что не очень интересно, но 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'

( echoS настроит ваш 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 байт благодаря Титу.


Perl требует скобки вокруг отдельных команд?
Тит

@Titus Если вы ссылаетесь на фигурные скобки после forциклов, то да, они обязательны.
Дада

Там пусто раньше y2. Бьюсь об заклад, вам это не нужно. А ты можешь написать в STDOUT?
Тит

@ Titus хм, действительно, спасибо. Я думаю, что мой терминал поставил здесь новую строку, чтобы я не видел пространство.
Дада

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)

Каждая строка отдельно вводится в строку ввода. Вот рисунок, показывающий исполнение:

выполнение

Как это работает

Команда polygonсоздает 20-сторонний многоугольник с вершинами базовой линии в (0,0)и (1,0). Следующая команда затем перебирает каждую вершину многоугольника с индексом 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этом ошибки округления из параметризованной версии остались, но 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
Хороший ответ, но кажется, что вы жестко закодировали 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брекеты?
Тит

@ Титус Ты прав! И нет, там не нужны брекеты. Благодарность !
Фредерик

3

BBC BASIC, 98 символов ascii

Токенизированный размер файла 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.

Скачать переводчик на http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Там нет ничего плохого в рисовании каждой линии дважды, внешний вид идентичен :-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

Выход n = 21

Это выглядит намного лучше в оригинальном рендеринге, чем в браузере.

<code> введите описание изображения здесь </ code>


Спасибо, что напомнили мне о LINEфункции. Beats DRAW...
Стинберг

3

Октава, 50 48 46 45 байт

@(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матрицу приличия и одновременно определяет вектор 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')

Это аномальная функция, которая создает сюжет.

@(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что не являюсь частью биоинформационного инструментария ... даже не знал, что он существует ... Здорово :)
Stewie Griffin

1

QBasic 4.5, 398 271 байт

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 может быть только 640x480, поэтому радиус круга, к сожалению, составляет всего 230 пикселей. Кроме того, есть некоторые артефакты из-за потери точности с плавающей точкой на int. Похоже это для N=36: введите описание изображения здесь

РЕДАКТИРОВАТЬ: мне не нужно хранилище, объявление типа и все циклы. Подсчет всех карф из поляр на месте на 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для for 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непрозрачность линии. Вот тот же многоугольник с alphaоф 20.

введите описание изображения здесь


1

Bash + Jelly + GraphViz, 52 символа, 52 или 63 байта

Учитывая, что рассматриваемые программы не согласны с тем, какую кодировку символов использовать, программа полна контрольных символов. Вот как это выглядит xxdв кодировке Latin-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:

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

Программа берет количество точек на стандартном вводе и выводит изображение PostScript на стандартном выводе. (Его можно легко адаптировать для вывода в любом формате, поддерживаемом GraphViz, изменив его -Tpsв конце; просто у PostScript самое короткое имя. Возможно, вы можете сохранить пять символов, удалив -Tps, но затем вы получите вывод во внутреннем формате изображения GraphViz. что больше ничего не поддерживает, что, вероятно, не имеет значения для целей вопроса.)

По сути, это просто программа Jelly, которая вызывает GraphViz для рисования; однако, у Jelly, похоже, нет никаких возможностей для запуска внешних программ, поэтому мне пришлось использовать bash, чтобы связать их вместе. (Это также означает, что дешевле делать Jelly-запрос ввода от stdin вручную; обычно это требует ввода из командной строки, но это будет означать дополнительные байты в оболочке bash.) 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 байта

Гольф-версия с жестко закодированными 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>

Предыдущая версия для гольфа с входным параметром для 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 пунктов из-за ограничения в 30 тыс. Символов для одного сообщения. Вот скриншот:

введите описание изображения здесь

Прикрепленный фрагмент ограничен 18 баллами из-за ограничения в 30 000 для одного поста.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.