五项一起对得上吗
把这条路线算过的东西一次验完。运行下面这段程序:
def diff(old, new):
added = [l for l in new if l not in old]
removed = [l for l in old if l not in new]
return len(added), len(removed)
def bisect(ids, is_bad):
good = 0
bad = len(ids) - 1
tried = []
while bad - good > 1:
mid = (good + bad) // 2
tried.append(ids[mid])
if is_bad(ids[mid]):
bad = mid
else:
good = mid
return ids[bad], tried
def revert(hist, target):
"""造一个反向提交接在最后,原来那次一个都不动"""
return hist + [("r" + target[:6], "回滚 " + target)]
def reset(hist, target):
"""把指针挪回去,之后的提交不再可达"""
ids = [h for h, _ in hist]
return hist[:ids.index(target) + 1]
hist = [('a11c3f2', '初始化项目'), ('b22d4e0', '加上加法'),
('c33e5f8', '加上减法'), ('d44f6a1', '加上除法'),
('e55a7b2', '加上取模'), ('f66b8c3', '改进提示文案'),
('g77c9d4', '加上开方')]
blame = [('def add(a, b):', 'b22d4e0'), (' return a + b', 'b22d4e0'),
('def sub(a, b):', 'c33e5f8'), (' return a - b', 'c33e5f8'),
('def div(a, b):', 'd44f6a1'), (' return a / b', 'd44f6a1')]
old = ['def add(a, b):', ' return a + b',
'def sub(a, b):', ' return a - b']
new = ['def add(a, b):', ' return a + b',
'def sub(a, b):', ' return a - b',
'def div(a, b):', ' return a / b']
ids = [h for h, _ in hist]
bad_from = ids.index("d44f6a1")
ok = (len(hist) == 7
and [c for t, c in blame if t == " return a / b"][0] == "d44f6a1"
and diff(old, new) == (2, 0)
and bisect(ids, lambda x: ids.index(x) >= bad_from)[0] == 'd44f6a1'
and (len(revert(hist, 'd44f6a1')), len(reset(hist, 'c33e5f8')))
== (8, 3))
print(ok)
全部评论