Намалюйте звичайний багатокутник


21

Мета цього коду для гольфу - намалювати правильний багатокутник (один з рівними сторонами довжини), враховуючи кількість сторін та радіус (відстань від центру до вершини).

  • Кількість сторін і радіус можна ввести через файл, STDIN або просто звичайну стару змінну. Використовуйте те, що у вашій мові коротше.
  • -25% від загальної кількості символів / байтів, якщо зображення насправді намальовано замість арт. ASCII.

3
Який радіус багатокутника? Радіус його круга? Його оточення?
Пітер Тейлор

Там. Я полагодив це. Вибачте з цього приводу: P.
Taconut

2
@PeterTaylor Радіус правильного многокутника - це відстань до будь-якої вершини (радіус оточення або окружність ). Радіус вписаного (або відстань до сторін) називається апофемой . Це не повинно бути "незрозумілим, про що ви запитуєте", оскільки в ньому є легко знайти визначення (№1 результат для "радіус багатокутника" в Google).
Геобіт

@Geobits Я згоден, але все одно я це все-таки редагував.
Taconut

@PeterTaylor Я позначу це як обидва тоді: I
Taconut

Відповіді:


20

LOGO 37 - 25% = 27,75 (зі змінними)

REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

LOGO 49 - 25% = 36,75 (як функція)

TO P:R:S REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]END

Трикутник

Викликається зі змінними

Make "R 100
Make "S 3
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Використовується як функція P 100 3

enter image description here

Майдан

Викликається зі змінними

Make "R 100
Make "S 4
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Використовується як функція P 100 4

enter image description here

П’ятикутник

Викликається зі змінними

Make "R 100
Make "S 5
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Використовується як функція P 100 5

enter image description here

Декагон

Викликається зі змінними

Make "R 100
Make "S 10
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Використовується як функція P 100 10

enter image description here

Коло

Викликається зі змінними

Make "R 100
Make "S 360
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Використовується як функція P 100 360

enter image description here


2
Чи можете ви опублікувати знімок екрана?
Гейб

На моє око багатокутники мають ту саму сторону, а не радіус.
Росс Мілікан

@RossMillikan: Образи не мали масштабу. Я щойно оновив зображення
Абхіджіт

17

Математика, 40 - 25% = 30

ListPolarPlot[r&~Array~n]/.PointPolygon

enter image description here


Чудово. Це било те, що я спробував Graphics.
DavidC

2
Нечесно! Занадто просто!
Роббі Віксз

Чудово зроблено, цього мені ніколи б не прийшло в голову.
Майкл Стерн

Хіба Graphics@RegularPolygonзаборонено?
Грег Мартін

@GregMartin Це дозволено, але набагато складніше вказати радіус з ним.
Лише ASCII

12

Ява 8: 533 322 - 25% = 241,5

Ну, це Java: / Просто малює лінії, вказує на крапку. Має працювати на будь-якому полігоні довільного розміру. Відріжте його зовсім трохи від оригінального розміру. Величезна заслуга Вулкану (у коментарях) за урок гольфу.

import java.awt.*;class D{public static void main(String[]v){new Frame(){public void paint(Graphics g){int i=0,r=Short.valueOf(v[0]),s=Short.valueOf(v[1]),o=r+30,x[]=new int[s],y[]=x.clone();for(setSize(o*2,o*2);i<s;x[i]=(int)(Math.cos(6.28*i/s)*r+o),y[i]=(int)(Math.sin(6.28*i++/s)*r+o));g.drawPolygon(x,y,s);}}.show();}}

Перерви в рядку:

import java.awt.*;
class D{
    public static void main(String[]v){
        new Frame(){
            public void paint(Graphics g){
                int i=0,r=Short.valueOf(v[0]),s=Short.valueOf(v[1]),o=r+30,x[]=new int[s],y[]=x.clone();
                for(setSize(o*2,o*2);i<s;x[i]=(int)(Math.cos(6.28*i/s)*r+o),y[i]=(int)(Math.sin(6.28*i++/s)*r+o));
                g.drawPolygon(x,y,s);
            }
        }.show();
    }
}

Введення - це аргументи [радіус] [сторони]:

java D 300 7

Вихід:

a polygon!


2
Вилучіть 12 байт, імпортуючи java.awt.image.*замістьjava.awt.image.BufferedImage
FThompson

