ruby:通过货币变化动态制作哈希

时间:2017-12-20 04:40:36

标签: ruby

告诉我们如何换取这笔钱。一些例子:

> chafor(25)
{qa: 1}

> chanfor(41)
{qua: 1, dim: 1, nick: 1, pen: 1}

我试过

def chanfor(n)
  while n!= 1
     if n/25
       { q: 1}
  ...
end

1 个答案:

答案 0 :(得分:2)

让我们以Ruby的方式做到这一点。我们将避免for / next / while循环,而是我们创建一个起始Hash并对其进行迭代以生成结果Hash:

class Change
  COIN_VALUES = {quarter: 25, dime: 10, nickel: 5, penny: 1}

  def self.change_for(cents)
    pairs = COIN_VALUES.map do |coin, value|
      number_of_coins = cents / value
      cents = cents % value
      [coin, number_of_coins]
    end
    pairs.to_h
  end
end

>> Change.change_for(44)
#> {:quarter=>1, :dime=>1, :nickel=>1, :penny=>4}
>> Change.change_for(116)
#> {:quarter=>4, :dime=>1, :nickel=>1, :penny=>1}
>> Change.change_for(77)
#> {:quarter=>3, :dime=>0, :nickel=>0, :penny=>2}

让我们一步一步地走过逻辑:

首先,我们定义一个常量,如变量名称(COIN_VALUES)所示。

接下来,我们将使用Enumerable#map迭代该常量。这将允许我们分别处理每个键/值对,对它们执行操作,并从这些操作返回一个数组。

cents变量存储剩余分数。我们使用整数除法来获得表示当前硬币的硬币数量的最高整数,然后取模数来确定执行该操作后剩余多少美分。

当我们完成时,我们有一个包含两个元素阵列的数组,我们存储在pairs中。如果cents为44,则显示如下:

[[:quarter, 1], [:dime, 1], [:nickel, 1], [:penny, 4]]

返回pairs.to_h后,我们将pairs转换为哈希:

{quarter: 1, dime: 1, nickel: 1, penny: 4}