Desenhe um polígono regular

21

O objetivo desse código de golfe é desenhar um polígono regular (um com comprimentos laterais iguais), dado o número de lados e o raio (distância do centro ao vértice).

  • O número de lados e o raio podem ser inseridos por meio de um arquivo STDIN ou apenas uma variável antiga simples. Use o que for mais curto no seu idioma.
  • -25% do total de caracteres / bytes se a imagem for realmente desenhada em vez da arte ASCII.
Taconut
fonte
3
Qual é o raio de um polígono? O raio do seu círculo? Seu círculo externo?
Peter Taylor
Lá. Eu consertei isso. Desculpe por isso: P.
Taconut
2
@PeterTaylor O raio de um polígono regular, é a distância de qualquer vértice (outcircle raio ou circumradius ). O raio do incirculo (ou distância para os lados) é chamado apótema . Não deve ser "claro o que você está perguntando", pois ele possui uma definição facilmente encontrada (resultado nº 1 de "raio de um polígono" no google).
Geobits
@ Geobits eu concordo, mas eu ainda editei mesmo assim.
Taconut
@PeterTaylor Vou etiquetá-lo como ambos então: I
Taconut

Respostas:

20

LOGOTIPO 37 - 25% = 27,75 (com variáveis)

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

LOGO 49 - 25% = 36,75 (em função)

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

Triângulo

Chamado com variáveis

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

Usado como uma função P 100 3

insira a descrição da imagem aqui

Quadrado

Chamado com variáveis

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

Usado como uma função P 100 4

insira a descrição da imagem aqui

Pentágono

Chamado com variáveis

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

Usado como uma função P 100 5

insira a descrição da imagem aqui

Decágono

Chamado com variáveis

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

Usado como uma função P 100 10

insira a descrição da imagem aqui

Círculo

Chamado com variáveis

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

Usado como uma função P 100 360

insira a descrição da imagem aqui

Abhijit
fonte
2
Você pode postar uma captura de tela?
Gabe
Para os meus olhos, os polígonos têm o mesmo lado, não raio.
Ross Millikan
@ RossMillikan: As imagens não estavam à escala. Acabei de atualizar as imagens
Abhijit
17

Mathematica, 40 - 25% = 30

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

insira a descrição da imagem aqui

swish
fonte
Ótimo. Aquela batida com o que eu tentei Graphics.
21414
2
Não é justo! Muito fácil!
Robbie Wxyz
Muito bem feito, isso nunca teria me ocorrido.
Michael Stern
Não Graphics@RegularPolygoné permitido?
Greg Martin
@GregMartin É permitido, mas é muito mais difícil especificar o raio com ele.
somente ASCII
12

Java 8: 533 322 - 25% = 241,5

Bem, é Java: / Apenas desenha linhas, ponto a ponto. Deve funcionar para qualquer polígono de tamanho arbitrário. Corte um pouco do tamanho original. Muito crédito a Vulcan (nos comentários) pela lição de golfe.

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

Quebras de linha:

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

Entrada é argumentos [raio] [lados]:

java D 300 7

Saída:

um polígono!

Geobits
fonte
2
Elimine 12 bytes através da importação java.awt.image.*em vez dejava.awt.image.BufferedImage
FThompson
11
Eu já reduziu para 500 bytes usando alguns truques. 1) Use em Short.valueOfvez de Integer.valueOfpara salvar quatro bytes, pois a entrada nunca deve exceder o intervalo de curtos. 2) y[]=x.clone()economiza um byte y[]=new int[s]. 3) Use o obsoleto em f.show();vez de f.setVisible(1>0);para salvar uma adição de nove bytes. 4) Use em 6.28vez de Math.PI*2, pois a estimativa é precisa o suficiente para essa finalidade, economizando três bytes. 5) Declare em Graphics gvez de Graphics2D gcriar a instância de gráficos para salvar dois bytes.
precisa saber é o seguinte
11
@ Vulcan eu consegui mais 120 (principalmente destruindo o BufferedImagee Graphicscompletamente e apenas jogando tudo paint()). Ele mudou a cor da imagem, embora ainda pareça boa IMO. Obrigado por me fazer tomar um outro olhar para este :)
Geobits
11
@Geobits Grandes melhorias. Trabalhando com sua versão reduzida, reduzi-a para 349 bytes , eliminando a Framevariável local, removendo o dnúmero inteiro e usando / abusando do loop for para salvar alguns caracteres, principalmente ponto-e-vírgula. Aqui está uma versão com espaço em branco também.
precisa saber é o seguinte
11
Reduzido para 325 bytes usando em drawPolygonvez de drawLine. Versão em espaço em branco .
precisa saber é o seguinte
11

