0

ユーザーが正規表現を使用して 4 つの数字を入力するプログラムを作成しようとしています。これらの数字の 1 つが 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

ロジック全体を書き直すつもりはありませんが、列挙可能なモジュールを使用して次のようなことを行うことができます

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\n」であるため、「13」と比較しても機能しません。number1.to_i != 13 and number2.to_i != 13またはそのようなものを使用できます。そこでステートメントnumber1 !~ /^13$/ and number2 !~ /^13$/ ... を使用する場所を見つけることもできます。else

ただし、他の回答を検討することをお勧めします。それらははるかにエレガントでルビー風です。

于 2012-04-11T04:08:30.840 に答える