1
Я зменшив його до 500 байт за допомогою декількох трюків. 1) Використовуйте Short.valueOfзамість того, Integer.valueOfщоб зберегти чотири байти, оскільки вхід ніколи не повинен перевищувати діапазон шортів. 2) y[]=x.clone()зберігає один байт y[]=new int[s]. 3) Використовуйте застаріле f.show();замість, f.setVisible(1>0);щоб зберегти додаток дев'ять байтів. 4) Використовуйте 6.28замість Math.PI*2, оскільки оцінка досить точна для цієї мети, економлячи три байти. 5) Заява, Graphics gзамість Graphics2D gстворення графічного примірника, щоб зберегти два байти.
FThompson

1
@Vulcan я отримав його вниз ще 120 ( в основному, трощити BufferedImageі Graphicsвзагалі і просто кидали все в paint()). Це змінило колір зображення, хоча воно все ще добре виглядає IMO. Дякую, що змусили мене ще раз поглянути на це :)
Geobits

1
@Geobits Великі вдосконалення. Опрацьовуючи зменшену версію, я скоротив її ще до 349 байт , усунувши Frameяк локальну змінну, видаливши dціле число та використовуючи / зловживаючи фор-циклом, щоб зберегти кілька символів, переважно крапки з комою. Ось і версія з пробілами .
FThompson

1
Зменшено до 325 байт за допомогою drawPolygonзамість drawLine. Версія пробілу .
FThompson

11

TeX / TikZ (60 - 80,25)

Файл polygon.tex:

\input tikz \tikz\draw(0:\r)\foreach\!in{1,...,\n}{--(\!*360/\n:\r)}--cycle;\bye

(80 байт)

Радіус і кількість сторін надаються у вигляді змінних / макросів \rі \n. Будь-який пристрій TeX може бути заданий за радіусом. Без одиниці використовується одиниця за замовчуванням cm. Приклади:

\def\r{1}\def\n{5}    % pentagon with radius 1cm
\def\r{10mm}\def\n{8} % octagon with radius 10mm

(16 байт без значень)

Якщо номер сторінки слід придушити, це можна зробити

\footline{}

(11 байт)

Приклади створення файлів PDF:

pdftex "\def\r{1}\def\n{3}\input polygon"

Triangle

pdftex "\def\r{1}\def\n{5}\input polygon"

Polygon

pdftex "\def\r{1}\def\n{8}\input polygon"

Octagon

pdftex "\def\r{1}\def\n{12}\input polygon"

Dodecagon

Оцінка:

Не зрозуміло, для чого потрібно рахувати. Діапазон балів буде:

  • Базовий код - 80 байт мінус 25% = 60

  • Або все включено (визначення вхідних змінних, номер сторінки): (80 + 16 + 11) мінус 25% = 80,25

  • Якщо з’єднання між першою та останньою точкою не потрібно згладжувати, їх --cycleможна буде зняти, заощадивши 7 байт.


8

Геогебра , 42 - 25% = 31,5 байт

Якщо рахувати в символах замість байтів, це буде 41 - 25% = 30,75 символів.

(Тобто, якщо ви вважаєте Геогебру мовою ...)

Припускаємо, що радіус зберігається у змінній, rа кількість сторін, що зберігаються у змінній s.

Polygon[(0,0),(sqrt(2-2cos(2π/s))r,0),s]

Для цього використовується теорема косинусів c 2 = a 2 + b 2 - 2 ab cos C для обчислення довжини сторони від заданого радіуса.

Вихід вибірки для s= 7, r= 5

enter image description here


6

С: 229 180

#include<stdio.h>
#include<math.h>
main(){float n=5,r=10,s=tan(1.57*(1.-(n-2.)/n))*r*2.,i=0,j,x,c,t;int u,v;for(;i<n;i++)for(j=0;j<s;j++)x=i*6.28/n,c=cos(x),t=sin(x),x=j-s/2.,u=c*r+t*x+r*2.,v=-t*r+c*x+r*2,printf("\e[%d;%dH*",v,u);}

(r - радіус інкруга)

Будь ласка, запустіть у терміналі ANSI

