ธงของสหรัฐอเมริกาประกอบด้วยใน 50 ดาวของมันเป็นตัวแทนของ 50 รัฐ
ในอดีตเมื่อมีรัฐน้อยกว่ามีดาวน้อยกว่าแน่นอนและมีการจัดเรียงต่างกัน ตัวอย่างเช่นตั้งแต่ปี 1912-2502 (หลังเข้านิวเม็กซิโกและแอริโซนา แต่ก่อนถึงอลาสก้า) มีดาว 48 ดวงในรูปสี่เหลี่ยมผืนผ้า 6 × 8 สี่เหลี่ยม
ธง 37 ดาวที่ใช้จาก 1867-1877 (หลังจากเข้าเนบราสก้า แต่ก่อนโคโลราโด) มีรูปแบบดาวไม่สมมาตร
ในกรณีที่มีการเพิ่มรัฐที่ 51ในอนาคตสถาบันทหารบกได้พัฒนารูปแบบเบื้องต้นสำหรับธงใหม่แล้ว
แต่ไม่มีอัลกอริทึมทั่วไปสำหรับการจัดเรียงดาวดังนั้นลองมาสร้างมันกัน!
ความท้าทาย
เขียนโปรแกรมที่จะกำหนดจำนวนดาวที่ต้องการในแคนตัน (ส่วนสีน้ำเงิน) ของธงสหรัฐอเมริกาออกพิกัดที่เหมาะสมที่สุดเพื่อวางดาวเหล่านั้น ระบบพิกัดถูกกำหนดด้วยตำบล [ ไม่ใช่ธงทั้งหมด] ด้วย0≤x≤Wและ0≤y≤H
สำหรับจุดประสงค์ของการท้าทายนี้การจัดเรียง "ดีที่สุด" ถูกกำหนดให้เป็นหนึ่งเดียวที่ช่วยลดระยะห่างเฉลี่ย (Euclidean) ระหว่างจุดหนึ่งในมณฑลและศูนย์กลางของดาวที่ใกล้ที่สุด
อัลกอริทึมที่ตรงไปตรงมา (ถ้าอาจจะไม่ดี) เพื่อประมาณค่านี้คือ:
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()
วิธีการของ Monte Carlo นั้นใช้ได้ตราบเท่าที่คุณหมุน PRNG ของคุณเอง - เฉพาะจุดศูนย์กลางของดาวเท่านั้นที่มีความสำคัญ ไม่ต้องกังวลกับการพยายามหลีกเลี่ยงการทับซ้อนหรืออะไรทำนองนั้น
เกณฑ์การให้คะแนน
- ลดระยะห่างเฉลี่ยจากจุดในมณฑลไปยังดาวที่ใกล้ที่สุด (ดูด้านบน.)
- คุณอาจได้รับคะแนนตามธงชาติประวัติศาสตร์ใด ๆ ระหว่าง 13 ถึง 50 ดาว อัลกอริทึมที่แน่นอนสำหรับคะแนนถ่วงน้ำหนักในการจัดอันดับเดียวจะโพสต์ในภายหลัง
- ในกรณีที่เสมอกันผู้ชนะจะถูกเลือกโดยจำนวน upvotes สุทธิ
- ฉันอาจจะโพสต์โปรแกรมของตัวเอง แต่จะแยกตัวเองออกจากการมีสิทธิ์ทำเครื่องหมาย