Bu grafiğin, her ABD eyaletinin bir ızgaradaki bir kare ile temsil edildiği New York Times'dan tasarımı ilgimi çekti. Kareleri elle yerleştirip yerleştirmediklerini ya da bitişik durumların konumlarını temsil etmek için gerçekten bir kareler (bazı tanımların altında) yerleştirip yerleştirmediklerini merak ettim.
Kodunuz, durumları (veya diğer rasgele iki boyutlu şekilleri) temsil etmek için kareleri en uygun şekilde yerleştirme zorluğunun küçük bir bölümünü ele alacaktır. Özellikle, şekillerdeki tüm coğrafi merkezlere veya centroidlere sahip olduğumuzu varsayacaktır . uygun bir formattır ve böyle bir diyagramdaki verilerin en uygun şekilde temsil edilmesi, şekillerin merkezlerinden, onları temsil eden karelerin merkezlerine olan toplam mesafenin en az olduğu, her birinde en fazla bir kare olduğu olası konum.
Kodunuz, herhangi bir uygun biçimde 0.0 ila 100.0 (dahil) arasındaki kayan nokta X ve Y koordinatlarının benzersiz çiftlerinin bir listesini alır ve verileri temsil etmek için en uygun şekilde yerleştirilmiş bir ızgarada birim karelerinin negatif olmayan tam sayı koordinatlarını verir , düzeni koruyor. Birden çok kare düzenlemesinin en uygun olduğu durumlarda, optimum düzenlemelerden herhangi birini çıktı alabilirsiniz. 1 ile 100 çift arasında koordinat verilecektir.
Bu kod golf, en kısa kod kazanır.
Örnekler:
Giriş: [(0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (1.0, 0.0)]
Bu kolay bir soru. Izgaramızdaki karelerin merkezleri 0.0, 1.0, 2.0 vb. Şeklindedir, bu nedenle bu şekiller zaten bu modeldeki karelerin merkezlerine mükemmel bir şekilde yerleştirilmiştir:
21
03
Dolayısıyla çıktınız tam olarak bu koordinatlar olmalı, ancak tamsayı olarak, seçtiğiniz bir biçimde olmalıdır:
[(0, 0), (1, 1), (0, 1), (1, 0)]
Giriş: [(2.0, 2.1), (2.0, 2.2), (2.1, 2.0), (2.0, 1.9), (1.9, 2.0)]
Bu durumda, tüm şekiller (2, 2) 'deki karenin merkezine yakındır, ancak onları itmek zorundayız çünkü iki kare aynı konumda olamaz. Bir şeklin centroidinden onu temsil eden karenin merkezine olan mesafeyi en aza indirmek bize bu deseni verir:
1
402
3
Yani çıktınız olmalı [(2, 2), (2, 3), (3, 2), (2, 1), (1, 2)]
.
Test senaryoları:
[(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)]
Şekillerin sentroidlerinden her durumda kendilerini temsil eden karelerin merkezlerine olan toplam mesafe (herhangi bir hatayı tespit ederseniz lütfen bize bildirin!):
0.0
3.6
4.087011
13.243299
2.724791
1.144123
Sadece eğlence için:
İşte bitişik ABD'nin coğrafi merkezlerinin girdi biçimimizde, kabaca Times'ın kullandığı ölçekte bir temsili:
[(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)]
Bunları elde etmek için, bu sayfadaki ikinci listeden koordinatları aldım ve 0.4 * (125.0 - longitude)
X koordinatımız ve 0.4 * (latitude - 25.0)
Y koordinatımız için kullandım. Çizilen şuna benzer:
Kodlarından çıktıyı yukarıdaki koordinatlarla birlikte kullanan ilk kişi, gerçek karelerle bir diyagram oluşturmak için girdi olarak arkada bir pat alır!
(1, 2)
, değil(1, 1)
.