Ruby中的小脚本循环问题

Ruby中的小脚本循环问题,ruby,Ruby,我正在做一个Ruby练习,但没有得到我想要的输出 问题开始于我的算法的第2步,我想。while循环的计数器让我有点困惑,我不知道如何结束while循环。但除此之外,我认为代码基本上还可以 编写一个程序,该程序将查找1000到3000之间的所有这些数字(均包括在内),使数字的每个数字都是偶数 获得的数字应以逗号分隔的顺序打印在一行上 我想实施: 迭代整个范围(1000..3000),识别所有even,并将它们存储到名为array\u evens的单独数组中 迭代数组\u evens并将每个偶数分成

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

问题开始于我的算法的第2步,我想。while循环的计数器让我有点困惑,我不知道如何结束while循环。但除此之外,我认为代码基本上还可以

编写一个程序,该程序将查找1000到3000之间的所有这些数字(均包括在内),使数字的每个数字都是偶数

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

我想实施:

  • 迭代整个范围(
    1000..3000
    ),识别所有even,并将它们存储到名为
    array\u evens
    的单独数组中
  • 迭代
    数组\u evens
    并将每个偶数分成单独的数字
  • 使用
    偶数?
    对所有这些数字进行迭代,确定每个数字是偶数还是假
  • 如果该数字为偶数,则将其推送到名为
    all\u evens\u 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
    
    范围=(1000..3000)
    array\u偶数=array.new()
    偶数数字数=[]
    n=0#计数器变量
    所有的孩子=[]
    偶数或奇数=零
    range.select do | x|
    如果x是偶数?
    数组_偶数=数组_偶数。推送(x)
    while(n)对还是错
    如果偶数或奇数==真
    all\u evens\u baby=偶数数字\u数字。推送(数组\u偶数[n])
    其他的
    结束
    结束
    n+=1
    结束
    结束
    结束
    
    这应该可以完成以下工作:

    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 
    

    这应该可以做到:

    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 
    

    首先,尝试让当前代码正常工作——离目标不远:

    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(",")   
    

    首先,尝试让当前代码正常工作——离目标不远:

    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(",")   
    

    这是一行中的解决方案

    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?}
    

    这是一行中的解决方案

    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?}
    

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