红宝石正则表达式

时间:2012-04-10 21:02:49

标签: ruby

我正在尝试创建一个程序,用户使用正则表达式输入四个数字。如果其中一个数字是13,则左边的数字不计入总和。我的问题是创建一个异常,其中没有数字等于13.我似乎无法找到我的异常的正则表达式

puts "enter a number then hit enter four times"

number1 = STDIN.gets

number2 = STDIN.gets
number3 = STDIN.gets

number4 = STDIN.gets


if number1 =~ /13/ then
  puts number2.to_i + number3.to_i + number4.to_i
end

if number2 =~/13/ then
  puts number3.to_i + number4.to_i
end

if number3 =~/13/ then
  puts number4.to_i
 if number4 =~/13/ then
   puts "0"
 end
 if number1 != 13 or number2 != 13 or number3 != 13 or number4 != 13
   puts number1.to_i + number2.to_i + number3.to_i + number4.to_i
 end
end

3 个答案:

答案 0 :(得分:6)

我并不是要重写你的整个逻辑,但是你可以使用可枚举模块并执行类似

的操作
puts "enter a number then hit enter four times"

# Collect 4 numbers
numbers = 4.times.map{ STDIN.gets }.reverse

# Take the numbers until the first 13, then sum them
puts numbers.map(&:to_i).take_while{ |a| a != 13 }.reduce(:+)

答案 1 :(得分:2)

gmalette,这是非常有趣的语法。我从中吸取了教训。但是,您的代码需要让take_while方法从数组末尾向后计数。此外,reduce方法会将stings加在一起。所以“44”+“55”=“4455”。这有效:

puts "Enter four numbers separated by spaces:"
numbers = STDIN.gets.split
numbers.reverse!.collect! {|s| s.to_i }
puts numbers.take_while{ |a| a != 13 }.reduce(:+)

减少陈述非常有趣。

答案 2 :(得分:0)

如果你想使用正则表达式,应该提到以下逻辑将产生超过13的真实。它也将匹配413,131,941771341,......

if number1 =~ /13/ then

将其更改为if number =~ /^13$/ then会更准确,但不如使用to_i那么好。

另一条问题......

if number1 != 13 or number2 != 13 or number3 != 13 or number4 != 13

...无法正常工作,因为您要将字符串与数字进行比较,逻辑连接应为and。将它与“13”进行比较也不起作用,因为它实际上是“13 \ n”。您可以使用number1.to_i != 13 and number2.to_i != 13number1 !~ /^13$/ and number2 !~ /^13$/ ...之类的内容。您还可以找出在哪里使用else语句。

我真的建议学习其他答案。他们更优雅和Rubyesque。