Ruby 借着《浴缸里的惊叹:256 道让你恍然大悟的趣题》里面的、适合在浴缸里想的一道忽悠题:就让 Ruby 来小试牛刀做个论证吧。

zzz6519003 · 2023年10月06日 · 272 次阅读
作者:2gua
链接:https://zhuanlan.zhihu.com/p/19848204
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

# encoding: utf-8

# 每个人钱袋子里的收支情况,初始化都从零开始。
wallet = {:boniface => 0, :guest1 => 0, :guest2 => 0, :guest3 => 0, :staff => 0}

# processing_step:处理步骤
# wallet         :钱包
# m              :金额数组
# step           :处理步骤标识
def processing_step(wallet, m, step)
    case step
    when 1  # 第一步,老板说房费一共30元,所以每人交了10元钱。
        wallet.each do |key, value|
            if key.match(/^guest/)
                wallet[key] += -m[0]
                wallet[:boniface] += m[0]
            end
        end
    when 2  # 第二步,老板发现房费是25,让服务员给客人送回5元。服务员自己藏了2,退给每位客人1。
        wallet.each do |key, value|
            if key.match(/^guest/)
                wallet[key] += m[0]
                wallet[:boniface] += -m[0]
            end
            if key.match(/^staff/)
                wallet[key] += m[1]
                wallet[:boniface] += -m[1]
            end
        end
    when 3  # 根据前一步骤结果,求证是否真是少了1元?负数的为客人支出,正数为店家及店小二收入。
        wallet.each do |key, value|
            if value >= 0
                m[0] += value
            else
                m[1]  += value
            end
        end
    else
    end
end

# 数组为每位客人支出10。
processing_step(wallet, [10], 1)
puts "第一步骤结束,收支明细:" + wallet.to_s

# 数组为还给每位客人1,店小二自得2。
processing_step(wallet, [1, 2], 2)
puts "\n第二步骤结束,收支明细:" + wallet.to_s

# 第一个数组值为店家和店小二收入,第二个数组值为客人支出。
account = [0, 0]
processing_step(wallet, account, 3)
puts "\n店家及店小二收入:" + account[0].to_s
puts "三位客人支出(负值表示):" + account[1].to_s

第一步骤结束,收支明细:{:boniface=>30, :guest1=>-10, :guest2=>-10, :guest3=>-10, :staff=>0}

第二步骤结束,收支明细:{:boniface=>25, :guest1=>-9, :guest2=>-9, :guest3=>-9, :staff=>2}

店家及店小二收入:27 三位客人支出(负值表示):-27 [Finished in 0.3s] 收支都是 27 元,收支平衡。29 也罢、30 也罢,都是忽悠人的啊。

作者:2gua 链接:https://zhuanlan.zhihu.com/p/19848204 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号