はじめに
Rubyおよびアルゴリズムの学習の一環として競技プログラミングに参加しています。
ここでは、学習の中で学んだことをアウトプットしていきます。
今回は標準出力について。
これまでなんとなくでprintをメインに使ってきましたが、
さすがに区別は出来ていた方がいいだろうと思ったのでまとめておきます。
単純にまとめると
pメソッド
・ オブジェクトの型を反映した出力(文字列型は" "に囲まれて出力。整数型はそのまま)
・ 一行ごとに改行
putsメソッド
・ オブジェクトを文字列に変換して出力
・ 一行ごとに改行
printメソッド
・ オブジェクトを文字列に変換して出力
・ 改行しない
pメソッド
オブジェクトの型を反映した出力を行います。
文字列は" "に囲まれた形で出力されてしまうので、
解答を文字列で行うような問題では、不正解となってしまいます。
整数で解答を行う場合は問題ありません。
p"test"p123
"test"123
putsメソッド
オブジェクトを文字列に変換して出力します。
文字列の最後で改行が行われます。
puts"test"puts123
test123
printメソッド
オブジェクトを文字列に変換して出力します。
putsメソッドと違い、改行は行われません。
print"test"print123
test123
上記のように2つのオブジェクトを続けて出力する際は、文字列が繋がった状態で出力されます。
出力される形式が少しずつ異なる為、問題によって使い分ける必要がありそうです。
問題例①
「Atcoder Biginners Selection」第2問「Product」より
二つの正の整数a, bがあります。
aとbの積が偶数であればEvenを、奇数であればOddを出力しなさい。
34
a,b=gets.split(" ").map(&:to_i)p(a*b).odd??"Odd":"Even"#pメソッドputs(a*b).odd??"Odd":"Even"#putsメソッドprint(a*b).odd??"Odd":"Even"#printメソッド
"Even"#pメソッド 不正解Even#putsメソッド 正解Even#printメソッド 正解
" "で囲んでしまうpメソッドでは不正解となりました。
putsメソッドかprintメソッドでの解答が正解となります。
問題例②
「Atcoder Biginners Selection」第3問「Placing Marbles」より
3つのマスからなるマス目があります。
各マスには"0"か"1"が書かれており、"1"が書かれているマスにビー玉を置きます。
ビー玉が置かれたマスはいくつあるか答えなさい。
101
ary=gets.split("").map(&:to_i)count=0ary.each{|i|i==1?count+=1:count+=0}pcount#pメソッドputscount#putsメソッドprintcount#printメソッド
2#pメソッド 正解2#putsメソッド 正解2#printメソッド 正解
この問題では、どのパターンの出力でも正解となりました。
問題例③
「Atcoder Biginners Selection」第1問「Welcome to AtCoder」より
整数a,b,cと文字列sが与えられます。
a+b+cの計算結果と、文字列sを半角スペースを挟んで並べて出力しなさい。
123test
a=gets.to_ib,c=gets.split(" ").map(&:to_i)s=gets.chompp"#{a+b+c}#{s}"#pメソッドputs"#{a+b+c}#{s}"#putsメソッドprint"#{a+b+c}#{s}"#printメソッド
"6 test"#pメソッド 不正解6test#putsメソッド 正解6test#printメソッド 正解
この問題でも問題例①と同様に、pメソッドのみが不正解となりました。
文字列を出力して解答するような問題の場合は、putsメソッドかprintメソッドで解答するのがいいようです。
最後に
以上、よく使う標準出力の使い分けについてでした。
もし間違いなどございましたら、ご指摘いただけると嬉しいです。