美利坚合众国的国旗在其州内包含50个星星,代表50个州。
过去,当州数减少时,当然会有更少的星星,而且它们的排列方式也有所不同。例如,从1912-1959年(在新墨西哥州和亚利桑那州进入之后,但在阿拉斯加之前),有48个6×8矩形排列的恒星。
1867-1877年(内布拉斯加州入场后,科罗拉多州之前)使用的37星旗帜具有不对称的星型。
万一将来增加第51个州,陆军纹章学院已经为新国旗开发了初步设计。
但是,没有用于排列星星的通用算法,所以让我们做一个吧!
挑战
编写一个程序,将给定数量的星星放置在美国国旗的州(蓝色部分)中,输出放置这些星星的最佳坐标。 坐标系由0≤x≤W和0≤y≤H 的州(而不是整个标记)定义。
出于这一挑战的目的,“最佳”布置被定义为使州中一个点与最近的恒星中心之间的平均(欧几里得)距离最小化的布置。
一个简单的(如果可能不是最优的)算法来近似该值是:
def mean_distance_to_nearest_star(stars, width, height, point_density=100):
"""
Approximate the mean distance between a point in the rectangle
0 < x < width and 0 < y < height, and the nearest point in stars.
stars -- list of (x, y) points
width, height -- dimensions of the canton
"""
total = 0.0
nx = round(width * point_density)
ny = round(height * point_density)
for ix in range(nx):
x = (ix + 0.5) * width / nx
for iy in range(ny):
y = (iy + 0.5) * width / ny
min_dist = float('inf')
for sx, sy in stars:
min_dist = min(min_dist, math.hypot(x - sx, y - sy))
total += min_dist
return total / (nx * ny)
您的程序应带有三个命令行参数(不计算程序名称本身):
- 要放入小行政区的星星数。
- 小行政区的宽度。(必须接受浮点值。)
- 州的高度。(必须接受浮点值。)
(如果您首选的编程语言不支持命令行参数,请进行合理等效的操作,并在您的答案中进行记录。)
输出应由逗号分隔的X和Y值组成,一行一行。(点的顺序无关紧要。)
例如:
~$ flagstar 5 1.4 1.0
0.20,0.20
0.20,0.80
0.70,0.50
1.20,0.20
1.20,0.80
附加规则和注意事项
- 我有权随时关闭规则中的漏洞。
回答的截止日期是7月4日星期五 24:00 CDT(UTC-05:00)。由于缺乏答案,截止日期已延长。待定。- 包括在您的答案中:
- 您程序的代码
- 有关其工作原理的说明
- 其输出与命令行参数
50 1.4 1.0
- 您的程序必须在合理的时间内运行:在典型的PC上最多5分钟。我不会对此进行严格限制,但是如果需要几个小时,它将取消您的程序的资格。
- 您的程序必须是确定性的,即始终为相同的参数提供完全相同的输出。因此,请勿依赖
time()
或rand()
。只要滚动自己的PRNG,蒙特卡洛方法就可以。 - 只有星星的中心点很重要。不必担心避免重叠或类似的事情。
计分
- 最小化从一个州的点到最近的恒星的平均距离。(往上看。)
- 您可能会根据美国的任何历史标志(在13到50星之间)获得评分。将分数加权为单个排名的确切算法将在稍后发布。
- 如果是平局,将根据净投票数选择获胜者。
- 我可能会发布自己的程序,但会将自己排除在勾选标记之外。