paiza プログラミング

[Ruby|Python]paiza 標準出力メニュー 【特定の文字で区切り 1 行で出力】

paiza_stdout_5

今回はpaiza 標準入力メニューセクション5【特定の文字で区切り 1 行で出力】を解説します。

セクション5は、任意の文字列で区切って1から入力された整数n までを改行区切りで出力する問題です。

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

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

セクション5:【特定の文字で区切り 1 行で出力】

5-STEP1: カンマ区切りで 2 つ出力 (paizaランク D 相当)

半角スペース区切りで入力された2個の整数n, mカンマ区切りで出力する問題です。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  5 1
EOS
OUTPUT1 = <<~"EOS"
  5,1
EOS

INPUT2 = <<~"EOS"
  2 1
EOS
OUTPUT2 = <<~"EOS"
  2,1
EOS
Ruby解答例1

式展開を使ってカンマ","区切りで出力しています。

# 解答例1
# 入力
n, m = gets.split.map(&:to_i)
# 出力
puts("#{n},#{m}")
Ruby解答例2

整数n, mを文字列に変換して、カンマ","+で連結して出力しています。

# 解答例2
# 入力
n, m = gets.split.map(&:to_i)
# 出力
puts(n.to_s + "," + m.to_s)
Python解答例1

f文字列を使ってカンマ","区切りで出力しています。

# 解答例1
# 入力
n, m = map(int, input().split())
# 出力
print(f"{n},{m}")
Python解答例2

整数n, mを文字列に変換して、カンマ","+で連結して出力しています。

# 解答例2
# 入力
n, m = map(int, input().split())
# 出力
print(str(n) + "," + str(m))

5-STEP2: バーティカルライン区切りで 3 つの文字列を出力 (paizaランク D 相当)

3行で入力された3個の文字列s1, s2, s3バーティカルライン "|" 区切りで出力する問題です。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  paiza
  kirishima
  kyoko
EOS
OUTPUT1 = <<~"EOS"
  paiza|kirishima|kyoko
EOS

INPUT2 = <<~"EOS"
  tvnmmtuzwn
  yykehmocjk
  vwsqozutch
EOS
OUTPUT2 = <<~"EOS"
  tvnmmtuzwn|yykehmocjk|vwsqozutch
EOS
Ruby解答例1

3.timesで3回のループを設定して、.map{ gets.chomp }で入力文字列末尾の改行を取り除いて、配列ary格納します。
そしてjoinメソッドを使ってバーティカルライン"|"区切りで出力しています。

# 解答例1
# 入力
ary = 3.times.map { gets.chomp }
# 出力
puts(ary.join("|"))
Ruby解答例2

式展開を使ってバーティカルライン"|"区切りで出力しています。

# 解答例2
# 入力
s1 = gets.chomp
s2 = gets.chomp
s3 = gets.chomp
# 出力
puts("#{s1}|#{s2}|#{s3}")
Ruby解答例3

文字列s1, s2, s3 バーティカルライン"|"+で連結して出力しています。

# 解答例3
# 入力
s1 = gets.chomp
s2 = gets.chomp
s3 = gets.chomp
# 出力
puts(s1 + "|" + s2 + "|" + s3)
Python解答例1

リスト内包表記で3行分の文字列を受け取って配列ary格納し、joinメソッドを使ってバーティカルライン"|"区切りで出力しています。

# 解答例1
# 入力
ary = [input() for _ in range(3)]
# 出力
print("|".join(ary))
Python解答例2

f文字列を使ってバーティカルライン"|"区切りで出力しています。

# 解答例2
# 入力
s1 = input()
s2 = input()
s3 = input()
# 出力
print(f"{s1}|{s2}|{s3}")
Python解答例3

文字列s1, s2, s3 バーティカルライン"|"+で連結して出力しています。

# 解答例3
# 入力
s1 = input()
s2 = input()
s3 = input()
# 出力
print(s1 + "|" + s2 + "|" + s3)

 


5-STEP3: カンマ区切りで 10 個出力 1 (paizaランク D 相当)

半角スペース区切りで入力された10個の整数の末尾にカンマを追加して連結して出力する問題です。
※ 最後の要素の後ろにカンマが付きます。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  0 1 2 3 4 5 6 7 8 9
EOS
OUTPUT1 = <<~"EOS"
  0,1,2,3,4,5,6,7,8,9,
EOS

INPUT2 = <<~"EOS"
  994 267 101 579 874 986 32 528 253 822
EOS
OUTPUT2 = <<~"EOS"
  994,267,101,579,874,986,32,528,253,822,
EOS
Ruby解答例1

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
空の文字列sを用意して、ループで配列ary先頭から順に参照し、文字列s整数nを文字列に変換して追加、カンマを追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
ary = gets.split.map(&:to_i)

