今回はpaiza 標準入力メニューセクション5【特定の文字で区切り 1 行で出力】を解説します。
セクション5は、任意の文字列で区切って1から入力された整数n までを改行区切りで出力する問題です。
本記事で使用しているメソッドについて
解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。
- [Ruby] 標準入力によるデータ取得1
- [Ruby] 標準入力によるデータ取得2
- [Ruby] 標準入力によるデータ取得3
- [Ruby] 標準出力(データを任意に整形して出力する)
- [Ruby]配列の基本操作1
- [Ruby]繰り返し処理
セクション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先頭から順に参照します。
文字列sにary[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先頭から順に参照します。
文字列sにary[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_sにs[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_sにs[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_sにs[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_sにs[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では繰り返しや条件分岐を使って特定の出力形式を実装しました。
次は、二次元配列の出力です!