0

我正在尝试创建一个程序,用户使用正则表达式输入四个数字。如果其中一个数字是 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
4

3 回答 3

6

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

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(:+)
于 2012-04-10T21:13:05.053 回答
2

gmalette,这是非常有趣的语法。我从中吸取了教训。但是,您的代码需要让 take_while 方法从数组末尾倒数。此外,reduce 方法会将这些字符串添加到一起。所以“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(:+)

那个 reduce 语句真的很有趣。

于 2012-04-10T22:38:43.100 回答
0

如果你想使用正则表达式,应该提到的是,下面的逻辑会为不止 13 个产生 true。它也会匹配 413、131、941771341、...

if number1 =~ /13/ then

将其更改为if number =~ /^13$/ then会更准确,但不如使用 to 好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。

于 2012-04-11T04:08:30.840 回答