LoginSignup
1
0

More than 3 years have passed since last update.

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

Posted at

まず前提として、今回引っかかった問題は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関数から抜ける時に使いますよね...
最初から私の認識が甘かったです...


というわけで無知な私が少し成長した話でした。
最後まで読んでいただきありがとうございますした。

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0