paiza プログラミング

[Ruby|Python]paiza 標準出力メニュー 【出力形式を指定して出力】

paiza_stdout_10

今回はpaiza 標準入力メニューセクション10【出力形式を指定して出力をRubyとPythonで解説します。

セクション10は、文字列や整数値を指定された形式で出力する問題です。

本記事で使用しているメソッドについて

解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。

セクション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では問題集の総合的な問題を解きました。

標準出力メニューでは、指定形式の文字列を生成する方法を扱いました。

標準入出力に慣れたら「繰り返し」や「条件分岐」が入った問題にも挑戦してみましょう!



【PR】アルゴリズム学習でお世話になった本


アルゴリズム関連の技術書は大抵C/C++で書かれていますが、ある程度プログラムが出来れば、処理の流れは理解することが出来ます。






通称: 螺旋本。C++で解説されています。AOJ(Aizu Online Judge)を運営している会津大学の渡辺准教授が書いた本です。データ構造や計算量の内容から丁寧に書いてありますのでアルゴリズム学習の最初の参考書としてオススメです。







通称: 蟻本。C++で解説されています。競技プログラミング中級者の定番書と言われていて、競技プログラミングで利用できる色々なアルゴリズムを学ぶことが出来ます。かなり高度な内容も含まれているので1冊分を完全に理解するのにはかなりの時間がかかりそうですが、手元に置いて何度も読み返しています。







通称: チーター本。C#, C++, JAVAでTopcoderの問題を解説しています。初心者~中級者向けに書かれているので解説が非常に丁寧です。







Python3でアルゴリズムを解説している本です。講義スタイルの本で、図やフローチャートを使ってアルゴリズムとデータ構造についてしっかりと説明されています。代わりにコードは少なめです。Pythonコードが読めなくても十分理解できると思います。


-paiza, プログラミング
-

© 2024 じゃいごテック