Rubyで競技プログラミング

最近Ruby on Rails チュートリアル:実例を使って Rails を学ぼうを終えてRubyの練習がてら競プロの問題をいくつか解いてみたので、 入出力の方法とかのメモ。

他に関連しそうな記事:

入出力

基本的なこと

  • getsで標準入力から1行文字列を受け取る
    • 改行も入るので取り除くにはgets.chopとかする
  • 整数への変換はto_i浮動小数to_f、文字列はto_s
  • str.splitで空白文字で分割
  • a.join(sep)で配列を区切り文字で連結した文字列を得る

よくあるパターン

  • 1行に整数が空白区切りであるとき
x_1 x_2 ... x_n
# 入力
# 個々の変数にとるとき
a,b,c = gets.split.map(&:to_i)
# 配列としてとるとき
xs = gets.split.map(&:to_i)

# 出力
puts xs.join(' ')
  • 複数行に整数があるとき
x_1
x_2
...
x_n
# 入力
xs = []
n.times { xs << gets.to_i }

# 出力
xs.map { |x| puts x }
  • 複数行に複数個数字があるとき
n_1 x_11 ... x_1(n_1)
...
n_m x_m1 ... x_m(n_m)
ns = [] # [n_1, ..., n_m]
xs = [] # [[x_11,...],...,[x_m1,...]]
3.times do
  line = gets.split.map(&:to_i)
  ns << line.shift
  xs << line
end

配列

  • Array.new(n,z)で長さn、初期値zの配列を作る
    • zを省略するとnilで初期化
    • 連番がほしければ(1..n).to_aでもできる
  • 二次元配列はArray.new(n){ Array.new(m) }で作る
  • <<で末尾に追加
  • popで末尾から、shiftで先頭から取り出す