私はUVA のオンライン ジャッジでこの小さな問題に出くわし、小さなコード ゴルフの良い候補になるかもしれないと考えました。
問題:
あなたは、建築家が都市の建物の位置を考慮して都市のスカイラインを描くのを支援するプログラムを設計することになっています。問題を扱いやすくするために、すべての建物は長方形で、共通の底を共有しています (建物が建てられている都市は非常に平らです)。都市も二次元として見られます。建物は順序付けられたトリプル(Li、Hi、Ri)によって指定されます。ここで、LiとRiはそれぞれ建物 i の左座標と右座標であり、Hiは建物の高さです。
下の図では、建物は左側にトリプルで示されています
(1,11,5), (2,6,7), (3,13,9), (12,7,16), (14,3,25), (19,18,22), (23,13,29), (24,4,28)
右側に示されているスカイラインは、次のシーケンスで表されます。
1, 11, 3, 13, 9, 0, 12, 7, 16, 3, 19, 18, 22, 3, 23, 13, 29, 0
出力は、上記の例に示すように、スカイラインを表すベクトルで構成されている必要があります。スカイラインベクトル(v1, v2, v3, ... vn)において、i が偶数のviは水平線 (高さ) を表します。iが奇数のviは縦線(x座標)を表す。スカイライン ベクトルは、たとえばバグが最小の x 座標から開始し、スカイラインを定義するすべての線を水平および垂直に移動する「パス」を表す必要があります。したがって、スカイライン ベクトルの最後のエントリは 0 になります。座標は空白で区切る必要があります。
提供された (テスト) 建物の宣言をカウントせず、すべてのスペースとタブ文字を含めない場合、Python での私の解決策は223文字です。
要約版は次のとおりです。
B=[[1,11,5],[2,6,7],[3,13,9],[12,7,16],[14,3,25],[19,18,22],[23,13,29],[24,4,28]]
# Solution.
R=range
v=[0 for e in R(max([y[2] for y in B])+1)]
for b in B:
for x in R(b[0], b[2]):
if b[1]>v[x]:
v[x]=b[1]
p=1
k=0
for x in R(len(v)):
V=v[x]
if p and V==0:
continue
elif V!=k:
p=0
print "%s %s" % (str(x), str(V)),
k=V
私は間違いを犯していないと思いますが、もしそうなら、遠慮なく私を批判してください。
私はあまり評判が良くないので、報奨金には 100 しか払いません - 誰かがこれを 80 文字以内で解決できるかどうか知りたいです。cobbalによって投稿されたソリューションは101 文字の長さで、現在はそれが最適です。
この種の問題では、80文字は病気の限界だと思いました。cobbalの 46 文字の解決策には完全に驚かされました。認めざるを得ませんが、彼が書いた内容を部分的に理解する前に、彼の説明を読むのに時間がかかりました。