数学,273个 268 264 242字节
c=CirclePoints;b@_=k=1>0;Graphics[Line/@Cases[Append[Join@@({c@6,{3^.5/2,-Pi/6}~c~6}),{0,0}][[b@#=!k;#]]&/@TakeWhile[#,t=k;(r=t;t=b@#;r)&]&/@Join@@RandomSample[{#,Reverse@#}&/@Partition[Range@12,3,2,1]~Join~Array[{2#,13,2#+6}&,3]],{_,__}]]
将
呈现为一个标T
在数学,是一个后缀置运算符。
整理其中的错误花了很长时间……直到最后,我一起砍了几件事才能使它起作用,所以这绝对不是最佳选择。我还想知道,通过外部六边形上的线更确切地实现该规范并让Mathematica的几何函数处理交点,是否可能整体上更好地实现规范。
请注意,这是一个完整的程序,如果要在单个REPL会话中多次运行代码,则必须在前缀上加上Clear[b]
。
这是20次运行的结果:
说明
该解决方案根本不利用外部星点。取而代之的是,它直接与属于字形的点和一次覆盖其中三个的线一起工作。
让我们标记要点:
1
从一个有点怪异的角开始,但这是由于的默认行为(也有些怪异)引起的CirclePoints
。从那里开始六角形最便宜。
现在,我们要通过与外星体的连接点相对应的三个点找到相关的线。六边形周围的那些当然只是3个相邻点(取模12),从奇数开始。整个中心的那些由一个偶数n
,13
和n+6
。
这些行的表示形式(由以下代码生成三点列表的形式):
Partition[Range@12,3,2,1]~Join~Array[{2#,13,2#+6}&,3]
的Partition
产生围绕六边形的线与Array
通过中心的线。为了处理两个光束,我们将此功能映射到线列表上:
{#,Reverse@#}&
现在,我们将RandomSample
它们随机组合以随机处理它们。Join @@
展平线对列表,以便我们有一个光束列表。
短暂中断:为了跟踪哪些点已经被阻塞,我们使用了查找功能b
,该功能True
针对初始化为所有值b@_=k=1>0;
。处理光束时,我们保留所有点,直到具有b[n] == False
(包括该点)的第一个点为止:
TakeWhile[#,t=k;(r=t;t=b@#;r)&]&
我觉得这是目前最容易打高尔夫球的部分。使用两个临时变量玩Mastermind似乎真的很昂贵。无论如何,这样做的结果是使我们可以绘制一条直线上的点。现在,此函数映射到这些点的每一个上:
Append[Join@@({c@6,{3^.5/2,-Pi/6}~c~6}),{0,0}][[b@#=!k;#]]&
第一部分使用两次调用的交错结果生成所有13个点的列表CirclePoints
(边缘中心和六边形的拐角半径不同)。请注意,b@#=!k
该工具现在将当前点的查找表的值设置为,False
以便没有其他光束可以通过它。最后,该值用作坐标列表的索引,以获得正确的2D点。
Cases[...,{_,__}]
这将丢弃所有单元素列表,因为它们将呈现为单个(可见)点。最后,我们渲染结果:
Graphics[Line/@...]
I made up while doodling during my DiffEq class
。道路上的一切伟大的发现发生...:P