画一个规则的多边形


21

该代码高尔夫球的目标是在边数和半径(从中心到顶点的距离)下绘制一个规则的多边形(边长相等)。

  • 边数和半径可以通过文件STDIN或仅是一个普通的旧变量输入。使用您语言中较短的内容。
  • 如果实际绘制的是图像而不是ASCII图,则占字符/字节总数的-25%。

3
多边形的半径是多少?它的圆的半径?它的外圆?
彼得·泰勒

那里。我修好了它。抱歉:P。
塔科努特2014年

2
@PeterTaylor正多边形的半径是到任何顶点(半径外圆或外圆半径)的距离。内切圆的半径(或边的距离)被称为心距。这不应该是“不清楚您要问什么”,因为它具有容易找到的定义(在Google中,“多边形的半径”为#1结果)。
Geobits

我同意@Geobits,但无论如何我还是对其进行了编辑。
塔科努特2014年

@PeterTaylor然后我将其标记为:I
Taconut 2014年

Answers:


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

在此处输入图片说明

广场

用变量调用

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

用作功能 P 100 4

在此处输入图片说明

五角大楼

用变量调用

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

用作功能 P 100 5

在此处输入图片说明

十边形

用变量调用

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

用作功能 P 100 10

在此处输入图片说明

用变量调用

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

用作功能 P 100 360

在此处输入图片说明


2
您可以发布屏幕截图吗?
加布2014年

在我看来,多边形具有相同的边,而不是半径。
Ross Millikan 2014年

@RossMillikan:图片未按比例绘制。我刚刚更新了图片
Abhijit 2014年


12

Java 8:533322-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

输出:

一个多边形!


2
通过导入java.awt.image.*而不是导入来消除12个字节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);保存额外的9个字节。4)使用6.28代替Math.PI*2,因为为此目的估算足够准确,节省了三个字节。5)在创建图形实例时声明Graphics g而不是Graphics2D g保存两个字节。
FThompson

1
@Vulcan我又把它减了120(主要是通过将BufferedImage和和Graphics全部扔掉,然后将所有东西都扔进去paint())。尽管确实看起来不错,但它确实改变了图像的颜色。感谢您让我再
看一遍

1
@Geobits很大的进步。在简化版本的基础上,通过消除作为局部变量,删除整数并使用/滥用for循环以保存一些字符(主要是分号),我将其进一步缩减为349个字节。这也是一个带有空格的版本Framed
FThompson

1
通过使用drawPolygon代替减少到325个字节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"

三角形

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

多边形

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

八边形

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

十二边形

得分:

目前尚不清楚,什么需要计数。分数范围为:

  • 基本代码是80字节减去25%= 60

  • 或全包(输入变量定义,无页码):(80 + 16 + 11)减去25%= 80.25

  • 如果第一点和最后一点之间的连接不需要平滑,则--cycle可以将其删除,从而节省7个字节。


8

Geogebra,42 – 25%= 31.5字节

如果以字符而不是字节为单位,则为41 – 25%= 30.75个字符。

(也就是说,如果您认为Geogebra是一种语言...)

假设半径存储在变量中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

在此处输入图片说明


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是圆的半径)

请在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为global outside main,并声明u为的参数main,则不需要int(即v;main(u){//...)。最后,您可以将最后一个for循环更改为for(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205

5

C,359个字符

我第一次打高尔夫球。至少它击败了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 2014年

4

Mathematica,54 * 75%= 40.5

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

我什至认为没有高尔夫版本是没有意义的。它只会包含更多的空格。

期望半径为variable r,边数为variable n。在不显示轴的情况下,半径有点没有意义,因为Mathematica会缩放所有图像以使其适合。

用法示例:

在此处输入图片说明


Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}]
chyanog 2014年

@chyaong啊,我倾向于忘记Array
Martin Ender 2014年

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>

通过i=S=5;和保存4个字符for(;i-->0;)
马特

@Matt谢谢!我不知道这种语法,也找不到有关它的任何信息。怎么称呼?
sebcap26 2014年

@ sebcap26你是说这个i-->0部分吗?与相同i-- > 0。有人也称它为箭头运算符转到运算符 ;)
ComFreek

不用担心:)正如@ sebcap26所说,每次for循环评估条件时,它只会递减。
马特

我认为您可以保存删除c=document.currentScript.parentNode;和替换<canvas>的字符<canvas id="c">
Hedi

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

在此处输入图片说明

s= 5,r= 6

在此处输入图片说明

s= 12,r= 5

在此处输入图片说明


轴的缩放比例具有误导性。那可以解决吗?(例如,半径= 3而不是(0,1)时在(0,3)处的第一个点)
Digital Trauma 2014年

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产生以下图像:

在此处输入图片说明


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

样本输出:

在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 canvas元素,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弧度。

该窗口设置在默认情况不够好,而且TMINTMAX被设置为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
一个字节就是一个字节,不能说只有一半。
17Me21年

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

LINQPAD中的C#

数学部分的功劳归功于Java答案的Geobits(我希望您不介意!)。我在数学上没有希望 :)

我在LINQPAD中完成了此操作,因为它具有内置的输出窗口。因此,基本上,您可以将以下内容拖放到其中,然后绘制多边形。只需将其切换到“ C#程序”,然后将System.Drawing lib导入查询属性即可。

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

如果rn,则可以删除一些字节已经在工作空间中,。

示例调用:

f(7,8)

半径8的7角


0

Python 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

Mathematica 27(= 36-25%)

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

当我们提交Mathematica代码时,我们经常会忘记新的功能,这些新功能会不断地嵌入到语言中,而当前的语言词汇量大约有5000个核心功能。庞大且不断扩展的语言词汇对于代码搜寻非常方便。CirclePoints在当前版本11.x的介绍 7边半径5的特定示例是:

在此处输入图片说明

另外,您只需要输入angle参数来控制多边形的方向:

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

在此处输入图片说明


0

Python 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

侧面是使用color绘制的-I,通常接近-1(&HFFFFFFFF白色)(除非I为0,否则为透明)。

您也可以使用GTRI N,M,X,Y,R,R,-I代替GLINE...


0

Tikz,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外观。

强制图片

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.