这是有关“拉紧功能”的两个挑战中的第二个挑战。这是稍微简单的第一部分。
让我们在位置(x 1,y 1)至(x m,y m)上将m钉子钉入板中。将橡皮筋绑在第一个和最后一个上,并在其他钉子周围伸展,使橡皮筋依次穿过所有钉子。请注意,橡皮筋现在描述了二维空间中的分段线性参数化函数(x(t),y(t))。
现在在位置(x 1,y 1)至(x n,y n)处将另外n个钉子钉入板中。如果现在我们除去所有第一个和最后一个钉子(橡胶的末端绑在这两个钉子上)之外的所有m个钉子,橡皮筋将缩短,直到其紧紧缠绕在新钉子上,从而产生另一个分段线性函数。
作为一个例子,取M = 12条初始钉在位置(0,0),(2,-1),(3/2,4/3),(7/2,1/3),(11/2, 16/3),(1、16 / 3),(0、1),(7,-2),(3、4),(8、1),(3,-1),(11、0),并且n = 10个另外的钉子在位置(1、1),(3、1),(4、4),(1、3),(2、2),(5,-1),(5、0 ),(6,2),(7,1),(6,0)。以下三个图显示了上述过程:
对于较大的版本:右键单击->在新选项卡中打开
如果您在可视化时遇到一些困难,这是橡皮筋收紧的动画:
挑战
给定两个“钉子”列表,如果绷紧的橡皮筋从横穿第一个列表中所有钉子的形状开始,则在第二个列表周围绘制绷紧的橡皮筋。
您可以编写程序或函数,并通过STDIN,ARGV或函数参数接受输入。您可以在屏幕上显示结果,也可以将图像保存到文件中。
如果将结果栅格化,则每侧至少需要300像素。最终的橡皮筋和钉子必须至少覆盖图像水平和垂直方向的75%。x和y的长度比例必须相同。您需要在第二组(至少使用3x3像素)中显示钉子,并在字符串中显示至少1像素宽的指甲。您可以包括也可以不包括轴。
颜色是您的选择,但是您至少需要两种可区分的颜色:一种用于背景,一种用于指甲和细绳(尽管这些颜色可能具有不同的颜色)。
您可能会假设第二个列表中的所有钉子都距离橡皮筋的初始形状至少10 -5个单位(这样就不必担心浮点精度了)。
这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。
更多例子
这是另外两个示例:
{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}
{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}
这是一个示例,显示了剩下的两个初始钉子的重要性。结果应该是b而不是 a:
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
感谢Ell提供此示例。