数学,111个 105 104字节
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&
说明:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&
定义一个函数r
,该函数接受输入#
并计算到单元0的距离(以单元数为单位)。它通过利用每个距离/环的最后一个单元中的模式来实现:0 = 3(0 ^ 2 + 0),6 = 3(1 ^ 2 + 1),18 = 3(2 ^ 2 + 2),36 = 3(3 ^ 2 + 3)......然后反转该模式的公式。请注意,对于单元格0,它实际上取下限为(1/2)+ i *(sqrt(3)/ 6),它按分量计算得出0 + 0 * i = 0。
具有r
define的r@#
是单元格的环#
(在另一个函数的定义内部)。#+3r@#-3(r@#)^2&
不会确切地出现在代码中,但是它需要一个单元格的数目并减去下一个内环中单元格的最高数目,因此它给出了以下问题的答案:“当前环是哪个单元格?” 例如,单元9是环2的第三个单元,因此r[9]
将输出2和#+3r@#-3(r@#)^2&[9]
输出3。
我们可以使用上面的函数来找到极角从“单元0,单元17,单元58”射线到所讨论单元和逆时针角度。每个环的最后一个像元始终处于Pi / 6角,并且我们以Pi /(3 * ring_number)的增量绕环旋转。因此,从理论上讲,我们需要计算类似Pi / 6 +(which_cell_of_the_current_ring)* Pi /(3 * ring_number)的值。但是,图片的旋转不会产生任何影响,因此我们可以丢弃Pi / 6部分(以节省6个字节)。将其与以前的公式结合并简化,我们得到Pi(#/(3r@#)+1-r@#)&
不幸的是,由于单元格0的环号为0,所以这是未定义的,因此我们需要解决这个问题。一个自然的解决方案就是这样t=If[#==0,0,Pi(#/(3r@#)+1-r@#)]&
。但是,由于我们不在乎单元0的角度,并且因为r@#
重复了这一步,因此我们实际上可以在此处保存一个字节t=Limit[Pi(#/(3x)+1-x),x->r@#]&
现在我们有了环号和角度,我们可以找到一个像元(中心)的位置,以便测试相邻性。因为圆环是六边形,所以找到实际位置很烦人,但是我们可以简单地假装圆环是完美的圆,这样我们就可以将圆环数视为到像元0中心的距离。关。使用复数的极坐标形式,我们可以使用简单的函数表示复数平面中的该近似位置:p = r@#*Exp[I*t@#] &;
复数平面上两个复数之间的距离由它们的差的绝对值给出,然后我们可以对结果进行舍入以处理近似值中的所有误差,并检查其是否等于1。最终的函数这项工作没有名字,但是是Round@Abs[p@#-p@#2]==1&
。
您可以在Wolfram Cloud沙箱中在线尝试,方法是粘贴以下代码,然后单击Gear->“评估单元格”,或按Shift + Enter或数字键盘Enter:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&[24,45]
或对于所有测试用例:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&//MapThread[#,Transpose[{{0,1},{7,18},{8,22},{24,45},{40,64},{64,65},{6,57},{29,90},{21,38},{38,60},{40,63},{41,39},{40,40}}]]&