【问题标题】:How do I loop through a set of numbers, do some addition and append to an array?如何遍历一组数字,进行一些加法并附加到数组?
【发布时间】:2011-12-13 01:46:50
【问题描述】:

我的目标是创建一个数组,其中包含一组骰子上 2 个数字的每个组合的总和。我正在创建一个循环的开头,将die1[0] 添加到die2[0..5],然后再通过die1[1] + die2[0..5] 等等。

我在下面有这段代码,但我做错了。我希望能够调用数组中的特定号码,例如dieSums[4],并得到一个号码。知道我在这里做错了什么吗?

die1 = [1,2,3,4,5,6] 
die2 = [1,2,3,4,5,6]

dieSums = []

count = 0
while count <= 5 do   
  dieSums << die1[0] + die2[count]   
  count += 1   
  puts dieSums[5]    
end

【问题讨论】:

    标签: ruby arrays loops while-loop append


    【解决方案1】:

    您正在循环内调用puts dieSums[5]dieSums[5] 直到最后一次迭代才会存在。如果您在循环外调用它,它将起作用:

    die1 = [1,2,3,4,5,6] 
    die2 = [1,2,3,4,5,6]
    
    dieSums = []
    
    count = 0
    while count <= 5 do   
      dieSums << die1[0] + die2[count]   
      count += 1
    end
    
    puts dieSums[5] #=> 7
    

    【讨论】:

      【解决方案2】:

      while 循环,正如您所写的那样,不是非常 Rubyonic。 (Rubinic?)一种更惯用的迭代数组元素的方法:

      #!/usr/bin/ruby
      
      die1 = [1,2,3,4,5,6]
      die2 = [1,2,3,4,5,6]
      
      dieSums = []
      
      die1.each do |d1|
          die2.each do |d2|
              dieSums << d1 + d2
          end
      end
      puts dieSums[5]
      

      当然,die1die2 在这种情况下是相同的,因此您可以将 die2 替换为 die1 并且一切都会解决。

      【讨论】:

      • 我是菜鸟。我还没到那里,但感谢您提供有关如何编写干净的 ruby​​ 的见解!
      • 缩进 4 个空格(或制表符?)也不是很红宝石风格;)
      • @d11wtq,呵呵,没错,但我不能忍受两个空格缩进:嵌套的差异太微妙了。当我在处理已经有两个空格的项目时,我坚持使用两个空格,但我一直在抱怨。
      【解决方案3】:

      附带说明:请注意您将问题过度复杂化(因为您以命令式的方式思考,请查看Functional programming)。两个骰子所有可能值的总和:

      >> die = [1,2,3,4,5,6]
      >> die.product(die).map { |v1, v2| v1 + v2 }
      => [2, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 11, 7, 8, 9, 10, 11, 12]
      
      • 如果您不想重复值,请在最后调用uniq
      • 如果您不关心订单,请使用repeated_combination(2) 而不是product
      • 注意die.product(die) = die.repeated_permutation(2))

      求 N 个骰子的所有和几乎一样简单:

      >> die.repeated_permutation(5).map { |values| values.inject(:+) }
      

      【讨论】:

      • 我一直在寻找一种在 Ruby 中进行列表推导的机制,但认为大多数机制看起来很糟糕。鉴于 Ruby 不支持更简单的列表推导式, 几乎是最佳的。
      猜你喜欢
      • 2017-04-23
      • 1970-01-01
      • 2018-04-07
      • 2013-07-13
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      相关资源
      最近更新 更多