ruby 競技プログラミング入門 【初心者】

paizaなどで試しにやってみて標準入力データの取得から困ったのでまとめてみました。

目次
1、入出力の基本
2、chompメソッド
 ・数値を整数として取得
 ・スペース区切りの数値を取得する場合
・縦に並んだ数値を取得する場合
3、mapメソッド
4、injectメソッド
5、joinメソッド
5、gsubメソッド

入出力の基本


N = gets.to_i             

# 単一整数

a = gets.split.map(&:to_i)  

# スペースで区切られた複数の整数

a = N.times.map{gets.to_i} 

# 縦に並んだ複数の整数

S = gets.chomp           

# 文字列を改行削除してくれます

よく出てくる問題の形式で、
・N
・a_1 b_1
・...
・a_N b_N
のように出力しないといけないことが多いので

N = gets.to_i
a, b = N.times.map{gets.split.map(&:to_i)}.transpose


[[a_1, b_1], ..., [a_N, b_N]] を転置して、 [[a_1, ..., a_N], [b_1, ..., b_N]] にする

複数行から要素を取得する

[read.rb]

input = $stdin.read.split
p input


[ターミナル]

%  hoge
%  fuga

 結果 => ["hoge","fuga"]


前後のホワイトスペースを削除する方法

これには「strip」を使います。

m = "  maji  maj maji  "

p m.strip
結果 => "maji  maj maji"  #<=最初と最後の空白がなくなっている。


*ホワイトスペースとは、「改行コード」「タブ」「半角スペース」のことをいいます。


chompメソッド


chompメソッドは改行コードを削除してくれるメソッドになります。
入力を数値で行う場合は必要ないため、文字列を扱う場合のみに使用しましょう。速度が遅くなります...
文字列を1文字ずつ配列に格納したい場合などは、charsメソッドと一緒に使用すると便利です。

m = "majikayo"
m = gets.chomp.chars 
=> ["m", "a", "j", "i", "k", "a","y","o"]



数値を整数として取得


「gets」は文字列を返すので、数値として扱いたい場合は「to_i」メソッドを使用します。

m = 20
m = gets.to_i 
=> 20



数値を文字列で取得したい場合、

m = gets.chomp
=> "20"


スペース区切りの数値を取得する場合


「split」を使います、

5 21 4 5
m = gets.split.map(&:to_i)
=> [5, 21, 4, 5]


「split」に引数を渡さない場合、半角スペースで勝手に区切ってくれるので「split(" ")」としなくても大丈夫です。

数値を配列ではなく各変数に格納する場合、多重代入を使います。

a, b, c, d = gets.split.map(&:to_i)
=> [5, 21, 4, 5]
p a
=> 5
p b
=> 21
p c
=> 4
p d
=> 5


縦に並んだ数値を取得する場合


4
5
4
6
7
m = gets.to_i
=> 4
m.times.map { gets.to_i } 
=> [4, 5, 4, 6,7]


[times]でループを回し、「map」メソッドで配列にして取得します。
mapメソッドについては ↓ 。

mapメソッド


mapメソッドは配列を返すメソッドになります。

a[0,1,2]
a.map{|n| n + 1} 
# => [1,2,3]

#文字列に変換する
a.map(&:to_s)


mapもeachもループを回してくれるので似ていますが違いは戻り値が異なるところです。
mapは配列を作成して返してくれるのですが、eachは戻り値がレシーバ自体に返ります。

#mapの場合

animal = ["dog", "cat", "koara","bird"]
  animal.map! {|a| a.length}
#=> [3, 3, 5, 4]

#eachの場合

 animal = ["dog", "cat", "koara","bird"]
 animal.each {|a| a.length}
# => ["dog", "cat", "koara","bird"]



injectメソッド


eachのようにブロック内の処理を繰り返し行うメソッド

[1, 2, 3, 4, 5].inject {|a, b| a+ b } 
#=> 15

eachでやると

a = 0
[1, 2, 3, 4, 5].each {|v| a += v }
p a 
# => 15


となります。

joinメソッド


joinメソッドは配列を文字列にするとき使用します。

any = ["a","b", "c"]
p array.join(",")
=> "a,b,c"



gsubメソッド


正規表現を使って、第一引数にマッチした文字列をすべて第二引数に置き換えます。
よって、第二引数で「””」に置換することで文字列を削除することもできます。

n = "ruby python javascript"

p n.gsub(/[ruby]/,"")
結果=> " pthon javascipt"



競技プログラミングやってみると結構おもしろかったので(全然解けないけど..)
ぜひチャレンジしてみてください。