TeX / TikZ (60 - 80,25)

Arquivo polygon.tex:

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

(80 bytes)

O raio e o número de lados são fornecidos como variáveis ​​/ macros \re \n. Qualquer unidade TeX pode ser fornecida para o raio. Sem unidade, a unidade padrão cmé usada. Exemplos:

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

(16 bytes sem valores)

Se o número da página for suprimido, isso poderá ser feito por

\footline{}

(11 bytes)

Exemplos para gerar arquivos PDF:

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

Triângulo

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

Polígono

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

Octógono

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

Dodecágono

Ponto:

Não está claro o que precisa ser contado. O intervalo para a pontuação seria:

  • O código base é 80 bytes menos 25% = 60

  • Ou tudo incluído (definições de variáveis ​​de entrada, sem número de página): (80 + 16 + 11) menos 25% = 80,25

  • Se a conexão entre o primeiro e o último ponto não precisar ser suave, ela --cyclepoderá ser removida, economizando 7 bytes.

Heiko Oberdiek
fonte
8

Geogebra , 42 - 25% = 31,5 bytes

Se você contar em caracteres em vez de bytes, seria de 41 a 25% = 30,75 caracteres.

(Ou seja, se você considera o Geogebra um idioma ...)

Assume que o raio está armazenado na variável re o número de lados armazenados na variável s.

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

Isso usa o teorema do cosseno c 2 = a 2 + b 2 - 2 ab cos C para calcular o comprimento do lado do raio fornecido.

Saída de amostra para s= 7, r= 5

insira a descrição da imagem aqui

user12205
fonte
6

C: 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 é o raio do círculo)

Por favor, execute no terminal ANSI

Editar:

  • aceite a sugestão do ás
  • use variáveis ​​antigas (ou #define) como entrada
  • use o raio circuncidado agora
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);}

compilar:

gcc -opoly poly.c -Dn=sides -DR=radius -lm
cybcaoyibo
fonte
Quando você usa o gcc, pode realmente omitir os #includes. Além disso, você pode declarar vcomo global fora maine declarar ucomo um parâmetro de main, então não precisa int(ie v;main(u){//...). Finalmente, você pode alterar o último forloop parafor(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205 16/04
5

C, 359 caracteres

Minha primeira tentativa de jogar golfe. Pelo menos, supera a solução 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);}

ungolfed:

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

E é o único programa que gera o polígono em ASCII em vez de desenhá-lo. Devido a isso e a alguns problemas de arredondamento de ponto flutuante, a saída não parece particularmente bonita (os caracteres ASCII não são tão altos quanto a largura).

                 ######
               ###    ###
            ####        ####
          ###              ###
        ###                  ####
     ###                        ###
     #                            #
     #                            ##
    #                              #
    #                              #
   ##                              ##
   #                                #
  ##                                ##
  #                                  #
  #                                  #
 ##                                  ##
 #                                    #
##                                    ##
#                                      #
#                                      #
#                                      #
#                                      #
##                                    ##
 #                                    #
 ##                                  ##
  #                                  #
  #                                  #
  ##                                ##
   #                                #
   ##                              ##
    #                              #
    #                              #
     #                            ##
     #                            #
     ###                        ###
        ###                  ####
          ###              ###
            ###         ####
               ###    ###
                 ######
