이 코드 골프의 목표는 변의 개수와 반경 (중심에서 정점까지의 거리)을 고려하여 규칙적인 다각형 (한 변의 길이를 가진 것)을 그리는 것입니다.
- 변의 개수와 반지름은 파일, STDIN 또는 일반 오래된 변수를 통해 입력 할 수 있습니다. 당신의 언어로 더 짧은 것을 사용하십시오.
- ASCII 아트 대신 이미지가 실제로 그려지는 경우 총 문자 / 바이트의 -25 %
이 코드 골프의 목표는 변의 개수와 반경 (중심에서 정점까지의 거리)을 고려하여 규칙적인 다각형 (한 변의 길이를 가진 것)을 그리는 것입니다.
답변:
로고 37-25 % = 27.75 (변수 포함)
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]
로고 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();
}
}
입력은 인수 [radius] [sides]입니다.
java D 300 7
산출:
java.awt.image.*
대신java.awt.image.BufferedImage
Short.valueOf
대신 Integer.valueOf
4 바이트를 저장 하십시오 . 2) y[]=x.clone()
1 바이트 이상을 저장 y[]=new int[s]
합니다. 3) 추가 9 바이트를 저장하는 f.show();
대신 사용되지 않는 것을 사용하십시오 f.setVisible(1>0);
. 4) 추정이이 목적에 충분히 정확하여 3 바이트를 절약하므로 6.28
대신 대신을 사용하십시오 Math.PI*2
. 5) 2 바이트를 저장하기 위해 그래픽스 인스턴스를 생성 할 때 Graphics g
대신 선언하십시오 Graphics2D g
.
BufferedImage
와 휴지통을 버리고 Graphics
모든 것을 던져서 paint()
). 여전히 좋은 IMO로 보이지만 이미지의 색상이 변경되었습니다. 이것을 다시 한 번 봐 주셔서 감사합니다 :)
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.,//...
골프에 대한 나의 첫 번째 시도. 적어도 그것은 자바 솔루션보다 뛰어납니다. ;-)
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 문자는 너비가 높지 않습니다).
######
### ###
#### ####
### ###
### ####
### ###
# #
# ##
# #
# #
## ##
# #
## ##
# #
# #
## ##
# #
## ##
# #
# #
# #
# #
## ##
# #
## ##
# #
# #
## ##
# #
## ##
# #
# #
# ##
# #
### ###
### ####
### ###
### ####
### ###
######
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}]
나는 ungolfed 버전에 대한 요점이 없다고 생각합니다. 더 많은 공백 만 포함합니다.
variable의 반경과 variable r
의 변의 개수를 예상합니다 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;
하고 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
after figsize=r
)
자바 스크립트 584 (867 ungolfed)
이 코드는 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 캔버스 요소가 필요합니다. 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
수학 부분에 대한 크레딧은 Java 답변을 사용하여 Geobits (걱정하지 않기를 바랍니다)에갑니다. 나는 수학에 희망이 없다 :)
출력 창이 내장되어 있으므로 LINQPAD 에서이 작업을 수행했습니다. 기본적으로 다음을 끌어다 놓으면 다각형이 그려집니다. 'C # Program'으로 전환하고 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);
}
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)
픽셀이 다각형의 모든 초평면 (선)의 안쪽에 있는지 확인합니다. 실제로 apothem이 사용되기 때문에 반경이 터치됩니다.
Graphics[Polygon[CirclePoints[r, n]]]
Mathematica 코드를 제출할 때, 현재 언어 어휘가 5000 개 핵심 기능으로 누적되어 언어에 계속 내장되어있는 새로운 기능을 잊어 버리는 경우가 종종 있습니다 . 크고 확장되는 언어 어휘는 코드 골프에 매우 편리합니다. CirclePoints 는 현재 버전 11.X에서 도입되었습니다. 7면 반경 5의 구체적인 예는 다음과 같습니다.
또한 다각형의 방향을 제어하려면 각도 매개 변수를 입력해야합니다.
Graphics[Polygon[CirclePoints[{1, 2}, 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
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...
\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
.
evince 에서 볼 때 5
측면과 반지름 8in
이 있는 다각형은 다음과 같습니다 .