Редагувати:

  • прийміть пропозицію туза
  • використовувати старі змінні (або #define) як вхідні дані
  • скористайтеся радіусом обводу зараз
u;main(v){float p=3.14,r=R*cos(p/n),s=tan(p/n)*r*2,i=0,j,x,c,t;for(;i++<n;)for(j=0;j<s;)x=i*p/n*2,c=cos(x),t=sin(x),x=j++-s/2,u=c*r+t*x+r*2,v=c*x-t*r+r*2,printf("\e[%d;%dH*",v,u);}

скласти:

gcc -opoly poly.c -Dn=sides -DR=radius -lm

Коли ви використовуєте gcc, ви можете фактично опустити #includes. Крім того, ви можете оголосити vяк глобальну зовнішню main, і оголосити її uяк параметр main, тоді вам це не потрібно int(тобто v;main(u){//...). Нарешті, ви можете змінити останній forцикл наfor(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205

5

C, 359 Chars

Моя перша спроба гольфу. Принаймні, це б'є рішення Java ;-)

int r,n,l,g,i,j,x,y;char* b;float a,c,u,z,p,q,s,t;main(int j,char**v){r=atoi(v[1]);b=malloc(g=(l=r*2+1)*r*2+1);memset(b,32,g);for(j=g-2;j>0;j-=l){b[j]='\n';}b[g-1]=0;a=2*3.14/(n=atoi(v[2]));for(;i<=n;i++,p=s,q=t){c=i*a;s=sin(c)*r+r;t=cos(c)*r+r;if(i>0){u=(s-p)/r,z=(t-q)/r;for(j=0;j<r;j++){x=p+u*j;y=q+z*j;if(x>=0&&y>=0&&y<r*2&&x<l-1)b[y*l+x]='#';}}}puts(b);}

неозорений:

int r,n,l,g,i,j,x,y;
char* b;
float a,c,u,z,p,q,s,t;
main(int j,char**v){
    r=atoi(v[1]);
    b=malloc(g=(l=r*2+1)*r*2+1);
    memset(b,32,g);
    for(j=g-2;j>0;j-=l){b[j]='\n';} 
    b[g-1]=0;
    a=2*3.14/(n=atoi(v[2]));
    for(;i<=n;i++,p=s,q=t){
        c=i*a;s=sin(c)*r+r;t=cos(c)*r+r;
        if(i>0){
            u=(s-p)/r,z=(t-q)/r;
            for(j=0;j<r;j++){
                x=p+u*j;y=q+z*j;
                if(x>=0&&y>=0&&y<r*2&&x<l-1)b[y*l+x]='#';
            }
        }
    }
    puts(b);
}

І це єдина програма, яка виводить багатокутник в ASCII замість його малювання. Через це і деякі проблеми з округленням плаваючої точки, вихід не виглядає особливо красивим (символи ASCII не такі високі, як широкі).

                 ######
               ###    ###
            ####        ####
          ###              ###
        ###                  ####
     ###                        ###
     #                            #
     #                            ##
    #                              #
    #                              #
   ##                              ##
   #                                #
  ##                                ##
  #                                  #
  #                                  #
 ##                                  ##
 #                                    #
##                                    ##
#                                      #
#                                      #
#                                      #
#                                      #
##                                    ##
 #                                    #
 ##                                  ##
  #                                  #
  #                                  #
  ##                                ##
   #                                #
   ##                              ##
    #                              #
    #                              #
     #                            ##
     #                            #
     ###                        ###
        ###                  ####
          ###              ###
            ###         ####
               ###    ###
                 ######

Перші intможуть бути видалені, оскільки вони вважаються intкомпілятором. Також останній forцикл можна змінити наfor(j=0;j<r;){x=p+u*j;y=q+z*j++;//...
user12205

if(i<0)Може бути змінений if(i). Яка ще потрібна лише в одній ітерації, але не змогла знайти ефективний спосіб її вирішити :(
Allbeert

4

Математика, 54 * 75% = 40,5

Graphics@Polygon@Table[r{Cos@t,Sin@t},{t,0,2Pi,2Pi/n}]

Я навіть не думаю, що є сенс для версії без вогків. Він буде містити лише більше пробілів.

Очікує радіус у змінній rта кількість сторін у змінній n. Радіус трохи безглуздий без відображення осей, оскільки Mathematica масштабує всі зображення, щоб вони підходили.

Приклад використання:

enter image description here


Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}]
чіяно

@chyaong ах, я, як правило, про це забуваю Array .
Мартін Ендер

4

HTML / JavaScript: 215 - 25% = 161,25 , 212 - 25% = 159

<canvas><script>R=100;i=S=10;c=document.currentScript.parentNode;c.width=c.height=R*2;M=Math;with(c.getContext("2d")){moveTo(R*2,R);for(;i-->0;){a=M.PI*2*(i/S);lineTo(R+M.cos(a)*R,R+M.sin(a)*R)}stroke()}</script>

Негольована версія:

<canvas><script>
    var RADIUS = 100;
    var SIDES_COUNT = 10;
    var canvas = document.currentScript.parentNode;
    canvas.width = canvas.height = RADIUS * 2;
    var context = canvas.getContext("2d");
    context.moveTo(RADIUS * 2, RADIUS);
    for(i = 1 ; i <= SIDES_COUNT ; i++) {
        var angle = Math.PI * 2 * (i / SIDES_COUNT);
        context.lineTo(
            RADIUS + Math.cos(angle) * RADIUS,
            RADIUS + Math.sin(angle) * RADIUS
        );
    }
    context.stroke();
</script>

Збережіть 4 символи до i=S=5;та for(;i-->0;).
Метт

@Matt Дякую! Я не знав цього синтаксису і не можу знайти будь-яку інформацію про нього. Як це називається?
sebcap26

@ sebcap26 Ви маєте на увазі i-->0частину? Це те саме, що i-- > 0. Деякі люди також називають це оператором зі стрілками або переходить до оператора ;)
ComFreek

