RubyでAtCoderの問題に挑戦するときの雛形


雛形

N個の数字を合計する問題の例です

$stdin = DATA
n = gets.to_i
p gets.split.map(&:to_i).take(n).sum
__END__
3
20 30 50
# >> 100

解説

  • gets は標準入力から受け取ると決まっているのではなく $stdin から受け取る
  • 別に $stdin は変更してもよい
  • Ruby には __END__ の下に記述すると DATA.gets で順に受けとれる謎の機能がある
  • なので $stdinDATA にする
  • すると getsDATA.gets 相当になる
  • なので __END__ の後のテキストが gets で順に取得できる

ついでに書くと、るびきち先生の rcodetools を活用すると実行結果がソースにコメントとして出ます。
Emacs を利用の方には超おすすめです。

# >> 100

提出

ちょっとダサいですが $stdin = DATA__END__ の間の部分だけをコピペして提出します。

n = gets.to_i
p gets.split.map(&:to_i).take(n).sum

$stdin = DATA がないので gets は本当の標準入力から受け取れます。

欠点

  • __END__ の下に1つ分の入力しか書けない

※便利gemの green_day を使うと、問題に記載してある入力と出力の例を元に、複数のテストケースを作ってくれます

結び

実行するたびに毎回自力で入力したり、試行錯誤するときは gets を使わないコードに置き換えたりするのは面倒なので、このような方法を取ることも多いのかなと思っていたのですが、調べても同じような方法が出てこなかったので紹介しました。