아메리카 합중국의 국기에는 주에 50 개의 주를 나타내는 50 개의 별이 있습니다.
과거에는 더 적은 주가 있었을 때, 물론 더 적은 별이 있었으며, 다르게 배열되었습니다. 예를 들어 1912 년에서 1959 년 (뉴 멕시코 및 애리조나의 입국 후 알래스카 이전에)에는 6x8 직사각형 배열에 48 개의 별이있었습니다.
1867-1877 년 (네브라스카 입국 후, 콜로라도 전)에 사용 된 37 성 깃발은 비대칭적인 별 모양을 가졌다.
이 경우 51 상태가 향후에 추가되어, 장학의 육군 연구소는 이미 새로운 국기에 대한 예비 설계를 개발했다.
그러나 별을 배열하는 일반적인 알고리즘은 없으므로 별을 만들어 봅시다!
도전
주어진 수의 별이 미국 국기의 주 (파란색 부분)에 배치되도록 해당 별을 배치 할 최적의 좌표를 출력하는 프로그램을 작성하십시오. 좌표계는 0≤x≤W 및 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
추가 규칙 및 참고 사항
- 본인은 언제든지 규칙의 허점을 닫을 권리가 있습니다.
답변 마감일은 7 월 4 일 금요일 24:00 CDT (UTC-05 : 00)입니다.답변이 부족하여 마감일이 연장되었습니다. TBA.- 답변에 포함하십시오 :
- 프로그램 코드
- 작동 방식에 대한 설명
- 명령 행 인수를 사용한 출력
50 1.4 1.0
- 프로그램은 적당한 시간 내에 실행되어야합니다 : 일반적인 PC에서 최대 5 분. 나는 이것에 대해 매우 엄격하지는 않지만 몇 시간 이 걸리면 프로그램을 실격시킬 것 입니다.
- 프로그램은 결정 론적이어야합니다. 즉, 동일한 인수에 대해 항상 동일한 결과를 제공해야합니다. 따라서
time()
또는에 의존하지 마십시오rand()
. 몬테 카를로 방법은 자신의 PRNG를 굴리는 한 괜찮습니다. - 별의 중심점 만 중요합니다. 겹침이나 그와 비슷한 것을 피하려고 걱정하지 마십시오.
채점
- 광저우의 한 지점에서 가장 가까운 별까지의 평균 거리를 최소화하십시오. (위 참조.)
- 13 ~ 50 개의 별 사이에서 역사적인 미국 국기를 기준으로 점수를 매길 수 있습니다. 점수를 단일 순위로 가중시키는 정확한 알고리즘은 나중에 게시됩니다.
- 동점 인 경우, 순 공감 수에 따라 우승자가 선정됩니다.
- 본인의 프로그램을 게시 할 수도 있지만 확인 표시 대상에서 제외됩니다.