【面试题】七行代码解决酒店老板用瓶子盖子换酒问题

问题:
酒馆做活动,1块钱喝一瓶啤酒,2个空瓶可以兑换一瓶啤酒,
4个瓶盖可以兑换一瓶啤酒。如果有15块钱,最多可以喝多少瓶啤酒?
写个程序来计算,输入n元钱,输出可以喝多少瓶酒的数量(不允许借用)

解题思路:
模拟过程一步一来,代码如下

# had = {
#     "瓶子": 0,
#     "盖子": 0
# }


#
# def have(monry):
#     # 手里有多少钱就等于你喝了多少酒且拥有相同数量的瓶子和盖子(n是你喝的酒
#     had["瓶子"] = monry
#     had["盖子"] = monry
#     n = monry
#     print("此时我花了{}钱,买了{}瓶酒,我现在有{}个瓶子,{}个盖子".format(monry, monry, monry, monry))
#     while True:
#         if had["瓶子"] >= 2:
#             a = had["瓶子"] // 2
#             print("我现在有{}个瓶子,{}个盖子。  老板我先给你{}个瓶子,你给我{}瓶酒把".format(had["瓶子"], had["盖子"], 2 * a, a))
#             had["瓶子"] = had["瓶子"] - 2 * a
#             had["瓶子"] = had["瓶子"] + a
#             had["盖子"] = had["盖子"] + a
#             n += a
#             print(">>>资产: {}个瓶子,{}个盖子,一共喝了{}酒\n".format(had["瓶子"], had["盖子"], n))
#         if had["盖子"] >= 4:
#             b = had["盖子"] // 4
#             print("我现在有{}个瓶子,{}个盖子。  老板我先给你{}个盖子,你给我{}瓶酒把".format(had["瓶子"], had["盖子"], 4 * b, b))
#             had["盖子"] = had["盖子"] - 4 * b
#             had["瓶子"] = had["瓶子"] + b
#             had["盖子"] = had["盖子"] + b
#             n += b
#             print(">>>资产: {}个瓶子,{}个盖子,一共喝了{}酒\n".format(had["瓶子"], had["盖子"], n))
#         if had["瓶子"] < 2 and had["盖子"] < 4:
#             print(n)
#             break
#
#
# have(15)

明白过程后,代码优化如下

def hadn(m):
    had, n = {"瓶子": m, "盖子": m}, m
    while had["瓶子"] >= 2 or had["盖子"] >= 4:
        a, b = had["瓶子"] // 2, had["盖子"] // 4
        had["瓶子"], had["盖子"], n = had["瓶子"] - a + b, had["盖子"] + a - 3 * b, n + a + b
    else:
        print(n)

你还能比我的代码更少吗?