我对《纽约时报》的这张图片的设计很感兴趣,其中每个美国州都由一个正方形的网格表示。我想知道他们是手动放置正方形还是实际上找到了一个最优的正方形放置(在某种定义下)来表示连续状态的位置。
您的代码将只承受一小部分挑战,即以最佳方式放置正方形来表示状态(或其他任意二维形状)。具体地说,它假设我们已经具有所有形状的地理中心或质心一种方便的格式,并且在这样的图中,数据的最佳表示形式是从形状的质心到代表它们的正方形中心的总距离最小,每个中最多一个正方形可能的位置。
您的代码将以任何方便的格式获取从0.0到100.0(含)之间的唯一的浮点X和Y坐标对列表,并将以最佳位置表示数据的网格中输出单位平方的非负整数坐标。 ,保持秩序。如果正方形的多个排列是最佳的,则可以输出任何最佳排列。将给出1至100对坐标。
这是代码高尔夫球,最短的代码获胜。
例子:
输入: [(0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (1.0, 0.0)]
这是个简单的。在我们的网格中,正方形的中心位于0.0、1.0、2.0等处,因此这些形状已经完美地放置在此模式的正方形的中心处:
21
03
因此,您的输出应恰好是这些坐标,但以您选择的格式为整数:
[(0, 0), (1, 1), (0, 1), (1, 0)]
输入: [(2.0, 2.1), (2.0, 2.2), (2.1, 2.0), (2.0, 1.9), (1.9, 2.0)]
在这种情况下,所有形状都在(2,2)处接近正方形的中心,但是我们需要将它们推开,因为两个正方形不能位于同一位置。最小化从形状的质心到代表该形状的正方形的中心的距离,可以得到以下图案:
1
402
3
因此,您的输出应为[(2, 2), (2, 3), (3, 2), (2, 1), (1, 2)]
。
测试用例:
[(0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (1.0, 0.0)] -> [(0, 0), (1, 1), (0, 1), (1, 0)]
[(2.0, 2.1), (2.0, 2.2), (2.1, 2.0), (2.0, 1.9), (1.9, 2.0)] -> [(2, 2), (2, 3), (3, 2), (2, 1), (1, 2)]
[(94.838, 63.634), (97.533, 1.047), (71.954, 18.17), (74.493, 30.886), (19.453, 20.396), (54.752, 56.791), (79.753, 68.383), (15.794, 25.801), (81.689, 95.885), (27.528, 71.253)] -> [(95, 64), (98, 1), (72, 18), (74, 31), (19, 20), (55, 57), (80, 68), (16, 26), (82, 96), (28, 71)]
[(0.0, 0.0), (0.1, 0.0), (0.2, 0.0), (0.0, 0.1), (0.1, 0.1), (0.2, 0.1), (0.0, 0.2), (0.1, 0.2), (0.2, 0.2)] -> [(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2)]
[(1.0, 0.0), (1.0, 0.1), (1.0, 0.2), (1.0, 0.3)] -> [(1, 0), (0, 0), (2, 0), (1, 1)] or [(1, 0), (2, 0), (0, 0), (1, 1)]
[(3.75, 3.75), (4.25, 4.25)] -> [(3, 4), (4, 4)] or [(4, 3), (4, 4)] or [(4, 4), (4, 5)] or [(4, 4), (5, 4)]
在每种情况下,形状的质心到代表它们的正方形的中心的总距离(请告知我是否发现任何错误!):
0.0
3.6
4.087011
13.243299
2.724791
1.144123
只是为了好玩:
这是我们输入格式下的连续美国地理中心的表示,大致与《纽约时报》使用的比例:
[(15.2284, 3.1114), (5.3367, 3.7096), (13.0228, 3.9575), (2.2198, 4.8797), (7.7802, 5.5992), (20.9091, 6.6488), (19.798, 5.5958), (19.1941, 5.564), (17.023, 1.4513), (16.6233, 3.0576), (4.1566, 7.7415), (14.3214, 6.0164), (15.4873, 5.9575), (12.6016, 6.8301), (10.648, 5.398), (15.8792, 5.0144), (13.2019, 2.4276), (22.3025, 8.1481), (19.2836, 5.622), (21.2767, 6.9038), (15.8354, 7.7384), (12.2782, 8.5124), (14.1328, 3.094), (13.0172, 5.3427), (6.142, 8.8211), (10.0813, 6.6157), (3.3493, 5.7322), (21.3673, 7.4722), (20.1307, 6.0763), (7.5549, 3.7626), (19.7895, 7.1817), (18.2458, 4.2232), (9.813, 8.98), (16.8825, 6.1145), (11.0023, 4.2364), (1.7753, 7.5734), (18.8806, 6.3514), (21.3775, 6.6705), (17.6417, 3.5668), (9.9087, 7.7778), (15.4598, 4.3442), (10.2685, 2.5916), (5.3326, 5.7223), (20.9335, 7.6275), (18.4588, 5.0092), (1.8198, 8.9529), (17.7508, 5.4564), (14.0024, 7.8497), (6.9789, 7.1984)]
为了得到这些,我从本页的第二个列表中0.4 * (125.0 - longitude)
获取了坐标,并用于我们的X坐标和0.4 * (latitude - 25.0)
我们的Y坐标。这是绘制的样子:
第一个将其代码的输出与上述坐标一起用作输入以创建具有实际正方形的图的人将在后面拍拍!
(1, 2)
,不是(1, 1)
。