このコードゴルフの目標は、辺の数と半径(中心から頂点までの距離)を指定して、通常のポリゴン(辺の長さが等しいポリゴン)を描くことです。
- 辺の数と半径は、ファイル、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();
}
}
入力は引数です[半径] [側]:
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)の6.28
代わりにを使用してください。Math.PI*2
推定はこの目的に十分正確であり、3バイトを節約できます。5)グラフィックインスタンスを作成するときではGraphics g
なく、宣言Graphics2D g
して2バイトを節約します。
BufferedImage
、Graphics
すべてをすべてスローすることでpaint()
)。画像の色を変更しましたが、それでもIMOの見た目は良好です。これをもう一度見てくれてありがとう:)
ファイル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
外部としてグローバルとして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)
。これはまだ1回の反復でのみ必要ですが、それを取り出すための効率的な方法を見つけることができませんでした:
Graphics@Polygon@Table[r{Cos@t,Sin@t},{t,0,2Pi,2Pi/n}]
私は、無料版のポイントはないと思います。より多くの空白のみが含まれます。
変数の半径と変数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
後figsize=r
)
JavaScript 584(867 ungolfed)
このコードは、1の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);
2つの定義済み変数:$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#プログラム」に切り替えて、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)
ピクセルがポリゴンのすべての超平面(ライン)の内側にあるかどうかを確認します。実際にアポテムが使用されているため、半径に触れます。
Graphics[Polygon[CirclePoints[r, n]]]
Mathematicaコードを提出するとき、言語に組み込まれ続ける新しい関数を忘れることがよくあります。現在の言語の語彙は約5000のコア関数に蓄積されています。広大で拡大している言語の語彙は、コードゴルフでは非常に便利です。CirclePointsは、現在のバージョン11.Xで導入されました。7面の半径5の具体例は次のとおりです。
また、ポリゴンの方向を制御するために、角度パラメーターを入力するだけです。
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
側面は-I
、通常-1に近い色(&HFFFFFFFF白)を使用して描画されます(ただし、I
0の場合、透明の場合)。
のGTRI N,M,X,Y,R,R,-I
代わりにを使用して、塗りつぶされたポリゴンを描くこともできますGLINE...