Я в замешательстве из-за всей этой грубой силы. Разве грубое принуждение не просматривает весь список и не выбирает правильный ответ? Как нам тогда производить только ответы, дающие желаемый результат, без перебора всего временного списка? Или грубое принуждение означает здесь сравнение суммы между цифрами и сегментами?
В любом случае, вот решение с использованием python (новичка в этом) и алгоритмов, упомянутых выше.
def sum_offset(time):
#( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
segment_offset = (+6, +1, +3, +2, +0, +0, -1, -4, -1, -4)
total = 0
for digit in time:
total += segment_offset[int(digit)]
return total
alltime = ['%d%02d' %(h, m)
for h in range(0,24)
for m in range(60)]
#result_totals = map(sum_offset, alltime)
filtered = [t for t in alltime if sum_offset(t)==0]
print filtered
88 результатов
['127', '129', '146', '148', '156', '158', '217', '219', '337', '339', '416', '418', '444', '445', '454', '455', '516', '518', '544', '545', '554', '555', '614', '615', '636', '638', '641', '651', '712', '721', '733', '814', '815', '836', '838', '841', '851', '912', '921', '933', '1137', '1139', '1247', '1249', '1257', '1259', '1317', '1319', '1427', '1429', '1446', '1448', '1456', '1458', '1527', '1529', '1546', '1548', '1556', '1558', '1616', '1618', '1644', '1645', '1654', '1655', '1713', '1724', '1725', '1731', '1742', '1752', '1816', '1818', '1844', '1845', '1854', '1855', '1913', '1924', '1925', '1931', '1942', '1952', '2147', '2149', '2157', '2159']
Оптимизация, предложенная Joy, кажется, добавляет гораздо больше сложности в код, поэтому его трудно понять, но вот моя попытка сделать это.
def sum_offset_optimized(time):
#( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
segment_offset = (+6, +1, +3, +2, +0, +0, -1, -4, -1, -4)
if len(time) < 3:
return -1 #or raise the appropriate error
total = segment_offset[int(time[-1])] + segment_offset[int(time[-2])]
#optimization as suggested by Joy Dutta
if (-4 < total < 9):
pass
else:
total += segment_offset[int(time[-3])]
if len(time) == 4: #check for length else we will have an out of bound error
total += segment_offset[int(time[-4])]
return total
### testing performance
def method_simple():
filtered = [t for t in alltime if sum_offset(t)==0]
def method_optimized():
filtered = [t for t in alltime if sum_offset_optimized(t)==0]
import timeit
timer_simple = timeit.Timer('sum_digit_segments.method_simple()','import sum_digit_segments')
timer_optimized = timeit.Timer('sum_digit_segments.method_optimized()','import sum_digit_segments')
#timer_simple.timeit()
#timer_optimized.timeit()
print 'simple:', timer_simple.repeat(1,1000) #[12.469249024666542]
print 'optimized:', timer_optimized.repeat(1,1000) #[7.4063790230322546]
#The optimized version is significantly faster