Не хвилюйтесь :) Як сказав @ sebcap26, це просто зменшується щоразу, коли цикл for оцінює стан.
Метт

Я думаю , що ви можете зберегти символи видалення c=document.currentScript.parentNode;і заміни <canvas>на<canvas id="c">
Хеді

3

Постскрипт 156 - 25% = 117

translate exch 1 exch dup dup scale div currentlinewidth mul setlinewidth
1 0 moveto dup{360 1 index div rotate 1 0 lineto}repeat closepath stroke showpage

Проведіть радіус, кількість сторін та центральну точку в командному рядку

gs -c "100 9 300 200" -- polyg.ps

або додати до джерела

echo 100 9 300 200 | cat - polyg.ps | gs -

Перевести в центр, масштабувати до радіуса, перейти до (1,0); потім повторіть n разів: поверніть на 360 / n, накресліть лінію до (1,0); намалюйте заключний рядок, обведіть та випустіть сторінку.


3

Шавлія , 44 - 25% = 33

Припустимо, що кількість сторін зберігається у sзмінній, а радіус - у rзмінній.

polytopes.regular_polygon(s).show(figsize=r)

Вибірка зразка:

s= 5, r= 3

enter image description here

s= 5, r= 6

enter image description here

s= 12, r= 5

enter image description here


Масштабування осей вводить в оману. Це можна виправити? (наприклад, перша точка у (0,3), коли радіус = 3, а не (0,1))
Цифрова травма

1
@DigitalTrauma Моя програма в основному генерує "стандартний" регулярний багатокутник, а потім збільшує зображення на масштабний коефіцієнт. Наскільки мені відомо, regular_polygonфункція завжди породжує багатокутники з першою вершиною при (0,1). Виправленням було б не показувати осі з додатковими 7 байтами ( ,axes=0після figsize=r)
user12205

3

bc + ImageMagick + xview + bash, 104,25 (139 байт - 25%)

Цей виклик був би неповним без відповіді ImageMagick ...