MarcDefiant
fonte
O primeiro intpode ser removido, pois eles são assumidos intpelo compilador. Além disso, o último forloop pode ser alterado parafor(j=0;j<r;){x=p+u*j;y=q+z*j++;//...
user12205 16/04
A if(i<0)pode ser alterado para if(i). O que ainda é necessário apenas em uma iteração, mas não foi possível encontrar uma maneira eficiente de
eliminá
4

Mathematica, 54 * 75% = 40,5

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

Eu nem acho que há um ponto para uma versão não destruída. Ele conteria apenas mais espaços em branco.

Espera o raio na variável re o número de lados na variável n. O raio é um pouco sem sentido sem exibir eixos, porque o Mathematica dimensiona todas as imagens para caber.

Exemplo de uso:

insira a descrição da imagem aqui

Martin Ender
fonte
Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}]
chyanog
@ ah ahya, eu tendem a esquecer Array .
Martin Ender
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>

Versão não destruída:

<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>
sebcap26
fonte
Economize 4 caracteres por i=S=5;e for(;i-->0;).
Matt
@ Matt Obrigado! Eu não conhecia essa sintaxe e não consigo encontrar nenhuma informação sobre ela. Como é chamado?
precisa saber é o seguinte
@ sebcap26 Você quer dizer a i-->0parte? É o mesmo que i-- > 0. Algumas pessoas também chamam o operador seta ou vai para operador ;)
ComFreek
Não se preocupe :) Como o @ sebcap26 disse, está apenas diminuindo toda vez que o loop for avalia a condição.
Matt
Eu acho que você pode salvar caracteres removendo c=document.currentScript.parentNode;e substituindo <canvas>por<canvas id="c">
Hedi 16/09
3

Postscript 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

Passe o raio, número de lados e ponto central na linha de comando

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

ou acrescentar à fonte

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

Traduzir para o centro, escalar até o raio, mover para (1,0); depois repita n vezes: gire 360 ​​/ n, desenhe a linha para (1,0); desenhe a linha final, toque e emita a página.

luser droog
fonte
3

Sábio , 44 - 25% = 33

Assume que o número de lados é armazenado na svariável e o raio é armazenado na rvariável.

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

Saída de amostra:

s= 5, r= 3

insira a descrição da imagem aqui

s= 5, r= 6

insira a descrição da imagem aqui

s= 12, r= 5

insira a descrição da imagem aqui

user12205
fonte
A escala dos eixos é enganosa. Isso é corrigível? (por exemplo, primeiro ponto em (0,3) quando raio = 3, em vez de (0,1))
Digital Trauma
11
@DigitalTrauma Meu programa basicamente gera o polígono regular "padrão" e depois aumenta a imagem por um fator de escala. Até onde eu sei, a regular_polygonfunção sempre gera polígonos com o primeiro vértice em (0,1). Uma correcção seria a de não mostrar os eixos com um adicional de 7 bytes ( ,axes=0depois figsize=r)
user12205
3

bc + ImageMagick + xview + bash, 104.25 (139 bytes - 25%)

Esse desafio seria incompleto sem uma resposta do 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

Por exemplo, ./polygon.sh 8 100produz esta imagem:

insira a descrição da imagem aqui

Trauma Digital
fonte
2

JavaScript 584 (867 não jogado)

Esse código usa N Raízes complexas da unidade e converte os ângulos em pontos X, Y. Em seguida, a origem é movida para o centro da tela.

Golfe

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

Saída de amostra:

Saída no Chrome

Ungolfed

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

Esse código requer o elemento de tela HTML5, c é um objeto de tela, r é um raio en é um número de lados.

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

Assume duas variáveis ​​predefinidas: $po número de pontos e $ro raio em pixels. Como alternativa, pode-se acrescentar list(,$r,$p)=$argv;e usar argumentos de linha de comando. A saída será um png, que deve ser canalizado para um arquivo.


Saída

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;

primo
fonte
1

TI-80 BASIC, 25 bytes - 25% = 18,75

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

Assume que todas as configurações estão definidas com os valores padrão. Execute o programa como 5:PRGM_POLYGON(para um pentágono)

