Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby ATM现金期权(Notes)算法_Ruby - Fatal编程技术网

Ruby ATM现金期权(Notes)算法

Ruby ATM现金期权(Notes)算法,ruby,Ruby,我正在用Ruby开发一个ATM练习,其中一个功能是在请求现金价值后,系统可以显示可能的现金流选项 Ex:R$120 2x R$50 e 1x R$20 2x R$50 e 2x R$10 1x R$100 e 2x R$20 6倍R$20 12倍R$10 等等 这些票据是有限的,也就是说,如果在框中我只有10张10元的票据,那么12x$10的选项将不会出现 我在Java中找到了一个可能的算法,但我觉得它太复杂了 到目前为止,我的代码只是: main.rb # Constantes LIMI

我正在用Ruby开发一个ATM练习,其中一个功能是在请求现金价值后,系统可以显示可能的现金流选项

Ex:R$120

  • 2x R$50 e 1x R$20
  • 2x R$50 e 2x R$10
  • 1x R$100 e 2x R$20
  • 6倍R$20
  • 12倍R$10
  • 等等
这些票据是有限的,也就是说,如果在框中我只有10张10元的票据,那么12x$10的选项将不会出现

我在Java中找到了一个可能的算法,但我觉得它太复杂了

到目前为止,我的代码只是:

main.rb

# Constantes
LIMITE_SAQUE = 2000

# Variáveis
opcao = nil

saldo_atual = 5000

qtd_notas_cem = 20
qtd_notas_cinquenta = 100
qtd_notas_dez = 200
qtd_notas_vinte = 50


while opcao != 4 

# Exibe as opções do Caixa Eletrônico
puts "Qual operação você deseja?"
puts "1 - Saque"
puts "2 - Recarga de Notas"
puts "3 - Exibir Informações"
puts "4 - Sair"
puts ""

opcao = gets.to_i

case opcao
  when 1
    puts "Você escolheu a opção de Saque"
    puts "Infome o valor para saque: "
    valor = gets.to_i

    if valor <= saldo_atual && valor <= LIMITE_SAQUE
      saldo_atual = saldo_atual - valor
      puts ""
      puts "Saque efetuado no valor de R$#{valor}"
      puts "Saldo atual diponível: R$#{saldo_atual}"
      puts "" 
    elsif valor >= LIMITE_SAQUE
      puts ""
      puts "Limite de saque é superior a R$2000,00"
      puts ""
    else
      puts ""
      puts "Não existe valor dispónivel para saque."
      puts ""
    end

  when 2
    puts "Você escolheu a opção de Recarga"
    puts "Infome o valor da nota: "
    valorNota = gets.to_i

    puts "Informe agora a quantidade de notas: "
    qtdNotas = gets.to_i

  when 3
    puts "Você escolheu a opção de Informações"
  when 4
    puts "Sair..."
    %x(exit)
  else
    puts ""
    puts "!!!!!! Opçao escolhida inválida. !!!!!!"
    puts ""
  end
end
康斯坦茨 LIMITE_SAQUE=2000 #瓦里亚维斯 opcao=nil saldo_atual=5000 qtd_notas_cem=20 qtd_notas_cinquenta=100 qtd_notas_dez=200 qtd_notas_vinte=50 而opcao!=4. #作为Caixa Eletrônico的运营商退出 把“夸尔歌剧院”放在哪里 把“1-Saque” 将“2-重新召开会议” 将“3-Exibir Informações” 把“4-Sair”放在一起 放置“” opcao=get.to_i 案例opcao 当1 把“Vocêescolheu a opèo de Saque”放在一起 将“信息和勇气”放在下面: 勇气=获得
如果价值存货和优先权

首先,假设数组
avail
包含机器中存储的每个音符的编号。比如说,

avail = [[100, 3], [50, 4], [20, 8], [10, 2], [5, 4], [1, 12]] 
avail = [[50, 3], [100, 1]]
此外,我们可以将其解释为提供了分发票据的优先权。元素的顺序意味着应该分发尽可能多的100美元纸币,最多3张,然后分发尽可能多的50美元纸币,最多4张,以此类推。另一方面,如果仅在R50美元纸币数量不足的情况下才分发100美元纸币,则可以编写

