Я только что наткнулся на эту небольшую проблему на UVA Online Judge и подумал, что это может быть хорошим кандидатом на небольшое кодовое гольф.
Проблема:
Вы должны разработать программу, помогающую архитектору рисовать горизонт города с учетом местоположения зданий в городе. Чтобы сделать проблему приемлемой, все здания имеют прямоугольную форму и имеют общую дно (город, в котором они построены, очень плоский). Город также рассматривается как двумерный. Строение задается упорядоченной тройкой (Li, Hi, Ri), где Li и Ri - это левая и правая координаты здания я и 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) vi, так что я четное число представляет горизонтальную линию (высоту). 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-символьным решением меня поразило, хотя я должен признать, что я некоторое время читал его объяснение, прежде чем я частично понял, что он написал.