五项一起对得上吗

👁️ 3 人浏览 💬 0 人评论 ❤️ 添加收藏

把这条路线算过的东西一次验完。运行下面这段程序:

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)
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论