【问题标题】:Solving foobar in Ruby?在 Ruby 中解决 foobar?
【发布时间】:2015-10-04 01:21:03
【问题描述】:

到目前为止,我已经能够正确打印数字,但我不知道如何循环它们。

puts "Please enter a number"
val1 = gets.to_i
val2 = val1 % 3
val3 = val1 % 5


def ordinal(a,b,c)
    if b == 0 && c == 0
        return "foobar"
    elsif    b == 0
        return "foo"
    elsif c == 0
       return "bar"
    else
        return a
    end
end

val5 = ordinal(val1,val2,val3)
puts "#{val5}"

我还制作了一个有效的循环,但它无法识别字符串。

n = 0
x = gets.to_i
while n != x
  puts "#{n}"
  n = n + 1
end

如何组合我的方法和循环?或者有没有其他方法可以解决这个问题?但我更喜欢你用我的代码解决它,如果它有任何好处,这样我就能更好地理解它。

【问题讨论】:

  • 我已经能够像这样正确地得到答案,但它是不完整的,直到我可以将它放入一个循环中,以便相应地打印用户输入的位数:puts“请输入一个number" val1 = gets.to_i val2 = val1 % 3 val3 = val1 % 5 def ordinal(a,b,c) if b == 0 && c == 0 return "foobar" elsif b == 0 return "foo" elsif c == 0 return "bar" else return a end end val5 = ordinal(val1,val2,val3) puts "#{val5}"
  • 你的代码是什么样的?我们不会为你做作业。
  • puts "请输入一个数字" val1 = gets.to_i val2 = val1 % 3 val3 = val1 % 5 def ordinal(a,b,c) if b == 0 && c == 0 return "foobar" elsif b == 0 return "foo" elsif c == 0 return "bar" else return a end end val5 = ordinal(val1,val2,val3) puts "#{val5}"
  • 所以你想让我们帮你做作业吗?这不好。我们是一个社区,而不是一个众包外包网站......话虽如此,请查看Integer#times,这对于def foo_bar(n); n.times {|i| out = i.to_s; out = "Something" if condition; ... print " #{out}" }; end; 的解决方案可能很有用
  • 提出好问题的提示:在第一次编辑中添加您的代码,不要要求完整的解决方案,不要在问题或 cmets 中乞求(PLZ 帮助我),并且避免txtspk 如果可以的话。总的来说,在 Stack Overflow 上,人们将提供的帮助与他们在问题中看到的努力成正比。

标签: ruby math testing functional-programming division


【解决方案1】:

与您的 cmets 一样,使用 Integer#times 时循环部分很容易。

这就是你所拥有的适合你的东西:

puts "Please enter a number"
val1 = gets.to_i
val2 = val1 % 3
val3 = val1 % 5
def ordinal(a,b,c)
    if b == 0 && c == 0
      return "footer"
    elsif b == 0
      return "foo"
    elsif c == 0
      return "bar"
    else
      return a
    end
end
val5 = ordinal(val1,val2,val3)
puts "#{val5}"

现在您只是在计算最后一个数字。尝试使用Integer#times 运行循环直到数字...:

puts "Please enter a number"
num = gets.to_i
num.times do |a|
    a += 1 # counting is done from 0 to n-1
    b = a % 3
    c = a % 5
    if b == 0 && c == 0
      print "foobar "
    elsif b == 0
      print "foo "
    elsif c == 0
      print "bar "
    else
      print "#{a} "
    end
end
print "\n"

就我个人而言,我可能会写这个有点不同,但我想这已经足够了。

我可能会写一些乱七八糟的东西,因为我讨厌冗长的 if...else 语句...:

def foo_bar n
   n.times {|i| i+=1; print( (i%15==0 && "FooBar ") || (i%3==0 && "Foo ") || (i%5 ==0 && "Bar ") || ("#{i} ") ) }
   print "\n"
end
puts "Enter number:"
foo_bar gets.to_i

【讨论】:

  • 非常感谢您的回复。我使用了您响应的第一个块代码,它运行良好。但是我只是想知道,为什么当我们使用“puts”和“return”时,代码不起作用?他们之间的区别不是很小吗?主要是 print 不会像 puts 那样在底部创建额外的行,并且 return 根本不会在屏幕上显示任何内容,所以它不应该在我们使用的循环/方法中工作吗?但它不起作用。对此有点困惑。
  • 使用puts 会在代码中添加额外的新行。但是,return 的使用实际上退出了方法和循环,设置了方法的响应。您可以在 RubyMonk's 精彩的学习网站上了解更多关于 return 关键字的信息。
  • 非常感谢您的帮助!
【解决方案2】:

你也可以这样做:

def foobar n
   n.times do |i|
      i += 1
      num = ""
      num << "Foo" if i % 3 == 0
      num << "Bar" if i % 5 == 0
      num = i.to_s if num == ""
      puts num
   end
end
foobar 15

逻辑比Myst的简单。
您无需测试它是否为 15 倍。
输出:

1  
2  
Foo  
4  
Bar  
Foo  
7  
8  
Foo  
Bar  
11  
Foo  
13  
14  
FooBar  
=> 15

【讨论】:

  • 这是对字符串的创造性使用,虽然我看不出逻辑有多简单。你还有三个if 语句,只有一个是检查字符串而不是数字...
  • 好吧,如果它还必须能被 2、7 和 9 整除呢?您必须手动检查除以 6、10、14、15、18 等。显示“FooBar”的除以 15 清楚地表明,如果一个数字可以被 2 个不同的数字整除,那么它应该显示当它可以被每个数字整除时显示的两个字符串。我为满足的每个条件添加字符串的概念确实简化了算法,并且如果由于要检查的条件更少而需要满足更多条件,它会运行得更快。
  • 你已经超越了自己......但你是对的。任何更多的条件,我会实现一个字典。 def foo_bar(n) ;dic = [[3, "Foo"], [5,"Bar"], [15, "FooBar"], [9, "^Foo"] ]; n.times {|i| i+=1; s = i.to_s; dic.each {|j| s = j[1] if i%j[0] == 0}; print "#{s} " }; print "\n"; end
  • 哇..你为什么要实现自己的字典?你知道数组数组很慢,对吧?您可以只使用带有字符串作为值的整数键的哈希。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2020-11-25
  • 1970-01-01
  • 2012-06-10
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多