2012-04-10 15 views
0

ユーザが正規表現を使用して4つの数字を入力するプログラムを作成しようとしています。それらの数字のうちの1つが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 - これは素晴らしい丁寧なリマインダメッセージです。テンプレートとして使用するとコピーできますか?つまり、オートホットキーなどが必要なときはいつでも簡単になります – Coffee

+1

@Adelまったく問題ありません!私はリンクを持っていると思うので、私はスニペットとして保存したSOのコメントテンプレートをたくさん持っていて、たびに見つけたくありません。 –

+0

@AndrewMarshall - ありがとうございます!はい、テンプレートコレクションも作成します。 – Coffee

答えて

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 \ n"なので、 "13"と比較すると動作しません。 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'? –

+0

確かに、私の悪い。 – gmalette

+1

心配はいりません!ちょっと参考にしてください。 –

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

この縮小文は本当に面白いです。

+1

また、私の答え – gmalette

+0

gmaletteのように、&:to_iを使ってcollect(map)メソッドを省略することができます。あなたは最も「ルビー」の答えを出しました。 :) – user1182000

+0

ありがとう:) – gmalette