はじめに
Ruby学習の一環として「競技プログラミング(競プロ)」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「AtCoder Beginners Selection」の一問目(PracticeA)より、標準入力について。
https://atcoder.jp/contests/abs
問題
整数a,b,cと、文字列sが与えられます。
a+b+cの計算結果と、文字列sを並べて表示しなさい。
制約
1≤a,b,c≤1,000
1≤|s|≤100
入力は以下の形で与えられる。
a
b c
s
# 例
1
2 3
test
a+b+cとsを空白区切りで1行に出力せよ。
出力例
# 上記例の場合
6 test
解答例
a = gets.to_i
b,c = gets.chomp.split("").map(&:to_i)
s = gets.chomp
print("#{a+b+c} #{s}\n")
ここで使われている標準入力に関わるメソッドを一つ一つ見ていきます。
getsメソッド
rubyにおいて標準入力を受け取るにはgetsメソッドを使います。
ただ、getsメソッドで標準入力を受け取る際には以下の2点に注意します。
①標準入力を文字列で受け取る
②文字列を受け取る場合は末尾に改行コード\nが付いて来る。
#入力 3
a = gets
print a
=> "3\n"
to_iメソッド
文字列を整数にして返すメソッドです。
getsメソッドのみでは、整数ですら文字列として受け取ってしまうため、
整数を整数として扱いたい場合は、to_iメソッドを使って整数に戻してあげる必要があります。
#入力 3
a = gets.to_i
print a
=> 3
この場合、改行コードも消してくれます。
chompメソッド
getsメソッドで文字列を受け取る際の改行コード問題。
これを解決してくれるのがchompメソッドです。末尾の改行コードを取り除いてくれます。
この改行コードの存在をそのままにすると、これだけで誤答判定される場合もあるようなので注意が必要です。
#入力 test
s = gets.chomp
print s
=> "test"
ちなみに
to_iメソッドの部分でも述べましたが、整数に変換した後は使う必要はありません。
必要ない場合にchompメソッドを付けてしまうと処理速度の低下に繋がるので注意。
splitメソッド
文字列を分割して配列にしてくれるメソッドです。
区切り文字を「split("区切り文字")」の形で指定することで、区切り部分を指定できます。
解答例では、bとcの間のスペースを区切り文字として指定しています。
# 段階的に見ていきます。
#入力 3 4
a = gets
print a
=> "3 4\n"
b = a.chomp
print b
=> "3 4"
c = b.split(" ")
print c
=> ["3", "4"]
# まとめて書くと
#入力 3 4
d = gets.chomp.split(" ")
print d
=> ["3", "4"]
mapメソッド
配列の要素の数だけ繰り返し処理を行ってくれます。
今回の解答で用いている「map(&:to_i)」では、
繰り返し処理の引数として「to_iメソッド」を「&」を使うことで渡せる状態にしています。
このことについては、詳しく書くと長くなる内容なので…
とりあえず、下記の記事が詳しく書いて下さっているので、こちらを覗いてみられるといいかと。
["1", "2", "3"].map(&:to_i) とは何か。
近いうちに自分でも記事にしてみようと思います。
# splitメソッドの続きから
#入力 3 4
d = gets.chomp.split(" ")
print d
=> ["3", "4"]
e = d.map(&:to_i)
print e
=> [3, 4]
最後に
以上、AtCoder Beginners SelectionでRuby学習【PracticeA】で学ぶ標準入力でした。
mapメソッドの部分で課題は残りましたが、
ここもしっかり理解して自分の力にしていきたいと思います。
間違いなどありましたら、ご指摘いただけると嬉しいです。