Posted at

rubyでatcoderやってたらreturnのせいで実行時エラー出たっていう無知だった話

まず前提として、今回引っかかった問題はabc136のc問題Build Stairsです。

(*筆者は競技プログラミング初心者です。また、学習用なので優しい目で見守ってください。:family_wwb:


returnが実行時エラーの原因になった

まずは私が最初に書いて実行時エラーにされたコードを見ていただきたい。


code.rb

n = gets.to_i

h = gets.split.map &:to_i
(n-1).downto(0) do |i|
if i == 0
puts "Yes"
return
end
if h[i-1] - h[i] > 1
puts "No"
return
elsif h[i-1] - h[i] == 1
h[i-1] -= 1
end
end

このコードでは、3行目からの繰り返しを条件に応じて抜けてプログラムを終了する為にreturnを使っています。macOSのコマンドラインで実行しても特にエラーは出ないしプログラムもちゃんと動いてるっぽい。

しかし、AtCoderで提出するとダメだって言われてもう大変!どうやらreturnが原因だった見たいです。


exitでプログラムを抜ける

「別に自分が書いたコードが間違ってる気はしない。もう意味わからん。」と思い他の人の提出を見てみたところ、私のreturnの位置にexitと書いている人が多い!(そんなこと全く思いつかなかった。ていうか、exitって例外処理の時とかに使うやつですよね?間違っていたらすみません...)


code.rb

n = gets.to_i

h = gets.split.map &:to_i
(n-1).downto(0) do |i|
if i == 0
puts "Yes"
exit
end
if h[i-1] - h[i] > 1
puts "No"
exit
elsif h[i-1] - h[i] == 1
h[i-1] -= 1
end
end

上のように書き換えたところ無事解決。とりあえず次回以降AtCoderをやる時はexitを使います。


そもそもメソッドを定義する

「けどなんでreturnじゃダメなんだ!」と思ったのでもう一回書き直してみました。


code.rb

n = gets.to_i

h = gets.split.map &:to_i

def stairs(n,h)
(n-1).downto(0) do |i|
if i == 0
puts "Yes"
return
end
if h[i-1] - h[i] > 1
puts "No"
return
elsif h[i-1] - h[i] == 1
h[i-1] -= 1
end
end
end

puts stairs(n,h)


メソッドを定義してその中で使えば普通にいけました。そもそもreturnって他の言語でも関数の中で値を返すor関数から抜ける時に使いますよね...

最初から私の認識が甘かったです...




というわけで無知な私が少し成長した話でした。

最後まで読んでいただきありがとうございますした。