我正在尝试创建一个程序,用户使用正则表达式输入四个数字。如果其中一个数字是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
答案 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 != 13
或number1 !~ /^13$/ and number2 !~ /^13$/ ...
之类的内容。您还可以找出在哪里使用else
语句。
我真的建议学习其他答案。他们更优雅和Rubyesque。