【发布时间】:2010-11-07 03:56:41
【问题描述】:
我刚刚在UVA's 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 characters long,目前是最好的解决方案。
我想,对于这类问题,80 个字符是一个病态的限制。 cobbal,他的 46 个字符的解决方案让我非常惊讶 - 虽然我必须承认,在我部分理解他写的内容之前,我花了一些时间阅读他的解释。
【问题讨论】:
-
这应该是维基吗?
-
这是我在计划中实施的第一年任务。
-
我很高兴尝试弄清楚它是如何工作的。不过,有一个小小的观察。倒数第二行可以写成:print "%s %s" % (x, V),
-
嘿!你正在破坏玩 UVa Judge 的全部乐趣!
-
两张图片的数据点不匹配。 (但它们确实匹配它所附带的图像。)