avail = [[50, 4], [100, 3], [20, 8], [10, 2], [5, 4], [1, 12]] 
但是,在某些情况下,无法使用所有可用的注释。比如说,

avail = [[100, 3], [50, 4], [20, 8], [10, 2], [5, 4], [1, 12]] 
avail = [[50, 3], [100, 1]]
如果需要200美元,则只能分发2张R50美元的钞票,即使有3张可用

客户选择票据组合偏好

根据客户的选择,需要从
avail
派生阵列,我在下面称之为
avail\u mod
。以下是一些示例(都假设可以获得有效的组合)

1美元100兰特注:

3$50注:

5美元R20和2美元5纸币:

例如,最后一个数组可以从
avail
派生,如下所示

[[20, 8], [5, 2]] + avail.reject { |k,_| [20, 5].include?(k) }
  #=> [[20, 8], [5, 2], [100, 3], [50, 4], [10, 2], [1, 12]] 
由您决定向客户提供的列表中有哪些可能性,以及如何为每个选择修改
avail

为给定客户偏好计算注释组合的代码

给定所需的现金总额,
amt
,以及修改后的数组
avail\u mod
,可以使用以下方法确定要分发的每张票据的编号

def dispense(amt, avail_mod)
  (d, n), *rest = avail_mod
  if rest.empty?
    return { d=>0 } if amt.zero?
    return nil if (amt % d) > 0 || d*n < amt
    return { d=>amt/d }
  end 
  last = nil
  m = [n, amt/d].min.downto(0).find { |m| last = dispense(amt-m*d, rest) }
  m.nil? ? nil : { d=>m }.merge(last)
end
然后

更新
avail

avail.map! { |d,n| [d, n-spew_out[d]] }
  #=> [[100, 1], [50, 0], [20, 2], [10, 1], [5, 4], [1, 9]]

你会希望这是在英语中得到有用的回应,否则你会在一个特定语言的网站上有更好的运气。请参阅:首先,不要创建大量不相关的变量。编程主要是操作数据结构。例如,
quantity={1=>20,5=>100,10=>200,20=>50}
仅用数字和数字来定义事物。另一件你想做的事是正确且一致地缩进。这有助于传达结构和意图,这两件重要的事情有助于我们帮助您使用代码。从算法上讲,您希望采用该
数量
结构,并从所需总数中扣除最大可能的金额,然后重复。所以100可能是5x20。如果你用完了20秒,就换成10秒,以此类推。如果你用完了,什么也不退。您可以使用给定的相同结构返回,例如100变为
{20=>5}
或者
{20=>4,10=>2}
,如果运行速度很低。如果您发现自己经常使用该结构,则将其包装到一个类中,以便在其上构建方便的方法。“那是红宝石的方式。”塔德曼,我想你误解了这个问题(就像我第一次读它时一样)。OP希望为客户提供一系列选择,以满足他们的资金需求。例如,他们可能不想要任何100美元的纸币,或者10美元10美元的纸币,等等。请参阅我的答案以进行更全面的讨论。
avail =     [[100, 3], [50, 4], [20, 8], [10, 2], [5, 4], [1, 12]] 
avail_mod = [[100, 2], [50, 4], [20, 8], [10, 2], [5, 4], [1, 12]
spew_out = dispense(533, avail_mod)
  #=> {100=>2, 50=>4, 20=>6, 10=>1, 5=>0, 1=>3}  
spew_out.sum { |k,v| k*v }  
  #=> 533

dispense(300, avail_mod)
  #=> {100=>2, 50=>2, 20=>0, 10=>0, 5=>0, 1=>0} 

dispense(0, avail_mod)
  #=> {100=>0, 50=>0, 20=>0, 10=>0, 5=>0, 1=>0}

dispense(827, avail_mod)
  #=> nil

dispense(200, [[50,3], [100, 3]])
  #=> {50=>2, 100=>1}
avail.map! { |d,n| [d, n-spew_out[d]] }
  #=> [[100, 1], [50, 0], [20, 2], [10, 1], [5, 4], [1, 9]]