# s を空文字列で初期化
s = ""

# ary 先頭から順に参照する 
ary.each do |n|
  # 文字列 s に 文字列に変換した n を追加
  s += n.to_s
  # 文字列 s に "," を追加
  s += ","
end
# 出力
puts(s)
Ruby解答例2

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
joinメソッド配列aryカンマ","で連結した文字列を生成し、末尾にカンマ","を追加して出力しています。

# 解答例2
# 入力
ary = gets.split.map(&:to_i)
# 出力
puts(ary.join(",") + ",")
Python解答例1

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
空の文字列sを用意して、ループで配列ary先頭から順に参照し、文字列s整数nを文字列に変換して追加、カンマを追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
ary = gets.split.map(&:to_i)

# s を空文字列で初期化
s = ""

# ary 先頭から順に参照する
ary.each do |n|
  # 文字列 s に 文字列に変換した n を追加
  s += n.to_s
  # 文字列 s に "," を追加
  s += ","
end
# 出力
puts(s)
Python解答例2

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
joinメソッド配列aryカンマ","で連結した文字列を生成し、末尾にカンマ","を追加して出力しています。

# 解答例2
# 入力
ary = gets.split.map(&:to_i)
# 出力
puts(ary.join(",") + ",")

5-STEP4: カンマ区切りで 10 個出力 2 (paizaランク D 相当)

半角スペース区切りで入力された10個の整数カンマ”,”区切りで出力する問題です。
※ 最後の要素の後ろにカンマは付きません。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  0 1 2 3 4 5 6 7 8 9
EOS
OUTPUT1 = <<~"EOS"
  0,1,2,3,4,5,6,7,8,9
EOS

INPUT2 = <<~"EOS"
  462 218 867 547 11 630 845 689 891 630
EOS
OUTPUT2 = <<~"EOS"
  462,218,867,547,11,630,845,689,891,630
EOS

 

Ruby解答例1

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
空の文字列sを用意して、i=0からary末尾のインデックスまでカウントアップするループを設定し、配列ary先頭から順に参照します。
文字列s整数nを文字列に変換して追加、配列ary末尾以外はカンマも追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
ary = gets.split.map(&:to_i)

# ary 末尾のインデックス
e_i = ary.length - 1
# s を空文字列で初期化
s = ""

# i=0 から e_i までカウントアップしながら繰り返す 
0.upto(e_i) do |i|
  # ary[i] を文字列に変換して文字列 s に追加
  s += ary[i].to_s
  # 最後の要素以外は "," を追加
  s += "," if i != e_i
end

# 出力
puts(s)
Ruby解答例2

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
joinメソッド配列aryカンマ","で連結した文字列を生成し出力しています。

# 解答例2
# 入力
ary = gets.split.map(&:to_i)
# 出力
puts(ary.join(","))
Python解答例1

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
空の文字列sを用意して、i=0からary末尾のインデックスまでカウントアップするループを設定し、配列ary先頭から順に参照します。
文字列s整数nを文字列に変換して追加、配列ary末尾以外はカンマも追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
ary = [*map(int, input().split())]
# ary 末尾のインデックス
e_i = len(ary) - 1
# s を空文字列で初期化
s = ""

# i=0 から e_i までカウントアップしながら繰り返す 
for i in range(e_i + 1):
    # ary[i] を文字列に変換して文字列 s に追加
    s += str(ary[i])
    # 最後の要素以外は文字列 s に "," を追加
    if i != e_i:
        s += ","
# 出力
print(s)
Python解答例2

入力された文字列を半角スペースで分割して整数型に変換し、配列aryに格納します。
joinメソッド配列aryカンマ","で連結した文字列を生成し出力しています。

# 解答例2
# 入力
ary = map(int, input().split())
# 出力
print(",".join(map(str, ary)))
Python解答例3

入力された文字列を半角スペースで分割して整数型に変換して配列aryに格納し、printメソッドの第2引数にsep=","を渡して出力しています。

# 解答例3
# 入力
ary = [*map(int, input().split())]
# 出力
print(*ary, sep=",")
5-STEP5: 半角スペースとバーティカルライン区切りで 10 個出力 (paizaランク D 相当)

改行区切りで入力された10個の整数「半角スペース+バーティカルライン+半角スペース” | ”」区切りで出力する問題です。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
EOS
OUTPUT1 = <<~"EOS"
  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
EOS

INPUT2 = <<~"EOS"
  804
  42
  547
  203
  795
  607
  922
  378
  268
  979
EOS
OUTPUT2 = <<~"EOS"
  804 | 42 | 547 | 203 | 795 | 607 | 922 | 378 | 268 | 979
