我对暴力破解这件事很困惑。难道暴力破解不是指遍历整个列表并选择正确的答案吗?那么我们如何只产生符合要求的结果,而不需要遍历整个时间列表呢?或者这里的暴力破解是指在数字和段之间进行比较的总和吗?
无论如何,这里提供了一种使用Python(初学者)和上述算法的解决方案。
def sum_offset(time):
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)]
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):
segment_offset = (+6, +1, +3, +2, +0, +0, -1, -4, -1, -4)
if len(time) < 3:
return -1
total = segment_offset[int(time[-1])] + segment_offset[int(time[-2])]
if (-4 < total < 9):
pass
else:
total += segment_offset[int(time[-3])]
if len(time) == 4:
total += segment_offset[int(time[-4])]
return total
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')
print 'simple:', timer_simple.repeat(1,1000)
print 'optimized:', timer_optimized.repeat(1,1000)