今回はpaiza 標準入力メニューセクション1~3(文字列の入力)を解説します。
セクション1は複数行の入力データがあった場合に各行の文字列を受け取る問題です。
セクション2・セクション3は、1行の中に半角スペース区切りの複数の入力データがあった場合に半角スペースで分割して、各要素の文字列を受け取る問題です。
目次
本記事で使用しているメソッドについて
解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。
- [Ruby] 標準入力によるデータ取得1
- [Ruby] 標準入力によるデータ取得2
- [Ruby] 標準入力によるデータ取得3
- [Ruby] 標準出力(データを任意に整形して出力する)
- [Ruby]配列の基本操作1
- [Ruby]繰り返し処理
セクション1:【行入力】1,000 行の入力
1-STEP1: 1 行の入力 (paizaランク D 相当)
1行の文字列入力を受け取り、そのまま出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" paiza EOS OUTPUT1 = <<~"EOS" paiza EOS INPUT2 = <<~"EOS" Paiza21 EOS OUTPUT2 = <<~"EOS" Paiza21 EOS INPUT3 = <<~"EOS" paiza813 EOS OUTPUT3 = <<~"EOS" paiza813 EOS
Ruby解答例1
getsメソッドで標準入力から1行分の入力データを受け取り、chompメソッドで末尾の改行コードを除去した文字列を、変数s に代入し、putsメソッドで文字列の変数sを出力します。
# 解答例1 # 入力 s = gets.chomp # 出力 puts(s)
Ruby解答例2
解答例1からchompメソッドを抜いても正解となります。
putsメソッドは、末尾に改行が無い場合は改行を追加し、改行がある場合はそのまま出力するためです。
# 解答例2 # 入力 s = gets # 出力 puts(s)
Python解答例
Pythonのinput()メソッドは末尾に改行が付かないので、そのまま変数sに代入出来ます。
# 解答例 # 入力 s = input() # 出力 print(s)
1-STEP2: 2 行の入力 (paizaランク D 相当)
2行分の文字列入力を受け取り、受け取った順に改行区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" paiza gino EOS OUTPUT1 = <<~"EOS" paiza gino EOS INPUT2 = <<~"EOS" heisei31 reiwa1 EOS OUTPUT2 = <<~"EOS" heisei31 reiwa1 EOS INPUT3 = <<~"EOS" 2012021300 2020042218 EOS OUTPUT3 = <<~"EOS" 2012021300 2020042218 EOS
Ruby解答例1
getsメソッドを2回実行すれば、2行分のデータを受け取ることが出来ます。
# 解答例1 # 入力 s = gets.chomp t = gets.chomp # 出力 puts(s) ptus(t)
Ruby解答例2
そのまま出力するだけなので、chompを省略してもOKです。
# 解答例2 # 入力 s = gets t = gets # 出力 puts(s) ptus(t)
Python解答例
# 解答例 # 入力 s = input() t = input() # 出力 print(s) print(t)
1-STEP3: 3 行の入力 (paizaランク D 相当)
3行分の文字列入力を受け取り、受け取った順に改行区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" abc def ghi EOS OUTPUT1 = <<~"EOS" abc def ghi EOS INPUT2 = <<~"EOS" line_1 line_2 line_3 EOS OUTPUT2 = <<~"EOS" line_1 line_2 line_3 EOS INPUT3 = <<~"EOS" Haveagood C++ life! EOS OUTPUT3 = <<~"EOS" Haveagood C++ life! EOS
Ruby解答例1
今までの流れから当然、getsメソッドを3回実行すれば、3行分のデータを受け取ることが出来ます。
ただ、さすがにこれ以上増えると、ちょっと面倒になってきますね。
# 解答例1 # 入力 s = gets.chomp t = gets.chomp u = gets.chomp # 出力 puts(s) ptus(t) ptus(u)
Ruby解答例2
そのまま出力するだけなので、chompを省略してもOKです。
# 解答例2 # 入力 s = gets t = gets u = gets # 出力 puts(s) ptus(t) ptus(u)
Python解答例
# 解答例 # 入力 s = input() t = input() u = input() # 出力 print(s) print(t) print(u)
1-STEP4: 10 行の入力 (paizaランク D 相当)
10行分の文字列入力を受け取り、受け取った順に改行区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" one two three four five six seven eight nine ten EOS OUTPUT1 = <<~"EOS" one two three four five six seven eight nine ten EOS
Ruby解答例1
各行の文字列を一旦、配列aryに格納してから、putsメソッドで配列aryの先頭から順に出力します。
putsメソッドの引数に配列を与えると、配列の先頭から順に改行を入れて出力してくれます。
# 解答例1 n = 10 # n = 10 行分の入力を配列 ary に格納 ary = [] n.times do # 配列末尾に入力文字列を追加する ary.push(gets.chomp) end # 配列の先頭から順番に出力 puts(ary)
Ruby解答例2
timesメソッドで10回のループを設定し、ループの中で10行分の入力・出力を行います。
# 解答例2 n = 10 # n = 10 行分の入力を出力する n.times do # 1行分の入力受け取り s = gets.chomp # 出力 puts(s) end
Ruby解答例3
一応、ステップ3までの方法で解くことも出来ます。
# 解答例3 # 入力 s0 = gets.chomp s1 = gets.chomp s2 = gets.chomp s3 = gets.chomp s4 = gets.chomp s5 = gets.chomp s6 = gets.chomp s7 = gets.chomp s8 = gets.chomp s9 = gets.chomp # 出力 puts(s0) ptus(s1) ptus(s2) ptus(s3) ptus(s4) ptus(s5) ptus(s6) ptus(s7) ptus(s8) ptus(s9)
Python解答例
Ruby解答例1をPython風に翻訳してみました。
# 解答例 n = 10 # n = 10 行分の入力を配列 ary に格納 ary = [] for _ in range(n): # 配列末尾に入力文字列を追加する ary.append(input()) # 配列の先頭から順番に出力 for s in ary: print(s)
1-FINAL: 【行入力】1,000 行の入力 (paizaランク D 相当)
1000行分の文字列入力を受け取り、受け取った順に改行区切りで出力する問題です。
入出力例
一部省略します。
# 入出力例 INPUT1 = <<~"EOS" paiza0 paiza1 ・ 省略 ・ paiza998 paiza999 EOS OUTPUT1 = <<~"EOS" paiza0 paiza1 ・ 省略 ・ paiza998 paiza999 EOS
Ruby解答例1
さすがに1,000行ともなると繰り返し処理を使うしかないですね。
ステップ4問題の、 n=10 を n=1000 に修正するだけで、1000行のデータ受け取りに対応出来ます。
# 解答例1 n = 1000 # n = 1000 行分の入力を配列 ary に格納 ary = [] n.times do # 配列末尾に入力文字列を追加する ary.push(gets.chomp) end # 配列の先頭から順番に出力 puts(ary)
Ruby解答例2
# 解答例2 n = 1000 # n = 1000 行分の入力を出力する n.times do # 1行分の入力受け取り s = gets.chomp # 出力 puts(s) end
Python解答例
# 解答例 n = 1000 # n = 1000 行分の入力を配列 ary に格納 ary = [] for _ in range(n): # 配列末尾に入力文字列を追加する ary.append(input()) # 配列の先頭から順番に出力 for s in ary: print(s)
セクション2:【半角スペース区切りでの文字列の分割】5 つの文字列の半角スペース区切りでの分割
2-STEP1: 2 つの文字列の半角スペース区切りでの分割 (paizaランク D 相当)
文字列 "Hello paiza" を半角スペースで分割して2つの文字列を受け取り、先頭から順に改行区切りで出力する問題です。
Ruby解答例1
区切り文字(半角スペース)で文字列を分割するにはsplitメソッドを使います。
splitメソッドは、元の文字列を、引数で与えた文字列で分割された配列を返します。
# 解答例1 s = "Hello paiza" # 文字列s をスペースで分割 words = s.split(" ") # 配列 words の先頭から順に出力 puts(words)
Ruby解答例2
splitメソッドで生成された配列の要素数と同じ要素数の変数で受け取ることも出来ます。(多重代入)
# 解答例2 s = "Hello paiza" # 文字列s をスペースで分割して word0, word1 に多重代入 word0, word1 = s.split(" ") # 出力 puts(word0) puts(word1)
Python解答例
Pythonにもsplit()メソッドが用意されています。
# 解答例 s = "Hello paiza" # 入力 words = s.split(" ") # 配列 words の先頭から順に出力 for word in words: print(word)
2-STEP2: 3 つの文字列の半角スペース区切りでの分割 (paizaランク D 相当)
文字列 "He likes paiza" を半角スペースで分割して3つの文字列を受け取り、先頭から順に改行区切りで出力する問題です。
Ruby解答例1
要素数が変わっても、STEP1のコードそのままで入力を受け取ることが出来ます。
# 解答例1 s = "He likes paiza" # 文字列s をスペースで分割 words = gets.split(" ") # 配列 words の先頭から順に出力 puts(words)
Ruby解答例2
多重代入の場合は、左辺(変数)と右辺(配列)の要素数を合わせる必要があります。
要素数が合わない場合、余った要素は捨てられ、足りない要素にはnilが代入されます。
# 解答例2 s = "He likes paiza" # 文字列s をスペースで分割 word0, word1, word2 = gets.split(" ") # 出力 puts(word0) puts(word1) puts(word2)
Python解答例
# 解答例1 s = "He likes paiza" # 文字列s をスペースで分割 words = s.split(" ") # 配列 words の先頭から順に出力 for word in words: print(word)
2-FINAL: 【半角スペース区切りでの文字列の分割】5 つの文字列の半角スペース区切りでの分割 (paizaランク D 相当)
文字列 "one two three four five" を半角スペースで分割して5つの文字列を受け取り、先頭から順に改行区切りで出力する問題です。
STEP2と同様、要素数がいくつになっても基本的なコードは変わりません。
Ruby解答例1
# 解答例1 s = "one two three four five" # 文字列s をスペースで分割 words = s.split(" ") # 配列 words の先頭から順に出力 puts(words)
Ruby解答例2
# 解答例2 s = "one two three four five" # 文字列s をスペースで分割 word0, word1, word2, word3, word4 = s.split(" ") # 出力 puts(word0) puts(word1) puts(word2) puts(word3) puts(word4)
Python解答例
# 解答例 s = "one two three four five" # 文字列s をスペースで分割 words = s.split(" ") # 配列 words の先頭から順に出力 for word in words: print(word)
セクション3:【半角スペース区切りの入力】半角スペース区切りの 1,000 個の入力
3-STEP1: 1 つの入力 (paizaランク D 相当)
1行分の文字列入力を受け取り、そのまま出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" hello EOS OUTPUT1 = <<~"EOS" hello EOS INPUT2 = <<~"EOS" 8132020 EOS OUTPUT2 = <<~"EOS" 8132020 EOS INPUT3 = <<~"EOS" paiza813 EOS OUTPUT3 = <<~"EOS" paiza813 EOS
Ruby解答例1
セクション1のSTEP1と同じ内容ですね。復習のつもりで解いてみましょう。
# 解答例1 # 入力 s = gets.chomp # 出力 puts(s)
Ruby解答例2
# 解答例2 # 入力 s = gets # 出力 puts(s)
Python解答例
# 解答例 # 入力 s = input() # 出力 print(s)
3-STEP2: 半角スペース区切りの 2 つの入力 (paizaランク D 相当)
入力された文字列を半角スペースで分割して2個の文字列を受け取り、先頭から順に改行区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" hello paiza EOS OUTPUT1 = <<~"EOS" hello paiza EOS INPUT2 = <<~"EOS" 81 3 EOS OUTPUT2 = <<~"EOS" 81 3 EOS INPUT3 = <<~"EOS" hello 813 EOS OUTPUT3 = <<~"EOS" hello 813 EOS
Ruby解答例1
標準入力の受け取りが追加されましたが、基本的なコードはセクション2と変わりません。
# 解答例1 # 入力 ary = gets.chomp.split(" ") # 出力 puts(ary)
Ruby解答例2
# 解答例2 # 入力 s1, s2 = gets.chomp.split(" ") # 出力 puts(s1) puts(s2)
Python解答例
# 解答例 # 入力 ary = input().split(" ") # 出力 for s in ary: print(s)
3-STEP3: 半角スペース区切りの 3 つの入力 (paizaランク D 相当)
入力された文字列を半角スペースで分割して3個の文字列を受け取り、先頭から順に改行区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" good morning paiza EOS OUTPUT1 = <<~"EOS" good morning paiza EOS INPUT2 = <<~"EOS" 8 1 3 EOS OUTPUT2 = <<~"EOS" 8 1 3 EOS
Ruby解答例1
# 解答例1 # 入力 ary = gets.chomp.split(" ") # chomp は省略してもOK! # 出力 puts(ary)
Ruby解答例2
# 解答例2 # 入力 s1, s2, s3 = gets.chomp.split(" ") # chomp は省略してもOK! # 出力 puts(s1) puts(s2) puts(s3)
Python解答例
# 解答例 # 入力 ary = input().split(" ") # 出力 for s in ary: print(s)
3-STEP4: 半角スペース区切りの 10 個の入力 (paizaランク D 相当)
入力された文字列を半角スペースで分割して10個の文字列を受け取り、先頭から順に改行区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" VypymzW25l 3xsXWAK NYwbs2MRC kh4 mr38o8W9 94 fEJ 6THlW fJFTy n EOS OUTPUT1 = <<~"EOS" VypymzW25l 3xsXWAK NYwbs2MRC kh4 mr38o8W9 94 fEJ 6THlW fJFTy n EOS INPUT2 = <<~"EOS" VDHUoNUym oqnbK7XsHK GPuafB yWdzgE bUMaMdBV 3kDU9 AbWnot 1E44Ekwz jdu Y0e EOS OUTPUT2 = <<~"EOS" VDHUoNUym oqnbK7XsHK GPuafB yWdzgE bUMaMdBV 3kDU9 AbWnot 1E44Ekwz jdu Y0e EOS INPUT3 = <<~"EOS" F5G6 0KSYzlF ghYYhAw NHCSxgPMbE EYqKRElk 8UYzUH 6mxtW 0tt1n 2cEaAQs gAWn EOS OUTPUT3 = <<~"EOS" F5G6 0KSYzlF ghYYhAw NHCSxgPMbE EYqKRElk 8UYzUH 6mxtW 0tt1n 2cEaAQs gAWn EOS
Ruby解答例1
# 解答例1 # 入力 ary = gets.chomp.split(" ") # chomp は省略してもOK! # 出力 puts(ary)
Ruby解答例2
# 解答例2 # 入力 s1, s2, s3, s4, s5, s6, s7, s8, s9, s10 = gets.chomp.split(" ") # chomp は省略してもOK! # 出力 puts(s1) puts(s2) puts(s3) puts(s4) puts(s5) puts(s6) puts(s7) puts(s8) puts(s9) puts(s10)
Python解答例
# 解答例 # 入力 ary = input().split(" ") # 出力 for s in ary: print(s)
3-FINAL: 【半角スペース区切りの入力】半角スペース区切りの 1,000 個の入力 (paizaランク D 相当)
入力された文字列を半角スペースで分割して1000個の文字列を受け取り、先頭から順に改行区切りで出力する問題です。
入出力例
一部省略します。
# 入出力例 INPUT1 = <<~"EOS" FCrj 7A7SbR9i .. 省略 .. pNeapDUhm hQ7rm2yyo EOS OUTPUT1 = <<~"EOS" FCrj 7A7SbR9i . . 省略 . . pNeapDUhm hQ7rm2yyo EOS
Ruby解答例
セクション3の最終問題ですが、入力データを配列で受け取る場合、要素数が10個から1000個になっても今までとコードは変わりません。
# 解答例 # 入力 ary = gets.chomp.split(" ") # chomp は省略してもOK! # 出力 puts(ary)
Python解答例
# 解答例 # 入力 ary = input().split(" ") # 出力 for s in ary: print(s)
今回のまとめ
- n行の文字列の受け取りは、n回、getsメソッドを実行する。
- 半角スペース(区切り文字)で区切られた文字列の受け取りは、splitメソッドを使う。
- 多重代入で個別に受け取ることもできるし、配列で受け取ることもできる。
標準入力で文字列を受け取る問題を解いてみました。
次のセクションでは文字列から整数値への変換を扱います!