संयुक्त राज्य अमेरिका के झंडे में शामिल है, इसके कैंटन में, 50 राज्यों का प्रतिनिधित्व करने वाले 50 सितारे।
अतीत में, जब कम राज्य थे, बेशक कम सितारे थे, और उन्हें अलग तरीके से व्यवस्थित किया गया था। उदाहरण के लिए, 1912-1959 (न्यू मैक्सिको और एरिज़ोना के प्रवेश के बाद लेकिन अलास्का से पहले), 6 × 8 आयताकार व्यवस्था में 48 सितारे थे।
1867-1877 से (नेब्रास्का के प्रवेश के बाद लेकिन कोलोराडो से पहले) 37-सितारा ध्वज का उपयोग एक असममित सितारा पैटर्न के साथ किया था।
यदि भविष्य में 51 वाँ राज्य जोड़ा जाता है, तो आर्मी इंस्टीट्यूट ऑफ़ हेराल्ड्री ने पहले ही एक नए झंडे के लिए एक प्रारंभिक डिजाइन विकसित कर लिया है।
लेकिन तारों की व्यवस्था के लिए कोई सामान्य एल्गोरिदम नहीं है , तो चलो एक बनाते हैं!
चुनौती
एक कार्यक्रम लिखें जो अमेरिकी ध्वज के केंटन (नीला भाग) में जगह देने के लिए सितारों की एक संख्या के लिए, उन तारों को रखने के लिए आउटपुट इष्टतम निर्देशांक जिस पर स्थित है। समन्वय प्रणाली को केंटन के साथ परिभाषित किया गया है [ ध्वज नहीं पूरे के रूप में] 0≤x systemW और 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
अतिरिक्त नियम और नोट्स
- मुझे किसी भी समय नियमों में कमियां बंद करने का अधिकार है।
उत्तर के लिए समय सीमा शुक्रवार, 4 जुलाई को 24:00 CDT (UTC-05: 00) है।जवाब न मिलने के कारण समय सीमा बढ़ा दी गई है। टीबीए।- अपने उत्तर में शामिल करें:
- आपके प्रोग्राम का कोड
- यह कैसे काम करता है इसका स्पष्टीकरण
- कमांड-लाइन तर्कों के साथ इसका आउटपुट
50 1.4 1.0
- आपका कार्यक्रम उचित समय के भीतर चलना चाहिए: एक विशिष्ट पीसी पर अधिकतम 5 मिनट। मैं इस बारे में अति-सख्त नहीं होऊंगा, लेकिन अगर घंटे लगते हैं तो यह आपके कार्यक्रम को अयोग्य घोषित कर देगा ।
- आपका कार्यक्रम नियतात्मक होना चाहिए, अर्थात, हमेशा समान तर्कों के लिए समान आउटपुट दें। तो, पर निर्भर नहीं है
time()
याrand()
। जब तक आप अपना खुद का PRNG रोल करते हैं मोंटे कार्लो तरीके ठीक हैं। - सितारों के केवल केंद्र बिंदु ही मायने रखते हैं। ओवरलैप या उस जैसी किसी चीज़ से बचने की कोशिश करने के बारे में चिंता न करें।
स्कोरिंग
- केंटन में एक बिंदु से निकटतम स्टार की औसत दूरी को कम करें। (ऊपर देखो।)
- आपको 13 और 50 सितारों के बीच, किसी भी ऐतिहासिक अमेरिकी झंडे के आधार पर स्कोर किया जा सकता है। एकल रैंकिंग में स्कोर करने के लिए सटीक एल्गोरिदम को बाद में पोस्ट किया जाएगा।
- एक टाई के मामले में, विजेता को नेट अपवोट्स की संख्या द्वारा चुना जाएगा।
- मैं शायद अपना खुद का एक कार्यक्रम पोस्ट करूंगा, लेकिन खुद को चेकमार्क के लिए योग्य होने से बाहर कर दूंगा।