EOS
Ruby解答例1

10.timesで10回のループを設定して、.map{ gets.to_i }で入力文字列を整数型に変換して、配列ary格納します。
空の文字列sを用意して、i=0からary末尾のインデックスe_iまでカウントアップするループを設定し、配列ary先頭から順に参照します。
文字列sary[i]を文字列に変換して追加、配列ary末尾以外" | "も追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
ary = 10.times.map { gets.to_i }
# ary 末尾のインデックス
e_i = ary.length - 1
# s を空文字列で初期化
s = ""
# i=0 から e_i までカウントアップしながら繰り返す 
0.upto(e_i) do |i|
  # ary[i] を文字列に変換して文字列 s に追加
  s += ary[i].to_s
  # 最後の要素以外は文字列 s に "," を追加
  s += " | " if i != e_i
end
# 出力
puts(s)
Ruby解答例2

10.timesで10回のループを設定して、.map{ gets.to_i }で入力文字列を整数型に変換して配列ary格納し、joinメソッド" | "で連結して出力しています。

# 解答例2
# 入力
ary = 10.times.map { gets.to_i }
# 出力
puts(ary.join(" | "))
Python解答例1

リスト内包表記で10回のループを設定して、入力文字列を整数型に変換し、配列ary格納します。
空の文字列sを用意して、i=0からary末尾のインデックスe_iまでカウントアップするループを設定し、配列ary先頭から順に参照します。
文字列sary[i]を文字列に変換して追加、配列ary末尾以外" | "も追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
ary = [int(input()) for _ in range(10)]
# ary 末尾のインデックス
e_i = len(ary) - 1
# s を空文字列で初期化
s = ""

# i=0 から e_i までカウントアップしながら繰り返す
for i in range(e_i + 1):
    # ary[i] を文字列に変換して文字列 s に追加
    s += str(ary[i])
    # 最後の要素以外は文字列 s に "," を追加
    if i != e_i:
        s += " | "
# 出力
print(s)
Python解答例2

リスト内包表記で入力文字列を整数型に変換して配列ary格納し、joinメソッド配列aryの要素を文字列に変換し、" | "で連結した文字列を生成し出力しています。

# 解答例2
# 入力
ary = [int(input()) for _ in range(10)]
# 出力
print(" | ".join(map(str, ary)))
Python解答例3

リスト内包表記で入力文字列を整数型に変換して配列ary格納し、printメソッドの第2引数にsep=" | "を渡して出力しています。

# 解答例3
# 入力
ary = [int(input()) for _ in range(10)]
# 出力
print(*ary, sep=" | ")

5-STEP6: 大きな数値を 3 けたごとにカンマ区切りで出力 (paizaランク C 相当)

入力された整数nを3桁毎にカンマ","で区切って出力する問題です。
整数nの桁数は、必ず3の倍数です。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  123456789
EOS
OUTPUT1 = <<~"EOS"
  123,456,789
EOS

INPUT2 = <<~"EOS"
  813
EOS
OUTPUT2 = <<~"EOS"
  813
EOS

INPUT3 = <<~"EOS"
  123456789123456789
EOS
OUTPUT3 = <<~"EOS"
  123,456,789,123,456,789
EOS
Ruby解答例1

入力文字列を整数型に変換し変数nに格納、整数nを文字列に変換した文字列変数sを用意します。
空の文字列c_sを用意して、i=0からary末尾のインデックスe_iまでカウントアップするループを設定し、文字列s先頭から順に参照します。
文字列c_ss[i]を追加、配列sの末尾以外かつ、3の倍数番目にはカンマ" , "も追加します。
ループを抜けたら文字列sを出力します。

# 解答例
# 入力
n = gets.to_i
# n を文字列に変換する
s = n.to_s
# s 末尾のインデックス
e_i = s.length - 1
# c_s を空文字で初期化
c_s = ""

# i=0 から e_i までカウントアップしながら繰り返す
0.upto(e_i) do |i|
  # s[i] を文字列 c_s に追加
  c_s += s[i]
  # 末尾以外かつ 3 の倍数のなら文字列 c_s にカンマ"," を追加
  if i != e_i && (i + 1) % 3 == 0
    c_s += ","
  end
end
# 出力
puts(c_s)
Ruby解答例2

gsubメソッドと正規表現を使った置換で3桁毎にカンマ","を追加して出力しています。

# 解答例2
# 入力
n = gets.to_i
# 3 桁毎に "," を挿入した文字列を生成
s = n.to_s.gsub(/(\d{3})(?!\z)/, '\0,')

# 出力
puts(s)
Python解答例1

