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) }
で作る- 最初知らずにハマったので注意(参考: Rubyで二次元配列の初期化 - simanのブログ)
<<
で末尾に追加pop
で末尾から、shift
で先頭から取り出す