该代码高尔夫球的目标是在边数和半径(从中心到顶点的距离)下绘制一个规则的多边形(边长相等)。
- 边数和半径可以通过文件STDIN或仅是一个普通的旧变量输入。使用您语言中较短的内容。
- 如果实际绘制的是图像而不是ASCII图,则占字符/字节总数的-25%。
该代码高尔夫球的目标是在边数和半径(从中心到顶点的距离)下绘制一个规则的多边形(边长相等)。
Answers:
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
ListPolarPlot[r&~Array~n]/.PointPolygon
Graphics
。
Graphics@RegularPolygon
不允许的?
好吧,它是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
输出:
java.awt.image.*
而不是导入来消除12个字节java.awt.image.BufferedImage
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
保存两个字节。
BufferedImage
和和Graphics
全部扔掉,然后将所有东西都扔进去paint()
)。尽管确实看起来不错,但它确实改变了图像的颜色。感谢您让我再
Frame
d
档案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个字节。
#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终端中运行
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
#include
s。另外,您可以声明v
为global outside main
,并声明u
为的参数main
,则不需要int
(即v;main(u){//...
)。最后,您可以将最后一个for
循环更改为for(j=0;j<s;)/*...*/x=j++-s/2.,//...
我第一次打高尔夫球。至少它击败了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++;//...
if(i<0)
可改为if(i)
。仍然只需要一个迭代就可以了,但是找不到一种有效的方法将其删除:(
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π}]
Array
。
<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;)
。
c=document.currentScript.parentNode;
和替换<canvas>
的字符<canvas id="c">
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);绘制最后一行,描边并发出页面。
假设边数存储在s
变量中,半径存储在r
变量中。
polytopes.regular_polygon(s).show(figsize=r)
样本输出:
s
= 5,r
= 3
s
= 5,r
= 6
s
= 12,r
= 5
regular_polygon
函数始终会生成第一个顶点为(0,1)的多边形。解决方法是不显示带有额外7个字节的轴(,axes=0
在之后figsize=r
)
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;
}
样本输出:
不打高尔夫球
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是边数。
<?
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;
从中获取边和半径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
module p(n,r){circle(r,$fn=n);}
首先发布在这里!我知道我参加晚会很晚,但这似乎和开始时一样是一个好问题。使用拨打电话p(n,r)
。
数学部分的功劳归功于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);
}
Graphics[Polygon[CirclePoints[r, n]]]
当我们提交Mathematica代码时,我们经常会忘记新的功能,这些新功能会不断地嵌入到语言中,而当前的语言词汇量大约有5000个核心功能。庞大且不断扩展的语言词汇对于代码搜寻非常方便。CirclePoints在当前版本11.x的介绍 7边半径5的特定示例是:
另外,您只需要输入angle参数来控制多边形的方向:
Graphics[Polygon[CirclePoints[{1, 2}, 5]]]
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...