2012-04-10 87 views
0

我想创建一个程序,用户使用正则表达式输入四个数字。如果其中一个数字是13,那么左边的数字不会计入总和。我的问题是建立一个例外,没有数字等于13.我似乎无法找到一个正则表达式我例外ruby​​正则表达式

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

@AndrewMarshall - 这是一个很好的礼貌提醒信息 - 它可以,如果我复制使用作为模板?即使用autohotkey等,只要需要它就会很容易 – Coffee 2012-04-10 21:24:52

+1

@Adel毫无问题!我有一大堆的评论模板,我保存为片段,因为我认为这些链接是最好的,我不想每次都找到它们:)。 – 2012-04-10 21:32:06

+0

@AndrewMarshall - 非常感谢你!是的,我也会做一个模板集合! – Coffee 2012-04-10 21:36:52

回答

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。

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(:+) 
+2

为什么不''4.times do ... end'? – 2012-04-10 21:16:36

+0

的确,我的不好。 – gmalette 2012-04-10 21:17:49

+1

不用担心!只是一个有用的建议':)'。 – 2012-04-10 21:19:42

2

gmalette,这是非常有趣的语法。我从中学到了东西。然而,你需要将代码从数组尾部向后计数。此外,减少方法会将蜇伤加在一起。所以“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(:+) 

这减少语句真的很有趣。

+1

另外,您可以用我的答案 – gmalette 2012-04-10 23:06:47

+0

gmalette中的&:to_i来缩写collect(地图)方法,您可以提供我见过的最“红宝石般”的答案。 :) – user1182000 2012-04-20 05:48:14

+0

非常感谢:) – gmalette 2012-04-21 15:51:32