Ele funciona desenhando um círculo com um número muito baixo de etapas. Por exemplo, um pentágono teria etapas de 2π / 5 radianos.

As configurações da janela são boas o suficiente por padrão, e TMINe TMAXsão definidas como 0e , portanto, tudo o que precisamos alterar é TSTEP.

12Me21
fonte
1

SmileBASIC 3, 183 159 - 25% = 119,25 bytes

Pega os lados e o raio de INPUT, calcula e armazena os pontos e os desenha usando GLINE. Eu sinto que isso poderia ser mais curto, mas é como 01:00, tanto faz. Pressupõe um ambiente de exibição limpo e padrão; portanto, você pode precisar ACLSexecutá-lo a partir do 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

captura de tela

Caracol_
fonte
11
Um byte é um byte, você não pode dizer que é apenas metade.
12Me21
Subtraindo a regra de 25%.
Matthew Roh
1

OpenSCAD: 31 menos 25% = 23,25

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

Primeiro post aqui! Eu sei que estou atrasado para a festa, mas isso parecia uma pergunta tão boa quanto qualquer outra para começar. Ligue usando p(n,r).

Julian Wolf
fonte
Bem vindo ao site!
Assistente de trigo
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)
canadense
fonte
0

C # em LINQPAD

O crédito pela parte da matemática vai para Geobits (espero que você não se importe!) Com a resposta Java. Eu sou inútil em matemática :)

Eu fiz isso no LINQPAD, pois ele tem uma janela de saída integrada. Então, basicamente, você pode arrastar e soltar o seguinte para que ele desenhe o polígono. Apenas mude para 'C # Program' e importe a lib System.Drawing para as propriedades da consulta.

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

insira a descrição da imagem aqui

jzm
fonte
0

Matlab 58 bytes - 25% = 43,5

Não vi nenhuma solução Matlab, então aqui está uma que é bem direta:

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

Você pode cortar alguns bytes se r e n já estiverem no espaço de trabalho.

Chamada de exemplo:

f(7,8)

7 gon com raio 8

ptev
fonte
0

Python 2, 222 bytes

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)

Verifica se um pixel está no lado interno de todos os hiperplanos (linhas) do polígono. O raio é tocado porque, na verdade, o apótema é usado.

insira a descrição da imagem aqui insira a descrição da imagem aqui

Karl Napf
fonte
0

Mathematica 27 (= 36 - 25%)

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

Quando enviamos o código do Mathematica, muitas vezes esquecemos as novas funções que continuam sendo incorporadas ao idioma, com o vocabulário atual do idioma acumulando cerca de 5.000 funções principais . O vocabulário grande e em expansão da linguagem é bastante útil para o golfe de código. Os CirclePoints foram introduzidos na versão atual 11.X. Um exemplo específico de raio de 7 lados 5 é:

insira a descrição da imagem aqui

Além disso, você só precisa inserir o parâmetro angle para controlar a orientação do seu polígono:

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

insira a descrição da imagem aqui

Vitaliy Kaurov
fonte
0

Python 2, 74 bytes - 25% = 55,5

A entrada está nas variáveis r,n. Se incluído na contagem, seria r,n=input(), por mais 12 bytes.

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

Experimente online - (usa código diferente, pois execnão é implementado no intérprete online)

mbomb007
fonte
0

SmileBASIC, 85 75 - 25% = 56.25 bytes

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

As variáveis ​​S e R são usadas para entrada.

Explicado:

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

Os lados são desenhados usando a cor -I, que geralmente é próxima de -1 (& HFFFFFFFF branco) (exceto quando Ié 0, quando é transparente).

Você também pode desenhar um polígono preenchido usando em GTRI N,M,X,Y,R,R,-Ivez deGLINE...

12Me21
fonte
0

Tikz, 199 bytes

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

Esta solução usa a biblioteca tikz shapes.geometric.

Aqui está a aparência de um polígono com 5lados e raio 8inquando visto em evince .

Imagem Obrigatória

Assistente de Trigo
fonte