0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AtCoderでRuby学習12 標準出力の使い分け(p/puts/print)

Last updated at Posted at 2020-06-07

はじめに

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メソッドで解答するのがいいようです。

最後に

以上、よく使う標準出力の使い分けについてでした。

もし間違いなどございましたら、ご指摘いただけると嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?