今回はpaiza 標準入力メニューセクション10【出力形式を指定して出力】をRubyとPythonで解説します。
セクション10は、文字列や整数値を指定された形式で出力する問題です。
本記事で使用しているメソッドについて
解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。
- [Ruby] 標準入力によるデータ取得1
- [Ruby] 標準入力によるデータ取得2
- [Ruby] 標準入力によるデータ取得3
- [Ruby] 標準出力(データを任意に整形して出力する)
- [Ruby]配列の基本操作1
- [Ruby]繰り返し処理
セクション10:【出力形式を指定して出力】
10-STEP1: 2 つの文字列を出力 (paizaランク D 相当)
2行で入力された文字列s, tを指定された形式 "s + t = st"
で出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" kirishima kyoko EOS OUTPUT1 = <<~"EOS" kirishima + kyoko = kirishimakyoko EOS INPUT2 = <<~"EOS" S T EOS OUTPUT2 = <<~"EOS" S + T = ST EOS
Ruby解答例1
文字列s, t を受け取り、式展開で指定された形式"s + t = st"
に整えて出力しています。
# 解答例1 # 入力 s = gets.chomp t = gets.chomp # 出力 puts("#{s} + #{t} = #{s + t}")
Ruby解答例2
文字列s, t を受け取り、+ で文字列を連結して出力しています。
# 解答例2 # 入力 s = gets.chomp t = gets.chomp # 出力 puts(s + " + " + t + " = " + s + t)
Python解答例1
文字列s, t を受け取り、f文字列で指定された形式"s + t = st"
に整えて出力しています。
# 解答例1 # 入力 s = input() t = input() # 出力 print(f"{s} + {t} = {s + t}")
Python解答例2
文字列s, t を受け取り、+ で文字列を連結して出力しています。
# 解答例2 # 入力 s = input() t = input() # 出力 print(s + " + " + t + " = " + s + t)
10-STEP2: 文字列と N 個の整数の出力 (paizaランク C 相当)
半角スペース区切りで整数n, a, b が与えられ、指定された形式"(a, b)"
をn個 ", "
で連結して出力する問題です。
(整数a, b は10 以上 99 以下です)
入出力例
# 入出力例 INPUT1 = <<~"EOS" 3 10 99 EOS OUTPUT1 = <<~"EOS" (10, 99), (10, 99), (10, 99) EOS INPUT2 = <<~"EOS" 2 33 44 EOS OUTPUT2 = <<~"EOS" (33, 44), (33, 44) EOS
Ruby解答例1
以下の流れで実装しています。
- 整数n, a, b を受け取り、指定された形式
"(a, b)"
を生成し、変数sに格納します。 - 要素が文字列s、要素数nの配列aryを生成します。
- 配列aryを指定された形式
", "
で連結して出力します。
# 解答例1 # 入力 n, a, b = gets.split.map(&:to_i) # "(a, b)" 形式の文字列を生成 s = "(#{a}, #{b})" # 要素 s が n 個の配列を生成 ary = [s] * n # 出力 puts(ary.join(", "))
Ruby解答例2
Ruby解答例1の文字列生成部分を短く書くと以下のようになります。
# 解答例2 # 入力 n, a, b = gets.split.map(&:to_i) # 出力 puts (["(#{a}, #{b})"] * n).join(", ")
Python解答例1
以下の流れで実装しています。
- 整数n, a, b を受け取り、指定された形式
"(a, b)"
を生成し、変数sに格納します。 - 要素が文字列s、要素数nの配列aryを生成します。
- 配列aryを指定された形式
", "
で連結して出力します。
# 解答例1 # 入力 n, a, b = map(int, input().split()) # "(a, b)" 形式の文字列を生成 s = f"({a}, {b})" # 要素 s が n 個の配列を生成 ary = [s] * n # 出力 print(", ".join(ary))
Python解答例2
Python解答例1の文字列生成部分を短く書くと以下のようになります。
# 解答例2 # 入力 n, a, b = map(int, input().split()) # 出力 print(", ".join([f"({a}, {b})"] * n))
10-STEP3: 九九表を罫線入りで出力 (paizaランク C 相当)
九九の答えの表を、指定された形式で出力する問題です。
- 九九の答えは2桁半角スペース埋めにする
- 横の数値間(段の答え)は
" | "
で区切る - 縦の数値間(各行)は段の答えのと文字数が同じになるように
"="
を繰り返す
入出力例
※ 入力はありません。
※ 半角スペースだと見づらいため、半角スペース" "をアンダースコア "_"に置き換えています。
# 出力例 OUTPUT = <<~"EOS" _1_|__2_|__3_|__4_|__5_|__6_|__7_|__8_|__9 ========================================== _2_|__4_|__6_|__8_|_10_|_12_|_14_|_16_|_18 ========================================== _3_|__6_|__9_|_12_|_15_|_18_|_21_|_24_|_27 ========================================== _4_|__8_|_12_|_16_|_20_|_24_|_28_|_32_|_36 ========================================== _5_|_10_|_15_|_20_|_25_|_30_|_35_|_40_|_45 ========================================== _6_|_12_|_18_|_24_|_30_|_36_|_42_|_48_|_54 ========================================== _7_|_14_|_21_|_28_|_35_|_42_|_49_|_56_|_63 ========================================== _8_|_16_|_24_|_32_|_40_|_48_|_56_|_64_|_72 ========================================== _9_|_18_|_27_|_36_|_45_|_54_|_63_|_72_|_81 EOS
Ruby解答例1
以下の流れで実装しています。
- 各行の文字列を格納するために空配列lineを用意します。
- 整数tateを1から9まで増やしながら繰り返すループを設定します。
- tate段の答えを格納するための空配列danを用意します。
- 整数yokoを1から9まで増やしながら繰り返すループを設定します。
tate * yoko
の計算結果を2桁半角スペース埋めの文字列に変換して配列danに追加します。
- 配列danを
" | "
で連結して、配列line に追加します。
- 配列lineを
("=" * 42 + "\n")
で連結した文字列を変数kukuに格納します。
(九九の答えの文字数: 2 * 9 + " | " の文字数: 3 * (9 - 1) = 42) - 変数kukuを出力します。
# 解答例1 # 1 から 9 の段の答えを指定書式で配列 dan に格納 line = [] 1.upto(9).each do |tate| dan = [] # tate 段目の答えを 半角スペース埋め2桁の文字列にして配列 dan に追加 1.upto(9).each do |yoko| dan.push("%2d" % (tate * yoko)) end # 配列 dan を " | " で連結して末尾に改行を追加 line.push(dan.join(" | ") + "\n") end # 配列 dan を "=" * 42 + "\n" で連結 kuku = line.join("=" * 42 + "\n") # 出力 puts(kuku)
Ruby解答例2
Ruby解答例1の文字列生成部分をmapメソッドを使って短く書くと以下のようになります。
# 解答例2 # tate 段目の答えを指定書式に変換して配列 line に格納 line = 1.upto(9).map do |tate| # i 段の答えを " | " で連結し末尾に改行を追加 1.upto(9).map { |yoko| "%2d" % (tate * yoko) }.join(" | ") + "\n" end # 配列 line を "=" * 42 + "\n" で連結 kuku = line.join("=" * 42 + "\n") # 出力 puts(kuku)
Python解答例1
以下の流れで実装しています。
- 各行の文字列を格納するために空配列lineを用意します。
- 整数tateを1から9まで増やしながら繰り返すループを設定します。
- tate段の答えを格納するための空配列danを用意します。
- 整数yokoを1から9まで増やしながら繰り返すループを設定します。
tate * yoko
の計算結果を2桁半角スペース埋めの文字列に変換して配列danに追加します。
- 配列danを
" | "
で連結して、配列line に追加します。
- 配列lineを
("=" * 42 + "\n")
で連結した文字列を変数kukuに格納します。
(九九の答えの文字数: 2 * 9 + " | " の文字数: 3 * (9 - 1) = 42) - 変数kukuを出力します。
# 解答例1 # 1 から 9 の段の答えを指定書式で配列 dan に格納 line = [] for tate in range(1, 10): dan = [] # tate 段目の答えを 半角スペース埋め2桁の文字列にして配列 dan に追加 for yoko in range(1, 10): dan.append(f"{tate * yoko:2d}") # 配列 dan を " | " で連結して末尾に改行を追加 line.append(" | ".join(dan) + "\n") # 配列 dan を "=" * 42 + "\n" で連結 kuku = ("=" * 42 + "\n").join(line) # 出力 print(kuku)
Python解答例2
Python解答例1の文字列生成部分をリスト内包表記を使って短く書くと以下のようになります。
※ やりすぎるとコードが読みにくくなりますね。
# 解答例2 # tate 段目の答えを指定書式に変換して配列 line に格納 line = [" | ".join([f"{tate * yoko:2d}" for yoko in range(1, 10)]) + "\n" for tate in range(1, 10)] # 配列 line を "=" * 42 + "\n" で連結 kuku = ("=" * 42 + "\n").join(line) # 出力 print(kuku)
10-STEP4: ペアの数値の入った表を罫線入りで出力 (paizaランク C 相当)
半角スペース区切りで整数h, w, a, b が与えられ、指定された形式"(a, b)"
を横にw個、縦にh個繰り返し、横は " | "
で連結、縦は文字数分の"="
で連結して出力する問題です。
(整数a, b は0 以上 9 以下です)
入出力例
※ 半角スペースだと見づらいため、半角スペース" "をアンダースコア "_"に置き換えています。
# 入出力例 INPUT1 = <<~"EOS" 2 3 7 8 EOS OUTPUT1 = <<~"EOS" (7,_8)_|_(7,_8)_|_(7,_8) ======================== (7,_8)_|_(7,_8)_|_(7,_8) EOS INPUT2 = <<~"EOS" 3 2 0 0 EOS OUTPUT2 = <<~"EOS" (0,_0)_|_(0,_0) =============== (0,_0)_|_(0,_0) =============== (0,_0)_|_(0,_0) EOS
Ruby解答例
以下の流れで実装しています。
- 整数h, w, a, b を受け取り、指定された形式
"(a, b)"
を生成し、変数sに格納します。 - 要素が文字列s、要素数wの配列を生成して
" | "
で連結し、変数lineに格納します。 - 要素が文字列line、要素数hの配列を生成して、
"=" * (9 * w - 3) + "\n"
で連結し、変数tableに格納します。
(文字列sの文字数: 6 * w + " | "の文字数: 3 * (w - 1) = 9 * w - 3) - 文字列tableを出力します。
# 解答例 # 入力 h, w, a, b = gets.split.map(&:to_i) # 指定書式 (A, B) の文字列 s を生成 s = "(#{a}, #{b})" # s を w 個 " | " で連結して末尾に改行を入れた文字列 line を生成 line = ([s] * w).join(" | ") + "\n" # line を h 個 "=" * (9 * w - 3) で連結して # 末尾に改行を追加した文字列 table を生成 # 6w + 3(w - 1) = 9w - 3 table = ([line] * h).join("=" * (9 * w - 3) + "\n") # 出力 puts(table)
Python解答例
以下の流れで実装しています。
- 整数h, w, a, b を受け取り、指定された形式
"(a, b)"
を生成し、変数sに格納します。 - 要素が文字列s、要素数wの配列を生成して
" | "
で連結し、変数lineに格納します。 - 要素が文字列line、要素数hの配列を生成して、
"=" * (9 * w - 3) + "\n"
で連結し、変数tableに格納します。
(文字列sの文字数: 6 * w + " | "の文字数: 3 * (w - 1) = 9 * w - 3) - 文字列tableを出力します。
# 解答例 # 入力 h, w, a, b = map(int, input().split()) # 指定書式 (A, B) の文字列 s を生成 s = f"({a}, {b})" # s を w 個 " | " で連結して末尾に改行を入れた文字列 line を生成 line = " | ".join([s] * w) + "\n" # line を h 個 "=" * (9 * w - 3) で連結して # 末尾に改行を追加した文字列 table を生成 # 6w + 3(w - 1) = 9w - 3 table = ("=" * (9 * w - 3) + "\n").join([line] * h) # 出力 print(table)
10-FINAL: 【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2 (paizaランク C 相当)
半角スペース区切りで整数h, w, a, b が与えられ、指定された形式"( a, b)"
を横にw個、縦にh個繰り返し、横は " | "
で連結、縦は文字数分の"="
で連結して出力する問題です。
(整数a, b は0 以上 999,999,999 以下です)
入出力例
※ 半角スペースだと見づらいため、半角スペース" "をアンダースコア "_"に置き換えています。
# 入出力例 INPUT1 = <<~"EOS" 2 3 7 8 EOS OUTPUT1 = <<~"EOS" (________7,_________8)_|_(________7,_________8)_|_(________7,_________8) ======================================================================== (________7,_________8)_|_(________7,_________8)_|_(________7,_________8) EOS INPUT2 = <<~"EOS" 3 2 999999999 0 EOS OUTPUT2 = <<~"EOS" (999999999,_________0)_|_(999999999,_________0) =============================================== (999999999,_________0)_|_(999999999,_________0) =============================================== (999999999,_________0)_|_(999999999,_________0) EOS
Ruby解答例1
以下の流れで実装しています。
- 整数h, w, a, b を受け取り、指定された形式
"( a, b)"
を生成し、変数sに格納します。 - 要素が文字列s、要素数wの配列を生成して
" | "
で連結し、変数lineに格納します。 - 要素が文字列line、要素数hの配列を生成して、
"=" * (25 * w - 3) + "\n"
で連結し、変数tableに格納します。
(文字列sの文字数: 22 * w + " | "の文字数: 3 * (w - 1) = 25 * w - 3) - 文字列tableを出力します。
# 解答例 # 入力 h, w, a, b = gets.split.map(&:to_i) # 指定書式 (A, B) の文字列 s を生成 s = "(#{"%9d" % a}, #{"%9d" % b})" # s を w 個 " | " で連結して末尾に改行を入れた文字列 line を生成 line = ([s] * w).join(" | ") + "\n" # line を h 個 "=" * (25 * w - 3) で連結して # 末尾に改行を追加した文字列 table を生成 # 22w + 3(w - 1) = 25w - 3 table = ([line] * h).join("=" * (25 * w - 3) + "\n") # 出力 puts(table)
Python解答例1
以下の流れで実装しています。
- 整数h, w, a, b を受け取り、指定された形式
"( a, b)"
を生成し、変数sに格納します。 - 要素が文字列s、要素数wの配列を生成して
" | "
で連結し、変数lineに格納します。 - 要素が文字列line、要素数hの配列を生成して、
"=" * (25 * w - 3) + "\n"
で連結し、変数tableに格納します。
(文字列sの文字数: 22 * w + " | "の文字数: 3 * (w - 1) = 25 * w - 3) - 文字列tableを出力します。
# 解答例 # 入力 h, w, a, b = map(int, input().split()) # 指定書式 (A, B) の文字列 s を生成 s = f"({a:9d}, {b:9d})" # s を w 個 " | " で連結して末尾に改行を入れた文字列 line を生成 line = " | ".join(([s] * w)) + "\n" # line を h 個 "=" * (25 * w - 3) で連結して # 末尾に改行を追加した文字列 table を生成 # 22w + 3(w - 1) = 25w - 3 table = ("=" * (25 * w - 3) + "\n").join([line] * h) # 出力 print(table)
今回のまとめ
セクション10では問題集の総合的な問題を解きました。
標準出力メニューでは、指定形式の文字列を生成する方法を扱いました。
標準入出力に慣れたら「繰り返し」や「条件分岐」が入った問題にも挑戦してみましょう!