在成对n
排列的圆点的每对不同点之间绘制线,产生类似以下结果的结果。最短的代码(以字节为单位)获胜!您的线条不必透明,但是那样看起来更好。输出必须是矢量图形,或者是至少600像素乘600像素的图像(保存到文件或显示在屏幕上)。要完成挑战,您必须至少绘制20张。
n
不会增加任何挑战,因为我希望大多数解决方案无论如何都可以使用任何数字,特别是因为37是奇数,因此没有镜像对称性。
n
是作为输入还是仅选择n
20个以上的任意一个?
在成对n
排列的圆点的每对不同点之间绘制线,产生类似以下结果的结果。最短的代码(以字节为单位)获胜!您的线条不必透明,但是那样看起来更好。输出必须是矢量图形,或者是至少600像素乘600像素的图像(保存到文件或显示在屏幕上)。要完成挑战,您必须至少绘制20张。
n
不会增加任何挑战,因为我希望大多数解决方案无论如何都可以使用任何数字,特别是因为37是奇数,因此没有镜像对称性。
n
是作为输入还是仅选择n
20个以上的任意一个?
Answers:
n
(我已经从固定37得到了答案):(
由于我对MATL的流利程度不高,因此我希望这会更适合打高尔夫球。(至少能胜过Mathematica会很不错:-)即翻转w
不是最佳的,可以避免...
:G/4*Jw^2Z^!XG
在线测试!(感谢@Suever提供此服务,感谢@DrMcMoylex提供了-2个字节。)
说明(针对N=3
):
: Generate Range 1:input: [1,2,3]
G/ Divide By the first input [0.333,0.666,1]
4* Multiply by 4 [1.33,2.66,4.0]
Jw^ i ^ (the result so far) [-0.49+ 0.86i,-.5-0.86i,1.00]
(This results in a list of the n-th roots of unity)
2Z^ Take the cartesian product with itself (i.e. generate all 2-tuples of those points)
!XG Transpose and plot
值得一提的是,用于产生统一的第N根可以使用式exp(2*pi*i*k/N)
为k=1,2,3,...,N
。但既然exp(pi*i/2) = i
你也可以写i^(4*k/N)
为k=1,2,3,...,N
这是我在这里做什么。
XH:H
为:G
G
非常感谢你!
我不确定我是否会违反任何规则,但是我还是这么做了!
打高尔夫球
p={}for i=0,19 do add(p,{64+64*cos(i/20),64+64*sin(i/20)})end for x in all(p)do for y in all(p)do line(x[1],x[2],y[1],y[2])end end
不打高尔夫球
points={}
for i=0,19 do
x=64+64*cos(i/20)
y=64+64*sin(i/20)
add(points,{x,y})
end
for x in all(points) do
for y in all(points) do
line(x[1],x[2],y[1],y[2])
end
end
PICO-8是基于Lua的幻想游戏机,其原始分辨率为128x128。我尽了最大的努力...
创建一组布置成一个圆的37个点,然后在两个点的所有可能子集之间绘制线。有人发布了一个简短的答案,该答案利用了CompleteGraph的优势,但是我相信这是最短的答案,除了那些依赖CompleteGraph的人。
Graphics@Line@Subsets[CirclePoints@37,{2}]
Tuple
。您还需要对其进行更新以接受任意值n
,但很方便,这不会花费您任何字节。
Tuples
f=n=>{with(Math)with(c.getContext`2d`)for(translate(S=300,S),O=n;O--;)for(rotate(a=PI*2/n),N=n;N--;)beginPath(stroke()),lineTo(0,S),lineTo(sin(a*N)*S,cos(a*N)*S)}
/* Demo */
f(20)
<canvas id=c width=600 height=600>
-13字节:删除closePath()
,移动的stroke()
内beginPath()
-2个字节:a
内部定义的变量rotate()
该解决方案适用于所有人n>1
,即使原始帖子不需要这样做,它也适用。
我最喜欢的是n=5
,不要问为什么,如果您想要一个更酷的GUI,请使用:
int a=Math.min(this.getHeight(),this.getWidth())/2;
代替硬编码的300,它将使用框架的宽度或高度作为直径。
由于Shooqie,节省了8个字节。 借助Geobits,节省了21个字节。
import java.awt.*;void m(final int n){new Frame(){public void paint(Graphics g){Point[]p=new Point[n];int a=300;for(int i=1;i<n+1;i++){p[i-1]=new Point(a+(int)(a*Math.cos(i*2*Math.PI/n)),a+(int)(a*Math.sin(i*2*Math.PI/n)));for(int j=0;j<i;j++){g.drawLine(p[i-1].x,p[i-1].y,p[j].x,p[j].y);}}}}.show();}
输出为n=37
:
Frame x=
和final
(我认为?)
Frame x
来自另一个涉及线程的解决方案。尽管您需要final,因为它是对拥有类中的外部变量的内部类引用。
int
声明移到for
循环外来节省一些字节
import itertools as T,math as M
from PIL import Image as I,ImageDraw as D
s=300
n=input()
t=2*M.pi/n
o=I.new('RGB',(s*2,)*2)
for x in T.combinations([(s*M.cos(t*i)+s,s*M.sin(t*i)+s)for i in range(n)],2):D.Draw(o).line(x)
o.show()
from PIL import*
更短吗?
import *
根据您的安装方式,您不能这样做,您可以跳过PIL并直接导入Image / ImageDraw
它使用与大多数语言相同的公式,但大多数语言都没有方便的内置函数来应对这一挑战(即使我没有看过它们也无法找到它,但这很容易找到公式)。所以不是很有趣,但是通常Perl对于这种挑战没有很多答案,所以我只想提出一个。
$i=new Imager xsize=>700,ysize=>700;for$x(1..$_){for$y(1..$_){$i->line(color=>red,x1=>350+300*cos($a=2*pi*$x/$_),x2=>350+300*cos($b=2*pi*$y/$_),y1=>350+300*sin$a,y2=>350+300*sin$b)}}$i->write(file=>"t.png")
并且您将需要-MImager
(9个字节),-MMath::Trig
(提供pi
,13个字节)和-n
(1个字节)==> + 23个字节。
运行它:
perl -MImager -MMath::Trig -ne '$i=new Imager xsize=>700,ysize=>700;for$x(1..$_){for$y(1..$_){$i->line(color=>red,x1=>350+300*cos($a=2*pi*$x/$_),x2=>350+300*cos($b=2*pi*$y/$_),y1=>350+300*sin$a,y2=>350+300*sin$b)}}$i->write(file=>"t.png")' <<< 27
它将创建一个名为的文件t.png
,其中包含图像。
Imager
虽然您需要安装,但不用担心,这很容易:
(echo y;echo) | perl -MCPAN -e 'install Imager'
(echo
如果您以前从未使用过s,它将为您配置cpan。(实际上,只有在您的perl足够新的情况下,它才能工作,我认为对于大多数人来说都可以,对不起其他人!)) 。
还有更具可读性的版本(是的,对于Perl脚本来说,它是相当可读的!):
#!/usr/bin/perl -n
use Imager;
use Math::Trig;
$i=Imager->new(xsize=>700,ysize=>700);
for $x (1..$_){
for $y (1..$_){
$i->line(color=>red,x1=>350+300*cos($a=2*pi*$x/$_), x2=>350+300*cos($b=2*pi*$y/$_),
y1=>350+300*sin($a), y2=>350+300*sin($b));
}
}
$i->write(file=>"t.png");
-1个字节感谢Titus。
for
循环后引用括号,则可以,它们是必需的。
y2
。我敢打赌你不需要那个。而且您可以写信给STDOUT吗?
imagecolorallocate($i=imagecreate(601,601),~0,~0,~0);for(;$a<$p=2*M_PI;)for($b=$a+=$p/=$argv[1];$b>0;)imageline($i,(1+cos($a))*$r=300,$r+$r*sin($a),$r+$r*cos($b-=$p),$r+$r*sin($b),1);imagepng($i);
将图像写入STDOUT
分解
// create image with white background
imagecolorallocate($i=imagecreate(601,601),~0,~0,~0);
// loop angle A from 0 to 2*PI
for(;$a<$p=2*M_PI;)
// loop angle B from A down to 0
for($b=$a+=$p/=$argv[1];$b;) // ($a pre-increment)
// draw black line from A to B
imageline($i, // draw line
(1+cos($a))*$r=300,$r+$r*sin($a), // from A
$r+$r*cos($b-=$p),$r+$r*sin($b), // to B ($b pre-decrement)
1 // undefined color=black
);
// output
imagepng($i);
固定为-12个字节 n=20
替换$p=2*M_PI
用6
(-8),/=$argv[1]
与=M_PI/10
(-2),并$b>0
与$b
(-2)
使用精确的PI / 10不会造成伤害。使用时.3142
,参数化版本的舍入误差仍然存在,但是随着M_PI/10
它们消失了,我可以检查$b
(<> 0)而不是$b>0
。我本可以.314
用来保存两个字节,但是那样会使点偏移。
该极限$a<6
足够精确到20点。
固定的174个字节 n=314
imagecolorallocate($i=imagecreate(601,601),~0,~0,~0);for(;$a<314;)for($b=$a++;$b--;)imageline($i,(1+cos($a))*$r=300,$r+$r*sin($a),$r+$r*cos($b),$r+$r*sin($b),1);imagepng($i);
使用314点会产生该分辨率的实心圆(如136,140一样,其上的每个偶数以及317以上的所有值)。
cro 20[create-links-to other turtles fd 20]
标记化文件大小为86个字节
r=600V.5142;29,r;r;:I.n:t=2*PI/n:F.i=1TOn*n:a=i DIVn*t:b=i MODn*t:L.r*SINa,r*COSa,r*SINb,r*COSb:N.
在http://www.bbcbasic.co.uk/bbcwin/bbcwin.html上下载下载解释器
每行绘制两次没有错,外观是相同的:-P
不打高尔夫球
r=600 :REM Radius 600 units. 2 units per pixel, so 300 pixels
VDU5142;29,r;r; :REM Set mode 20 (600 pixels high) and move origin away from screen corner
INPUTn :REM Take input.
t=2*PI/n :REM Step size in radians.
FORi=1TOn*n :REM Iterate through all combinations.
a=i DIVn*t :REM Get two angles a and b
b=i MODn*t :REM by integer division and modlo
LINEr*SINa,r*COSa,r*SINb,r*COSb :REM calculate cartesian coordinates and draw line
NEXT
输出n = 21
在原始渲染中,这比在浏览器中看起来要好得多。
LINE
功能。节拍DRAW
...
document.write('<svg viewBox=-1e3,-1e3,2e3,2e3><path stroke=#000 fill=none d=M1e3,0')
with(Math)for(i=37;--i;)for(j=37;j--;)document.write('L'+1e3*cos(a=i*j*PI*2/37)+','+1e3*sin(a))
仅适用于质数,例如原来的建议37。您可以将的初始值减半(四舍五入)i
以获得较暗的图像。您也可以将其始终调整1e3,2e3
为其他值以进行品尝(我从开始300,600
但认为它太粗糙了)。
@(n)plot(graph(ones(n),'Om'),'La','c')
这是一个创建图表的异常功能。
@(n) Define an anonymous fuction of 𝘯
ones(n) Create an 𝘯×𝘯 matrix of ones
graph( ,'Om') Create a graph object with that adjacency
matrix, omitting self-loops
plot( ,'La','c') Plot the graph with a circular layout
例:
graph
这不是生物信息学工具箱的一部分...甚至都不知道它的存在...不错:)
CLS:SCREEN 11:DEFSTR M-Z:DEFDBL A-L
INPUT"N",A:I=(360/A)*.0175:J=230
Q=",":FOR E=0 TO A
FOR F=E TO A
M=x$(COS(I*E)*J+J):N=x$(SIN(I*E)*J+J):O=x$(COS(I*F)*J+J):P=x$(SIN(I*F)*J+J):DRAW "BM"+M+Q+N+"M"+O+Q+P
NEXT:NEXT
FUNCTION x$(d):x$=LTRIM$(STR$(CINT(d))):END FUNCTION
QBasic中的屏幕只能是640x480,因此不幸的是,圆的半径仅为230 px。另外,由于浮点数到整数精度的损失,还会产生一些假象。看起来像这样N=36
:
编辑:我不需要存储,类型声明和所有循环。从原位计算所有笛卡尔笛卡尔的字节数便宜50%...
size
调用和函数调用)void d(int s){float a=2*PI/s,x=0,y=-400,m,n;float[][]p=new float[2][s];translate(400,400);for(int i=0;i<s;i++){m=x*cos(a)-y*sin(a);n=x*sin(a)+y*cos(a);x=m;y=n;p[0][i]=x;p[1][i]=y;for(int j=0;j<i;j++)line(p[0][j],p[1][j],p[0][i],p[1][i]);}}
void setup(){size(800,800);d(50);}
老实说,我不知道为什么,但是setup
必须在第二行。我使用https://en.wikipedia.org/wiki/Rotation_matrix来帮助我计算旋转数学。该程序将计算点并将其推入一个数组,我们将使用该数组绘制线。
这是一张具有50条边的多边形的图片(100条边几乎是全黑的)
您可以添加stroke(0,alpha);
透明边缘,其中alpha
线的不透明度为。下面是使用相同的多边形alpha
的20
。
鉴于所讨论的程序在使用哪种字符编码上存在分歧,因此该程序充满了控制字符。这是xxd
Latin-1编码(代表一个字节中的每个字符)下的样子:
00000000: 6a65 6c6c 7920 6520 2793 5213 636a 0c8e jelly e '.R.cj..
00000010: 2d2d 59fe 9a3f 1d15 dc65 34d3 8442 7f05 --Y..?...e4..B..
00000020: 1172 80cf fb3b ff7d 277c 6369 7263 6f20 .r...;.}'|circo
00000030: 2d54 7073 -Tps
但是,由于某种原因,我实际上无法运行程序,而没有将输入转换为UTF-8(这会使它长63个字节)。从逻辑上讲,它应该像Latin-1一样工作-所有字符都不在0到255的范围之外-但是无论我如何配置字符编码环境变量,我都会不断收到“字符串索引超出范围”错误。因此,除非有人能找到一种无需重新编码就可以运行的方法,否则必须将其计为63个字节。
如果我们使用Jelly的编码来解释该程序,则该程序可能会更具可读性:
jelly e 'ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}'|circo -Tps
该程序在标准输入上获取点数,并在标准输出上输出PostScript图像。(可以通过-Tps
在末尾更改来轻松地调整为以GraphViz支持的任何格式输出;只是PostScript的名称最短。可以说,您可以通过删除来保存五个字符-Tps
,但随后您将以GraphViz的内部图像格式获取输出。没有其他的支持,这可能对问题不起作用。)
从根本上讲,这只是一个Jelly程序,它调用GraphViz进行绘制。但是,Jelly似乎没有运行外部程序的任何功能,因此我不得不使用bash将它们链接在一起。(这也意味着从stdin手动输入Jelly请求输入会更便宜;通常它从命令行获取输入,但这意味着bash包装器中需要额外的字节。)circo
将自动将要绘制的所有点排列成一个圆圈,因此Jelly代码只需要求它绘制一个点列表,所有这些点都相互连接。运作方式如下:
ƓRŒcj€⁾--Y“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ»;”}
Ɠ read number from stdin
R produce range from 1 to that number
(here used to produce a list with
that many distinct elements)
Œc select all unordered pairs from that
⁾-- a string consisting of two hyphens
j€ join each pair via the string
Y join on newlines
; prepend (in this context)
“Ȥ?øßṇe4ạ⁴B¶¦×r°Ẇ» "graph{node[shape=point]"
”} follow output with a "}" character
使用Jelly,我们可以稍微压缩一下通过其内置字典配置GraphViz输出的字符串。这本字典有graph
,node
和point
。令人讨厌的是,它没有shape
(它具有SHAPE
,但是GraphViz区分大小写),因此我们必须逐个字符地对该字符进行编码。
这是输入21的输出(对程序进行了少许修改,使其以可以上载到Stack Exchange的格式输出):
具有硬编码n
点且没有输入n
参数的高尔夫球版:
<svg height="610" width="610"><?for($i=1;$i<33;$i++){$x[]=300*sin(2*M_PI/32*$i)+305;$y[]=300*cos(2*M_PI/32)+305;}foreach($x as$j=>$w){foreach($y as$k=>$z){echo'<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" style="stroke:red;"/>';}}?></svg>
以前的高尔夫版本,带输入参数的n
点数为316字节:
<svg height="610" width="610"><?$n=$_GET[n];$d=2*M_PI/$n;$r=300;$o=305;for($i=1;$i<=$n;$i++){$x[]=$r*sin($d*$i)+$o;$y[]=$r*cos($d*$i)+$o;}foreach($x as$j=>$w){foreach($y as$k=>$z){echo'<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" style="stroke:rgba(0,0,0,.15);stroke-width:1;" />';}}?></svg>
用法:保存在文件中并从浏览器调用:
http://localhost/codegolf/circle.php?n=32
非高尔夫版本,带有用于n
点和CSS的输入参数:
<style>
line {
stroke: rgba(0,0,0,.15);
stroke-width:1;
}
</style>
<svg height="610" width="610">
<?php
$n=$_GET[n]; // number of points
$d=2*M_PI/$n; // circle parts
$r=300; // circle radius
$o=305; // offset x,y
for ($i=1;$i<=$n;$i++){
$x[]=$r*sin($d*$i)+$o; // store x,y coordinates in array
$y[]=$r*cos($d*$i)+$o;
}
foreach($x as $j => $w){ // iterate all x,y points and connect to each other
foreach($y as $k => $z) {
echo '<line x1="'.$x[$j].'" y1="'.$y[$j].'" x2="'.$x[$k].'" y2="'.$y[$k].'" />'."\n";
}
}
?>
</svg>
由于单个帖子的字符数上限为30k,因此无法附加32点全功能代码段。这是屏幕截图:
由于30k单帖限制,附加的代码段限制为18点。
plot(x<-cos(t<-seq(0,2*pi,l=21)),y<-sin(t),as=1);apply(expand.grid(1:21,1:21),1,function(e)lines(x[e],y[e]))
如果我放弃,as=1
强制长宽比为1 的参数,可以减少5个字节。用于expand.grid
创建具有所有可能的成对点的矩阵,并用于apply
遍历该点。
另一种使用package的解决方案igraph
。
library(igraph);plot(make_full_graph(21),layout=cbind(cos(t<-seq(0,2*pi,l=21)),sin(t)))
n
并为点画线,那就太酷了n
。