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