paiza プログラミング

[Ruby|Python]paiza 標準入力メニュー セクション1~3(文字列)

paiza_stdin_1-3

今回はpaiza 標準入力メニューセクション1~3(文字列の入力)を解説します。

セクション1複数行の入力データがあった場合に各行の文字列を受け取る問題です。

セクション2セクション3は、1行の中に半角スペース区切りの複数の入力データがあった場合に半角スペースで分割して、各要素の文字列を受け取る問題です。

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

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

セクション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=10n=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メソッドを使う
  • 多重代入で個別に受け取ることもできるし、配列で受け取ることもできる。

標準入力で文字列を受け取る問題を解いてみました。
次のセクションでは文字列から整数値への変換を扱います!



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


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






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







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







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







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


-paiza, プログラミング
-,

© 2024 じゃいごテック