convert -size $[$2*2]x$[$2*2] xc: -draw "polygon `bc -l<<Q
for(;i++<$1;){t=6.28*i/$1;print s(t)*$2+$2,",";c(t)*$2+$2}
Q`" png:-|xview stdin

Наприклад, ./polygon.sh 8 100створює це зображення:

enter image description here


2

JavaScript 584 (867 неозолотих)

Цей код використовує N комплексних коренів єдності та переводить кути в точки X, Y. Потім походження переміщується в центр полотна.

Гольф

function createPolygon(c,r,n){
c.width=3*r;
c.height=3*r;
var t=c.getContext("2d");
var m=c.width/2;
t.beginPath(); 
t.lineWidth="5";
t.strokeStyle="green";
var q=C(r, n);
var p=pts[0];
var a=p.X+m;
var b=p.Y+m;
t.moveTo(a,b);
for(var i=1;i<q.length;i++)
{
p=q[i];
t.lineTo(p.X+m,p.Y+m);
t.stroke();
}
t.lineTo(a,b);
t.stroke();
}
function P(x,y){
this.X=x;
this.Y=y;
}
function C(r,n){
var p=Math.PI;
var x,y,i;
var z=[];
var k=n;
var a;
for(i=0;i<k;i++)
{
a = 2*i*p/n;
x = r*Math.cos(a);
y = r*Math.sin(a);
z.push(new P(x,y));
}
return z;
}

Вибірка зразка:

Output in Chrome

Безумовно

function createPolygon(c,r,n) {
c.width = 3*r;
c.height = 3*r;
var ctx=c.getContext("2d");
var mid = c.width/2;
ctx.beginPath(); 
ctx.lineWidth="5";
ctx.strokeStyle="green";
var pts = ComplexRootsN(r, n);
if(null===pts || pts.length===0)
{
alert("no roots!");
return;
}
var p=pts[0];
var x0 = p.X + mid;
var y0 = p.Y + mid;
ctx.moveTo(x0,y0);
for(var i=1;i<pts.length;i++)
{
p=pts[i];
console.log(p.X +"," + p.Y);
ctx.lineTo(p.X + mid, p.Y + mid);
ctx.stroke();
}
ctx.lineTo(x0,y0);
ctx.stroke();
}

function Point(x,y){
this.X=x;
this.Y=y;
}

function ComplexRootsN(r, n){
var pi = Math.PI;
var x,y,i;
var arr = [];
var k=n;
var theta;
for(i=0;i<k;i++)
{
theta = 2*i*pi/n;
console.log('theta: ' + theta);
x = r*Math.cos(theta);
y = r*Math.sin(theta);
console.log(x+","+y);
arr.push(new Point(x,y));
}
return arr;
}

Цей код вимагає елемента HTML5 полотна, c - об'єкт полотна, r - радіус і n - сторона.


2

PHP 140 - 25% = 105

<?
for(;$i++<$p;$a[]=$r-cos($x)*$r)$a[]=$r-sin($x+=2*M_PI/$p)*$r;
imagepolygon($m=imagecreatetruecolor($r*=2,$r),$a,$p,0xFFFFFF);
imagepng($m);

Припускає дві заздалегідь задані змінні: $pкількість точок та $rрадіус у пікселях. Крім того, можна list(,$r,$p)=$argv;замість цього використовувати аргументи командного рядка. Виведенням буде png, який повинен бути переданий у файл.


Вихідні дані

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;


1

TI-80 BASIC, 25 байт - 25% = 18,75

PARAM
2π/ANS->TSTEP
"COS T->X1ᴛ
"SIN T->Y1ᴛ
DISPGRAPH

Припустимо, що всі параметри встановлені за замовчуванням. Запускайте програму, як5:PRGM_POLYGON (для п’ятикутника)

Це працює, малюючи коло з дуже низькою кількістю кроків. Наприклад, п'ятикутник матиме кроки 2π / 5 радіанів.

Параметри вікна досить гарні за замовчуванням, і TMINта TMAXвстановлюються 0і , тому все , що нам потрібно змінити це TSTEP.


1

SmileBASIC 3, 183 159 - 25% = 119,25 байт

Бере з сторін і радіус INPUT, обчислює і зберігає точки, а потім малює їх за допомогою GLINE. Я відчуваю, що це може бути коротшим, але це як 1 ранку, як би там не було. Передбачає чисту та за замовчуванням дисплейну обстановку, тому вам, можливо, знадобиться це ACLSзапускати з DIRECT.

INPUT S,R
DIM P[S,2]FOR I=0TO S-1
A=RAD(I/S*360)P[I,0]=COS(A)*R+200P[I,1]=SIN(A)*R+120NEXT
FOR I=0TO S-1GLINE P[I,0],P[I,1],P[(I+1)MOD S,0],P[(I+1)MOD S,1]NEXT

скріншот


1
Байт - це байт, не можна сказати, що це лише половина.
12Me21

Віднімання правила 25%.
Меттью Ро

1

OpenSCAD: на 31 менше 25% = 23,25

module p(n,r){circle(r,$fn=n);}

Перший пост тут! Я знаю, що я спізнююсь на вечірку, але це здавалося настільки ж хорошим питанням, як і будь-яке. Дзвінок за допомогою p(n,r).


Ласкаво просимо на сайт!
Пшеничний майстер

0

ActionScript 1, Flash Player 6: 92 - 25% = 69

n=6
r=100
M=Math
P=M.PI*2
lineStyle(1)
moveTo(r,0)
while((t+=P/n)<=P)lineTo(M.cos(t)*r,M.sin(t)*r)

0

C # в LINQPAD

Заслуга математичної частини припадає на Geobits (сподіваюся, ви не заперечуєте!) З відповіддю на Java. Я безнадійний у математиці :)

Я зробив це в LINQPAD, оскільки у нього є вбудоване вікно виводу. Тож по суті ви можете перетягнути в нього наступне, і воно намалюватиме багатокутник. Просто перемкніть його на "Програма C #" та імпортуйте вкладку System.Drawing у властивості запиту.

//using System.Drawing;

void Main()
{
// Usage: (sides, radius)
    DrawSomething(4, 50);
}

void DrawSomething(int sides, int radius)
{
    var points = new Point[sides];
    var bmpSize = radius*sides;
    var bmp = new Bitmap(bmpSize,bmpSize);
    using (Graphics g = Graphics.FromImage(bmp))
    {   
        var o = radius+30;
        for(var i=0; i < points.Length; i++)
        {
            // math thanks to Geobits
            double w = Math.PI*2*i/sides;
            points[i].X = (int)(Math.Cos(w)*radius+o);
            points[i].Y = (int)(Math.Sin(w)*radius+o);
        }
        g.DrawPolygon(new Pen(Color.Red), points);
    }
    Console.Write(bmp);
}

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


0

Matlab 58 байт - 25% = 43,5

Рішення Matlab не бачило, тож ось одне, яке досить просте:

f=@(n,r) plot(r*cos(0:2*pi/n:2*pi),r*sin(0:2*pi/n:2*pi));

Ви можете голити деякі байти, якщо r і n вже є в робочій області.

Приклад виклику:

f(7,8)

7-гона з радіусом 8


0

Пітон 2, 222 байти

from math import*
def f(s,r):
 r*=cos(pi/s)
 v,R=2*pi/s,[(2*t)/98.-1for t in range(99)]
 print"P1 99 99 "+" ".join(["0","1"][all(w*(w-x)+z*(z-y)>0for w,z in[(r*cos(a*v),r*sin(a*v))for a in range(s)])]for x in R for y in R)

Перевіряє, чи є піксель на внутрішній стороні всіх гіперпланів (ліній) багатокутника. Радіус торкається тому, що фактично використовується апотема.

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


0

Математика 27 (= 36 - 25%)

Graphics[Polygon[CirclePoints[r, n]]]

Коли ми подаємо код Mathematica, ми часто забуваємо про нові функції, які продовжують вбудовуватися в мову, а поточна лексика мови набирає близько 5000 основних функцій . Великий і розширюваний словник мови є досить зручним для гри в коди. CirclePoints були введені в поточній версії 11.X. Конкретним прикладом 7-сторонного радіуса 5 є:

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

Також вам просто потрібно ввести параметр кута, щоб керувати орієнтацією вашого багатокутника:

Graphics[Polygon[CirclePoints[{1, 2}, 5]]]

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


0

Пітон 2, 74 байти - 25% = 55,5

Введення є в змінних r,n. Якщо його включити до підрахунку, це було б r,n=input()на 12 байт більше.

import math,turtle as t
exec"t.fd(2*r*math.sin(180/n));t.rt(360/n);"*n

Спробуйте в Інтернеті - (використовує інший код, оскільки execвін не реалізований в онлайн-перекладачі)


0

SmileBASIC, 85 75 - 25% = 56,25 байт

FOR I=0TO S
A=I/S*6.28N=X
M=Y
X=R+R*COS(A)Y=R+R*SIN(A)GLINE N,M,X,Y,-I
NEXT

Змінні S і R використовуються для введення.

Пояснили:

FOR I=0 TO Sides        'Draw n+1 sides (since 0 is skip)
 Angle=I/Sides*6.28     'Get angle in radians
 OldX=X:OldY=Y          'Store previous x/y values
 X=Radius+Radius*COS(A) 'Calculate x and y
 Y=Radius+Radius*SIN(A)
 GLINE OldX,OldY,X,Y,-I 'Draw line. Skip if I is 0 (since old x and y aren't set then)
NEXT

Сторони малюються за допомогою кольору -I, який зазвичай близький до -1 (& HFFFFFFFF білий) (крім випадків, колиI 0, коли він прозорий).

Ви також можете намалювати заповнений багатокутник, використовуючи GTRI N,M,X,Y,R,R,-IзамістьGLINE...


0

Тікз, 199 байт

\documentclass[tikz]{standalone}\usetikzlibrary{shapes.geometric}\begin{document}\tikz{\def\p{regular polygo}\typein[\n]{}\typein[\r]{}\node[draw,minimum size=\r,\p n,\p n sides=\n]{}}\end{document}

Для цього рішення використовується бібліотека tikz shapes.geometric .

Ось як виглядає багатокутник зі 5сторонами та радіусом, 8inякщо його дивитись в evince .

Обов’язковий малюнок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.