我刚刚在UVA 的 Online Judge上遇到了这个小问题,并认为它可能是一个小代码高尔夫的好候选人。
问题:
你要设计一个程序来帮助建筑师在给定城市建筑物位置的情况下绘制城市的天际线。为了使问题易于处理,所有建筑物都是矩形的,并且它们共享一个共同的底部(它们所在的城市非常平坦)。这座城市也被视为二维的。建筑物由有序三元组(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 个字符的解决方案让我非常惊讶——尽管我必须承认,在我部分理解他所写的内容之前,我花了一些时间阅读他的解释。