アメリカ合衆国の旗には、カントンに50の州を表す50の星が含まれています。
過去には、州の数が少なかったとき、もちろん星の数も少なく、それらの配置も異なっていました。たとえば、1912-1959年(ニューメキシコとアリゾナの入国後、アラスカの前)からは、6×8の長方形に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)
プログラムは、3つのコマンドライン引数を取ります(プログラム名自体はカウントしません):
- カントンに入れる星の数。
- カントンの幅。(浮動小数点値を受け入れなければなりません。)
- カントンの高さ。(浮動小数点値を受け入れなければなりません。)
(お好みのプログラミング言語がコマンドライン引数をサポートしていない場合、合理的に同等のことを行い、それを回答に文書化します。)
出力は、1行に1つずつ、カンマ区切りの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)です。回答がなかったため、期限は延長されました。未定。- 答えに含めてください:
- プログラムのコード
- 仕組みの説明
- コマンドライン引数を使用した出力
50 1.4 1.0
- プログラムは妥当な時間内に実行する必要があります:典型的なPCで最大5分。私はこれについて非常に厳密ではありませんが、時間がかかる場合はプログラムを失格にします。
- プログラムは決定的である必要があります。つまり、同じ引数に対して常にまったく同じ出力を与える必要があります。したがって、
time()
またはに依存しないでくださいrand()
。モンテカルロ法は、独自のPRNGを実行する限り問題ありません。 - 重要なのは星の中心点だけです。重複などを避けようとする心配はありません。
得点
- 州内の地点から最も近い星までの平均距離を最小化します。(上記を参照。)
- 星の数が13から50の歴史的な米国旗に基づいて得点される場合があります。スコアを単一のランキングに重み付けするための正確なアルゴリズムは、後で投稿されます。
- 同点の場合、勝者は正味の投票数によって選択されます。
- 私はおそらく自分のプログラムを投稿しますが、チェックマークの対象から自分を除外します。