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

问题:
酒馆做活动,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)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄年阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值