入力文字列を整数型に変換し変数nに格納、整数nを文字列に変換した文字列変数sを用意します。
空の文字列c_sを用意して、i=0からary末尾のインデックスe_iまでカウントアップするループを設定し、文字列s先頭から順に参照します。
文字列c_ss[i]を追加、配列sの末尾以外かつ、3の倍数番目にはカンマ" , "も追加します。
ループを抜けたら文字列sを出力します。

# 解答例1
# 入力
n = int(input())

# n を文字列に変換する
s = str(n)
# s 末尾のインデックス
e_i = len(s) - 1
# c_s を空文字列で初期化
c_s = ""

# i=0 から e_i までカウントアップしながら繰り返す
for i in range(e_i + 1):
    # s[i] を文字列 c_s に追加
    c_s += s[i]
    # 末尾以外かつ 3 の倍数のなら文字列 c_s にカンマ"," を追加
    if i != e_i and (i + 1) % 3 == 0:
        c_s += ","
# 出力
print(c_s)

5-FINAL: 【特定の文字で区切り 1 行で出力】大きな数値を 3 けたごとにカンマ区切りで出力 2 (paizaランク C 相当)

入力された整数nを3桁毎にカンマ","で区切って出力する問題です。

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  123456789
EOS
OUTPUT1 = <<~"EOS"
  123,456,789
EOS

INPUT2 = <<~"EOS"
  813
EOS
OUTPUT2 = <<~"EOS"
  813
EOS

INPUT3 = <<~"EOS"
  12345678901234567890
EOS
OUTPUT3 = <<~"EOS"
  12,345,678,901,234,567,890
EOS
Ruby解答例1

入力文字列を整数型に変換し変数nに格納、整数nを文字列に変換して順番を逆にした文字列変数r_sを用意します。
空の文字列c_sを用意して、i=0からary末尾のインデックスe_iまでカウントアップするループを設定し、文字列s先頭から順に参照します。
文字列c_ss[i]を追加、配列sの末尾以外かつ、3の倍数番目にはカンマ" , "も追加します。
ループを抜けたら文字列c_sの順番を逆にして出力します。

# 解答例1
# 入力
n = gets.to_i
# n を文字列に変換して左右逆にする
r_s = n.to_s.reverse
# r_s 末尾のインデックス
e_i = r_s.length - 1
# c_s を空文字列で初期化
c_s = ""

# i=0 から e_i までカウントアップしながら繰り返す
0.upto(e_i) do |i|
  # r_s[i] を文字列 c_s に追加
  c_s += r_s[i]
  # 末尾以外かつ 3 の倍数のなら文字列 c_s にカンマ"," を追加
  if i != e_i && (i + 1) % 3 == 0
    c_s += ","
  end
end
# 左右反転させてカンマ付きの文字列を元に戻す
c_s.reverse!
# 出力
puts(c_s)
Ruby解答例2

gsubメソッドと正規表現を使った置換で3桁毎にカンマ","を追加して出力しています。

# 解答例2
# 入力
n = gets.to_i
# 3 桁毎に "," を挿入した文字列を生成
s = n.to_s.gsub(/(\d)(?=(\d{3})+(?!(\d)))/, '\1,')

# 出力
puts(s)
Python解答例1

入力文字列を整数型に変換し変数nに格納、整数nを文字列に変換して順番を逆にした文字列変数r_sを用意します。
空の文字列c_sを用意して、i=0からary末尾のインデックスe_iまでカウントアップするループを設定し、文字列s先頭から順に参照します。
文字列c_ss[i]を追加、配列sの末尾以外かつ、3の倍数番目にはカンマ" , "も追加します。
ループを抜けたら文字列c_sの順番を逆にして出力します。

# 解答例1
# 入力
n = int(input())
# n を文字列に変換して左右逆にする
r_s = str(n)[::-1]
# r_s 末尾のインデックス
e_i = len(r_s) - 1
# s を空文字列で初期化
s = ""

# i=0 から e_i までカウントアップしながら繰り返す
for i in range(e_i + 1):
    # r_s[i] を文字列 c_s に追加
    s += r_s[i]
    # 末尾以外かつ 3 の倍数のなら文字列 c_s にカンマ"," を追加
    if i != e_i and (i + 1) % 3 == 0:
        s += ","
# 左右反転させてカンマ付きの文字列を元に戻す
s = s[::-1]
# 出力
print(s)

今回のまとめ

  • joinメソッドを使って、指定文字列区切りの文字列を生成することが出来る
  • 複雑な条件での指定文字列区切りを行う場合は対象要素を先頭から順に参照して条件に合致した時に指定文字列を追加する

セクション5では繰り返しや条件分岐を使って特定の出力形式を実装しました。

次は、二次元配列の出力です!



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


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






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







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







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







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


-paiza, プログラミング
-

© 2024 じゃいごテック