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

zzz6519003 · 2023年10月06日 · 295 次阅读
作者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 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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