高尔夫生命之花


19

这里的挑战是用您选择的语言准确地描绘出生命之花(在某些情况下是神圣的几何图形)。

生命之花

设计包括如图所示的半径为1的圆和部分圆的排列,其中心排列在间距为1的三角形网格上,再加上一个围绕其的半径为3的较大圆。

您可以根据需要缩放设计,但允许数学上正确的最大误差为2%。如果使用光栅图形,则有效地将小圆圈的直径限制为至少约100个像素。

因为这是代码高尔夫球,所以最短的代码(字节)获胜。


10
欢迎光临本站!众所周知,通常建议您等待一会儿再接受答案,这样其他用户就不会将比赛视为“结束”,并且会有更多的参与和竞争。
DJMcMayhem

2
“视觉,可识别和正确”既不清晰也不客观。没有客观有效性标准,就无法确定提交的内容是否有效。我们鼓励使用沙盒解决所有潜在的问题,然后再将其发布到主站点。
Mego

除了诸如“可识别”之类的抽象规则外,最好指定最小大小。
manatwork '16

由于尚未有人将其插入,因此我们在meta上有一个沙箱,旨在帮助新挑战获得反馈。您可以在这里找到它:meta.codegolf.stackexchange.com/questions/2140/…–
tuskiomi

1
实际上不只是19个圈子。边缘处也有一些圆弧。(其中6个覆盖2π/ 3的角度,12个覆盖π,18个覆盖π/ 6)
Martin Ender

Answers:


23

Mathematica,177 173 128 124 120字节

c=Circle;Graphics@{{0,0}~c~3,Rotate[Table[If[-3<x-y<4,c[{√3x,-x+2y}/2,1,Pi/{6,2}]],{x,-3,2},{y,-4,2}],Pi/3#]&~Array~6}

在此处输入图片说明

主要思想是从以下六个旋转版本组成结果:

在此处输入图片说明

这又是一个矩形表,该矩形表具有相同的圆弧,但有两个角被切除。如果我们删除剪切并用a表示每个圆心#,则我们基本上希望以这种模式分布圆:

####
#####
######
######
 #####
  ####

通过-3 < x-y < 4在2D索引上施加条件(由于的值x-y沿对角线恒定)来切除这些边缘,并且剪切是通过将这些值xy跨越我们要查找的网格的非正交基向量相乘而得到的。

由于弧的两端均等地划分,Pi因此未旋转的弧的这种特定方向最短,因此弧可以表示为Pi/{6,2}(所有其他弧都需要加上分子中的附加负号或整数)。


使用√3可保存2个字符和0个字节,同时消除了数字错误的来源。
凯莉·洛德

@KellyLowder好点,固定。
Martin Ender

8

OpenSCAD,228个字节

$fn=99;module o(a=9){difference(){circle(a);circle(a-1);}}function x(n)=9*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o();q(g-1);}}else{intersection(){translate(x(i))o();circle(9);}}}q(2);o(27);

以下是允许某人设置参数r(半径)和w(环的宽度)的版本。

r=1;w=.1;$fn=99;module o(n){difference(){circle(n);circle(n-w);}}function x(n)=(r-w/2)*[sin(n*60),cos(n*60)];module q(g){for(i=[1:6])if(g>0){translate(x(i))union(){o(r);q(g-1);}}else{intersection(){translate(x(i))o(r);circle(r);}}}q(2);o(3*r-w);

这个版本实际上是246个字符。
某些代码在技术上是不必要的,但使它看起来更像图片。


我在OpenSCAD.net(Firefox 47)上遇到此错误: Error: Error: Parse error on line 1: ...x(k))o();circle(9);};}}}q(2);o(27); -----------------------^ Expecting 'TOK_ID', '}', 'TOK_IF', '!', '#', '%', '*', got ';'
HyperNeutrino

@AlexL。当我在Mac上使用实际的OpenSCAD客户端时,没有出现该错误。但是我能够使用chrome在OpenSCAD.net上复制该错误,这令人失望。它认为这与他们的服务有关。您可以尝试使用桌面应用程序吗?
亨利·维尔德默斯

1
在台式机版本(Ubuntu 14.04 LTS)上为我工作。
本杰明·史派克

1
我在您的代码中注意到了};}模式。我认为您可以放心地用}}替换掉,这将同时刮掉两个版本的字符。我自己进行了测试,似乎可以正常工作。
本杰明·史派克

6

Mathematica 263字节

@MartinEnder的提交并不具有真正的竞争力,但是我还是很开心。我让花瓣随意走动!花瓣通过绕端点之一随机旋转60度而走动,端点也是随机选择的。我测试一下花瓣的旋转端是否落在大圆盘的外面,如果是,旋转方向相反。

c=Circle;a=√3;v={e=0{,},{0,2}};f=RandomChoice;Graphics@{e~c~6,Table[q=f@{1,2};t=f@{p=Pi/3,-p};r=RotationTransform[#,v[[q]]]&;v=r[If[r[t]@v[[-q]]∈e~Disk~6,t,-t]]@v;Translate[Rotate[{c[{1,a},2,p{4,5}],c[{1,-a},2,p{1,2}]},ArcTan@@(#-#2)&@@v,e],v[[2]]],{5^5}]}

这是我用于动画的后续代码。

Export[NotebookDirectory[]<>"flower.gif", Table[Graphics[Join[{c[e,6]},(List@@%)[[1,2,1;;n-1]],{Thick,Red,(List@@%)[[1,2,n]]}]],{n,1,3^4,1}]]

随机花瓣漫步

我读到某个地方,二维随机游走最终必须返回原点。似乎几千步保证了填充大磁盘。


这是一个非常不错的主意,但由于迭代次数有限,因此不填满整个花朵的可能性也非零。绘制30张花瓣后,您可能应该添加终止条件(这似乎是确定您是否实际完成的最短方法)。然后,您将知道在终止时绘制完成了,不终止的可能性为零。
马丁·恩德

独立于此,您可以保存很多字节:Sqrt[3]is 3^.5。您无需先定义e即可,可以使用此技巧在其上保存一个字节,因此v={e=0{,},{0,2}}。您还可以使用一些前缀表示法,例如e~c~6e~Disk~6,并且ArcTan@@Subtract@@v应等效于ArcTan@@(#-#2)&@@v
马丁·恩德

使用了infix和√运算符来删除15个字节。感谢@MartinEnder的提示。摆脱了/ 2和2 *被取消的情况。有180个花瓣,因此4 ^ 4迭代通常覆盖大约一半的磁盘,而5 ^ 5可以完成。9 ^ 9不覆盖磁盘的概率为10 ^ 400,000中的〜1,这远远小于2%的错误,因此不值得浪费字节进行检查。
凯莉·劳德

3

JavaScript(ES6)/ SVG,299字节

with(document){write(`<svg height=250 width=250><circle${b=` fill=none stroke=black `}cx=125 cy=125 r=120 />`);for(i=0;i<24;i++)write(`<path${b}d=M5,125${`${a=`a60,60,0,0,1,`}40,0`.repeat(i%4+3)+`${a}-40,0`.repeat(i%4+3)} transform=${`rotate(60,125,125)`.repeat(i>>2)}rotate(-60,${i%4*4}5,125) />`)}

通过生成多个不同长度的弧对,然后将其旋转到位来工作。

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.