Мене заінтригувало оформлення цієї графіки з New York Times, в якій кожен штат США представлений квадратом у сітці. Мені було цікаво, чи розміщують вони квадрати вручну чи насправді знаходять оптимальне розміщення квадратів (за деяким визначенням) для відображення позицій суміжних станів.
Ваш код буде вирішувати невелику частину завдання оптимального розміщення квадратів для відображення станів (або інших довільних двовимірних фігур.) Зокрема, передбачається, що у нас вже є всі географічні центри або центроїди фігур у зручний формат, і що оптимальне представлення даних на подібній діаграмі - це та, в якій загальна відстань від центроїдів фігур до центрів квадратів, що їх представляють, мінімальна, максимум по одному квадрату в кожному можливе положення.
Ваш код буде містити список унікальних пар координат X і Y з плаваючою комою від 0,0 до 100,0 (включно) у будь-якому зручному форматі, і виводить невід’ємні цілі цілі координати одиниць квадратів у сітці, оптимально розміщеній для представлення даних , збереження порядку. У випадках, коли кілька розташувань квадратів є оптимальними, ви можете вивести будь-яку з оптимальних композицій. Буде задано від 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
Задля розваги:
Ось представлення географічних центрів сусідніх Сполучених Штатів у нашому форматі введення, приблизно в масштабі, який використовував Times:
[(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)
.