Итак, мой друг сегодня утром прислал мне головоломку:
Найдите количество различных времен суток (используя 24-часовой формат и предполагая, что утренние часы представлены как 8:15, а не 08:15), где количество сегментов равно сумме цифр. Например. 8:15 имеет 7+2+5=14 сегментов в электронном формате, а сумма цифр равна 8+1+5=14, так что это квалифицируется как случай.
Поэтому я придумал следующее простое (но заторможенное) решение на С# 3.0:
// Number of segments in each digit
var digitMap =
new Dictionary<char, int>
{
{'0',6},{'1',2},{'2',5},{'3',5},{'4',4},
{'5',5},{'6',5},{'7',3},{'8',7},{'9',5}
};
var numMatches = (
from h in Enumerable.Range(0,24)
from m in Enumerable.Range(0,60)
select h.ToString() + m.ToString().PadLeft(2,'0') into t
let chars = t.ToCharArray()
where chars.Sum(c => int.Parse(c.ToString())) == chars.Sum(c => digitMap[c])
select t).Count();
Однако он добавил оговорку:
Подход грубой силы не допускается.
Я думал об этом некоторое время, и я изо всех сил пытаюсь придумать более умный алгоритм. Я шел по пути предварительной фильтрации невозможностей (например, случаев, когда сумма цифр меньше 6, поскольку это минимальная сумма сегмента), но в конце концов я полагаю, что это приведет только к меньшему пространству решений, который затем грубо принудительно.
В любом случае, я думаю, что это достаточно интересная проблема, чтобы бросить ее и посмотреть, сможет ли кто-нибудь придумать более умный метод.