【问题标题】:Looping trouble in Ruby for small scriptRuby 中的小脚本循环问题
【发布时间】:2017-02-01 16:07:48
【问题描述】:

我正在做一个 Ruby 练习,但没有得到我想要的输出。

我认为这个问题从我的算法的第 2 步开始。while 循环的计数器让我有点困惑,我不确定如何结束 while 循环。但除此之外,我认为代码大部分都可以。

编写一个程序,它将找出 1000 到 3000 之间的所有此类数字(都包括在内),使得该数字的每个数字都是偶数。

获得的数字应该以逗号分隔的顺序打印在一行上。

我要实现:

  1. 遍历整个范围 (1000..3000) 并识别所有偶数,并将它们存储到名为 array_evens 的单独数组中。
  2. 遍历array_evens 并将每个偶数分成不同的数字。
  3. 遍历所有这些数字,并使用even? 确定每个数字是偶数还是假。
  4. 如果该数字是偶数,则将其推送到名为all_evens_baby 的数组中

这是我的代码:

range = (1000..3000)
array_even = Array.new()
even_digits_number = []
n = 0 #counter variable
all_evens_baby = []
even_or_odd = nil


range.select do |x|
  if x.even?
    array_even = array_even.push(x)

    while (n <= array_even.length)
      #The placement of this while loop may be wrong.
      #iterate over all evens to divide all numbers into singular digits

      current_divided_number = array_even[n].to_s.chars
      current_divided_number.map do |x|
        #iterate over all digits to determine if even or odd

        even_or_odd = x.to_i.even? #=> true or false

        if even_or_odd == true
          all_evens_baby = even_digits_number.push(array_even[n])
        else
        end
      end
      n+=1
    end
  end
end

【问题讨论】:

  • 您使用的是哪个 ruby​​ 版本?
  • 我使用的是 2.4 版

标签: ruby


【解决方案1】:

首先尝试让当前代码工作 - 不远了:

range = (1000..3000)
array_even = Array.new()
all_evens_baby = []

range.each do |x|
  if x.even?
    array_even.push(x)
  end
end # you'r done here, step 1 is finished.
    # shorter is:  array_even = range.select(&:even?)

array_even.select do |x|
  current_divided_number = x.to_s.chars
  n = 0 #counter variable
  current_divided_number.each do |d|
    n=n+1 if d.to_i.even?
  end
  all_evens_baby << x if n == 4
end

puts all_evens_baby.join(",")   

第一步是不必要的,第 2/3 步无论如何都会过滤掉赔率。 Ruby 2.4 有一个很好的方法来获取整数的数字,称为digits,因此可以避免转换为字符串。

看看:

all_evens_baby = (1000..3000).select do |num|
  num.digits.all? do |d|
    d.even?
  end  #if this is true, num will be in all_evens_baby
end
puts all_evens_baby.join(",")

【讨论】:

    【解决方案2】:

    这应该可以完成工作:

    range = (1000..3000)
    # Return all values from range where the block evaluates to true and put them into a list called result
    result = range.select do |number|
      # convert the number to a string and convert every character back to a number (digits) then check if all digits are even
      number.to_s.chars.map(&:to_i).all? { |n| n.even? }
    end
    # create a string from the number where elements are spearated by a ','
    puts result.join(',')
    

    解释:

    result = range.select 
    returns the value 
    

    【讨论】:

      【解决方案3】:

      这是您的一站式解决方案

      all_evens_baby=(1000..3000).select {|a| a.even?}.map {|i| i.to_s.chars}.flatten.map {|i| i.to_i}.select {|i| i.even?}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2020-02-17
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        相关资源
        最近更新 更多