こんにちは!じゃいごテックのあつしです。
paizaなどの競技プログラミングでは標準入力でデータ受け取って、標準出力で処理結果を回答します。
Rubyにはいくつか標準出力メソッドが用意されていますが、当ブログでは基本的にpメソッド・putsメソッドを使って解説していきます。
標準入力とは
実行されているプログラムがデータを受け取る入力元のことです。キーボードやファイルからのデータ入力と思っておけばOK!
文字列で渡されるので、数値として扱うには文字列型から数値型への変更が必要です。
標準出力とは
プログラム処理結果の出力先のことです。画面表示と思っておけばOK!
標準出力メソッド
putsメソッド
puts(オブジェクト)
文字列を渡すと与えられた文字列と改行を出力します。末尾に改行がなければ改行を加えます。
# 末尾に改行があればそのまま出力する puts "JAIGO TEC\n" # > JAIGO TEC puts "JAIGO\nTEC\n\n" # > JAIGO # > TEC # > # 末尾に改行がなければ改行を追加して出力する puts "JAIGO TEC" # > JAIGO TEC
配列を渡すと、平坦化して先頭からその要素と改行を出力します。
# 配列を渡すと先頭から出力する puts ["abc", "def", "ghi"] # > abc # > def # > hij # 配列を平坦化して出力する # [["jkl", "mno"], "pqr", ["stu", "vwx"]] -> ["jkl", "mno", "pqr", "stu", "vwx"] puts [["jkl", "mno"], "pqr", ["stu", "vwx"]] # > jkl # > mno # > pqr # > stu # > vwx
文字列以外のオブジェクトを渡すと、to_a
, to_s
で出力できる形式への変換を試みます。
puts 123 # > 123 puts Math::PI # > 3.141592653589793 puts Float::INFINITY # > Infinity puts 10e6 # > 10000000.0 puts Time.now # > 2021-08-24 11:50:41 +0900
nil
, ""
を渡すと改行のみ出力します。
puts nil # > puts "" # >
pメソッド
p(オブジェクト)
引数を人間に読みやすい形に整形して出力します。主にデバッグで使用します。
# 文字列と改行を出力する p "JAIGO TEC\n" # > "JAIGO TEC\n" p "JAIGO\nTEC\n\n" # > "JAIGO\nTEC\n\n" p "JAIGO TEC" # > "JAIGO TEC" # nil, "" を出力する p nil # > nil p "" # > "" # 配列を出力する p ["abc", "def", "ghi"] # > ["abc", "def", "ghi"] p [["jkl", "mno"], "pqr", ["stu", "vwx"]] # > [["jkl", "mno"], "pqr", ["stu", "vwx"]] # 文字列以外のオブジェクトを出力する p 123 # > 123 p Math::PI # > 3.141592653589793 p Float::INFINITY # > Infinity p 10e6 # > 10000000.0 p Time.now # > 2021-08-24 13:14:06.8991634 +0900
出力する文字列を整形する
文字列を +
や <<
で連結して出力形式を整えても良いのですが、数値型も含まれていると、to_sメソッドで変換する必要があります。
Rubyには式展開という便利な機能がありますのでご紹介します。
式展開
#{オブジェクト}
文字列の中に変数や式を埋め込んで展開することが出来ます。to_s
で文字列に変換してくれるので文字列以外も使うことが出来ます。
式展開する文字列はダブルクォート""
で囲む必要があります。
first_name = "Taro" last_name = "Yamada" age = 20 # + を使う puts "name: " + first_name + " " + last_name + " age: " + age.to_s # > name: Taro Yamada age: 20 # << を使う (+ より処理が早い) puts "name: " << first_name << " " << last_name << " age: " << age.to_s # > name: Taro Yamada age: 20 # 式展開を使う puts "name: #{first_name} #{last_name} age: #{age}" # > name: Taro Yamada age: 20 # シングルクォートだとそのまま出力される puts 'name: #{first_name} #{last_name} age: #{age}' # > name: #{first_name} #{last_name} age: #{age} # #{}の中で式やメソッドを使うことが出来る puts "name: #{first_name.upcase} #{last_name.upcase} age: #{age + 5}" # > name: TARO YAMADA age: 25 # ヒアドキュメントでも使うことが出来る puts <<~"TEXT" ************************** name: #{first_name} #{last_name} age: #{age} ************************** TEXT # > ************************** # > name: Taro Yamada age: 20 # > **************************
文字列の左寄せ・右寄せ・中央寄せ
対象文字列.ljust(文字数, [padding = "埋める文字"])
対象文字列.rjust(文字数, [padding = "埋める文字"])
対象文字列.center(文字数, [padding = "埋める文字"])
対象文字列を文字数に左寄せ・右寄せ・中央寄せして、空いたスペースをpaddingで埋めた文字列を返します。
対象文字列の方が文字数が多い場合は対象文字列のコピーを返し、paddingを省略した場合は半角スペースで埋めます。
p "apple".ljust(4) p "apple".ljust(5) p "apple".ljust(6) p "apple".ljust(7) p "apple".ljust(8) p "apple".ljust(9) p "apple".ljust(9, "*") # > "apple" # > "apple" # > "apple " # > "apple " # > "apple " # > "apple " # > "apple****" p "apple".rjust(4) p "apple".rjust(5) p "apple".rjust(6) p "apple".rjust(7) p "apple".rjust(8) p "apple".rjust(9) p "apple".rjust(9, "*") # > "apple" # > "apple" # > " apple" # > " apple" # > " apple" # > " apple" # > "****apple" p "apple".center(4) p "apple".center(5) p "apple".center(6) p "apple".center(7) p "apple".center(8) p "apple".center(9) p "apple".center(9, "*") # > "apple" # > "apple" # > "apple " # > " apple " # > " apple " # > " apple " # > "**apple**"
数値型の右寄せ・0埋め
"%0桁数d" % 整数
"%0桁数.小数点以下桁数f" % 浮動小数点
整数型の場合は %d
、 浮動小数点型の場合は %f
を使います。桁数指定の前の0を省略すると、半角スペースで文字埋めします。
# 整数型を0埋めの文字列にしたものを生成 p "%03d" % 123 p "%04d" % 123 p "%05d" % 123 p "%06d" % 123 # 0を削除すると半角スペースで埋める p "%7d" % 123 # > "123" # > "0123" # > "00123" # > "000123" # > " 123" # 浮動小数点型を0埋めの文字列にしたものを生成 p "%08.0f" % 12.345 p "%08.1f" % 12.345 p "%08.2f" % 12.345 p "%08.3f" % 12.345 p "%08.4f" % 12.345 # 0を削除すると半角スペースで埋める p "%8.4f" % 12.345 # > "00000012" # > "000012.3" # > "00012.34" # > "0012.345" # > "012.3450" # > " 12.3450"
九九の表を作ってみる
式展開と整数型の右寄せを使って九九の表を作ってみます。
(1..9).each do |a| line = "" (1..9).each do |b| line << "#{a}×#{b}=#{"%2d" % (a * b)}" break if b == 9 line << ", " end puts line end # > 1×1= 1, 1×2= 2, 1×3= 3, 1×4= 4, 1×5= 5, 1×6= 6, 1×7= 7, 1×8= 8, 1×9= 9 # > 2×1= 2, 2×2= 4, 2×3= 6, 2×4= 8, 2×5=10, 2×6=12, 2×7=14, 2×8=16, 2×9=18 # > 3×1= 3, 3×2= 6, 3×3= 9, 3×4=12, 3×5=15, 3×6=18, 3×7=21, 3×8=24, 3×9=27 # > 4×1= 4, 4×2= 8, 4×3=12, 4×4=16, 4×5=20, 4×6=24, 4×7=28, 4×8=32, 4×9=36 # > 5×1= 5, 5×2=10, 5×3=15, 5×4=20, 5×5=25, 5×6=30, 5×7=35, 5×8=40, 5×9=45 # > 6×1= 6, 6×2=12, 6×3=18, 6×4=24, 6×5=30, 6×6=36, 6×7=42, 6×8=48, 6×9=54 # > 7×1= 7, 7×2=14, 7×3=21, 7×4=28, 7×5=35, 7×6=42, 7×7=49, 7×8=56, 7×9=63 # > 8×1= 8, 8×2=16, 8×3=24, 8×4=32, 8×5=40, 8×6=48, 8×7=56, 8×8=64, 8×9=72 # > 9×1= 9, 9×2=18, 9×3=27, 9×4=36, 9×5=45, 9×6=54, 9×7=63, 9×8=72, 9×9=81
配列の要素を結合して文字列を整形する
配列を任意の文字列で結合するにはjoinメソッド
を使用します。
joinメソッド
配列.join("結合文字列")
配列を平坦化して分割文字列で結合した文字列を返します。to_s
で文字列に変換してくれるので文字列以外も使うことが出来ます。
# 文字列要素の配列 p ["apple", "banana", "cherry"].join(" ") # > "apple banana cherry" # 整数の配列 p [150, 100, 300].join(" ") # > "150 100 300" # 文字列と数値が混在してもOK, 多次元配列でもOK p [["apple", 150], "banana", 100, ["cherry", 300]].join(",") # > "apple,150,banana,100,cherry,300"
九九の表を作ってみる2
式展開と整数型の右寄せとjoinメソッド
使って九九の表を作ってみます。
(1..9).each do |a| line = [] (1..9).each do |b| line << "#{a}×#{b}=#{"%2d" % (a * b)}" end puts line.join(", ") end # > 1×1= 1, 1×2= 2, 1×3= 3, 1×4= 4, 1×5= 5, 1×6= 6, 1×7= 7, 1×8= 8, 1×9= 9 # > 2×1= 2, 2×2= 4, 2×3= 6, 2×4= 8, 2×5=10, 2×6=12, 2×7=14, 2×8=16, 2×9=18 # > 3×1= 3, 3×2= 6, 3×3= 9, 3×4=12, 3×5=15, 3×6=18, 3×7=21, 3×8=24, 3×9=27 # > 4×1= 4, 4×2= 8, 4×3=12, 4×4=16, 4×5=20, 4×6=24, 4×7=28, 4×8=32, 4×9=36 # > 5×1= 5, 5×2=10, 5×3=15, 5×4=20, 5×5=25, 5×6=30, 5×7=35, 5×8=40, 5×9=45 # > 6×1= 6, 6×2=12, 6×3=18, 6×4=24, 6×5=30, 6×6=36, 6×7=42, 6×8=48, 6×9=54 # > 7×1= 7, 7×2=14, 7×3=21, 7×4=28, 7×5=35, 7×6=42, 7×7=49, 7×8=56, 7×9=63 # > 8×1= 8, 8×2=16, 8×3=24, 8×4=32, 8×5=40, 8×6=48, 8×7=56, 8×8=64, 8×9=72 # > 9×1= 9, 9×2=18, 9×3=27, 9×4=36, 9×5=45, 9×6=54, 9×7=63, 9×8=72, 9×9=81
今回のまとめ
paizaスキルチェックで出題されそうな標準出力のパターンを一通り紹介しました。
中でも式展開とjoinメソッドは特によく使いますので是非覚えて使ってみて下さい。
式展開やjoinメソッドを使うと出力の形式をスマートに表現できるのが良いですよね。