まず前提として、今回引っかかった問題はabc136のc問題Build Stairsです。
(*筆者は競技プログラミング初心者です。また、学習用なので優しい目で見守ってください。)
returnが実行時エラーの原因になった
まずは私が最初に書いて実行時エラーにされたコードを見ていただきたい。
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
って例外処理の時とかに使うやつですよね?間違っていたらすみません...)
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
じゃダメなんだ!」と思ったのでもう一回書き直してみました。
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関数から抜ける時に使いますよね...
最初から私の認識が甘かったです...
というわけで無知な私が少し成長した話でした。
最後まで読んでいただきありがとうございますした。