Sono stato incuriosito dal design di questa grafica del New York Times, in cui ogni stato degli Stati Uniti è rappresentato da un quadrato in una griglia. Mi chiedevo se posizionassero i quadrati a mano o effettivamente trovassero un posizionamento ottimale dei quadrati (sotto una certa definizione) per rappresentare le posizioni degli stati contigui.
Il tuo codice accetterà una piccola parte della sfida di posizionare in modo ottimale i quadrati per rappresentare gli stati (o altre forme bidimensionali arbitrarie). In particolare, si supporrà che abbiamo già tutti i centri geografici o centroidi delle forme in un formato conveniente e che la rappresentazione ottimale dei dati in un diagramma come questo sia quella in cui la distanza totale dai centroidi delle forme ai centri dei quadrati che li rappresentano è minima, con al massimo un quadrato in ciascuno posizione possibile.
Il tuo codice prenderà un elenco di coppie uniche di coordinate X e Y in virgola mobile da 0,0 a 100,0 (incluso) in qualsiasi formato conveniente e produrrà le coordinate intere non negative dei quadrati delle unità in una griglia posizionata in modo ottimale per rappresentare i dati , preservando l'ordine. Nei casi in cui più disposizioni dei quadrati sono ottimali, è possibile produrre una qualsiasi delle disposizioni ottimali. Verranno fornite da 1 a 100 coppie di coordinate.
Questo è il codice golf, il codice più corto vince.
Esempi:
Ingresso: [(0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (1.0, 0.0)]
Questo è facile. I centri dei quadrati nella nostra griglia sono a 0.0, 1.0, 2.0, ecc. Quindi queste forme sono già perfettamente posizionate ai centri dei quadrati in questo modello:
21
03
Quindi il tuo output dovrebbe essere esattamente queste coordinate, ma come numeri interi, in un formato a tua scelta:
[(0, 0), (1, 1), (0, 1), (1, 0)]
Ingresso: [(2.0, 2.1), (2.0, 2.2), (2.1, 2.0), (2.0, 1.9), (1.9, 2.0)]
In questo caso, tutte le forme sono vicine al centro del quadrato in (2, 2), ma dobbiamo allontanarle perché due quadrati non possono essere nella stessa posizione. Ridurre al minimo la distanza dal centroide di una forma al centro del quadrato che lo rappresenta ci dà questo schema:
1
402
3
Quindi il tuo output dovrebbe essere [(2, 2), (2, 3), (3, 2), (2, 1), (1, 2)].
Casi test:
[(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)]
Distanza totale dai centroidi delle forme ai centri dei quadrati che li rappresentano in ogni caso (per favore fatemi sapere se individuate degli errori!):
0.0
3.6
4.087011
13.243299
2.724791
1.144123
Solo per divertimento:
Ecco una rappresentazione dei centri geografici degli Stati Uniti contigui nel nostro formato di input, approssimativamente alla scala utilizzata dal 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)]
Per ottenerli, ho preso le coordinate dal secondo elenco in questa pagina e utilizzate 0.4 * (125.0 - longitude)per la nostra coordinata X e 0.4 * (latitude - 25.0)per la coordinata Y. Ecco come appare tracciato:
La prima persona che utilizza l'output del proprio codice con le coordinate sopra come input per creare un diagramma con quadrati effettivi ottiene una pacca sulla spalla!





(1, 2), no(1, 1).