引き算・掛け算 (paizaランク D 相当)
自分の解答(誤答)
practice.rb
numbers = gets.split
A = numbers[0]
B = numbers[1]
D = A - B
P = A * B
puts "#{D} #{P}"
# Runtime error
# Main.rb:18:in `<main>': undefined method `-' for "397":String (NoMethodError)
# D = A - B
# ^
# Did you mean? -@
ChatGPTの解答
理解しました。入力が半角スペースで区切られて1行で行われる場合、それに対応するようにコードを修正します。
# 1行で入力を受け取り、半角スペースで分割
numbers = gets.chomp.split
# 入力が2つの数値でない場合にエラーとする
if numbers.length != 2 || !numbers.all? { |num| num.match?(/\A-?\d+\z/) }
puts "正しいフォーマットで2つの数値を入力してください。"
exit
end
# 数字に変換
A = numbers[0].to_i
B = numbers[1].to_i
# 引き算と掛け算
D = A - B
P = A * B
# 結果の表示
puts "#{D} #{P}"
このコードでは、まずgets.chomp.split
で1行の入力を半角スペースで分割して、2つの数値になっているかを確認しています。また、数値に変換する前に正しいフォーマットかどうかもチェックしています。これにより、より確実なエラーハンドリングが行われます。
学び・感想
なるほど、A
とB
それぞれに代入するタイミングで数値に変換するのが今の自分には一番理解しやすい。
ちなみに、以下のような書き方もある。
sample.rb
# 数値として入力を受け取る
numbers = gets.split.map(&:to_i)
A = numbers[0]
B = numbers[1]
D = A - B
P = A * B
puts "#{D} #{P}"
理屈が少し難しいので、一旦はpractice.rb
の書き方で進めようと思います。