Ruby 標準入力から値を受け取る方法


はじめに

Paizaのプログラミング問題で標準入力を使い、値を持ってくる方法がいくつかあったのでメモ

前提

使用する言語はRubyです

一行に一要素だけしか存在しない場合

標準入力
Tokyo
line = gets
p line
出力結果
"Tokyo"

一行に複数要素存在する場合

標準入力
Tokyo Osaka Kyoto
line = gets.split(' ')
p line
出力結果
["Tokyo", "Osaka", "Kyoto"]

splitを使用することで3つの要素をそれぞれ別のものとして配列に格納しています

※splitの使い方

splitはsplit('')のシングルクォート内の文字で文字列を分解する
例えば、Tokyoという文字をそれぞれ一文字ずつ取得したければ、シングルクォートの中に何も入れずにすると下記のように取得できる

標準入力
Tokyo
line = gets.split('')
p line
出力結果
["T", "o", "k", "y", "o"]

複数行に一つずつ要素が存在する場合

標準入力
Tokyo
Osaka
Kyoto
line = readlines
len = line.length
i = 0

while i < len
    line[i] = line[i].chomp
    i += 1
end

p line 
出力結果
["Tokyo", "Osaka", "Kyoto"]

上記のものの簡潔な書き方として、mapを使用したものがあります

標準入力
Tokyo
Osaka
Kyoto
line = readlines.map(&:chomp)
p line 
出力結果
["Tokyo", "Osaka", "Kyoto"]

複数行に複数要素が存在する場合

標準入力
Tokyo Osaka Kyoto
Japan USA China
line = readlines
len = line.length
i = 0

while i < len
    line[i] = line[i].chomp.split(' ')
    i += 1
end

p line
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]

上記のものの簡潔な書き方として以下のものもあります

標準入力
Tokyo Osaka Kyoto
Japan USA China
lines = []
while line = gets
    lines << line.chomp.split(' ')
end
p lines
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]

while line = getsとすることで、標準入力の値を全て取得するまで繰り返されます

より簡単な方法をコメントでいただいたので追記

標準入力
Tokyo Osaka Kyoto
Japan USA China
lines = readlines(chomp: true).map{|line| line.split(' ')}
p lines
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]

出力結果を見ると、受け取った値は文字列なので数値を受け取りたい場合は次のようにします

数値として受け取りたい場合

一行に一要素だけしか存在しない

標準入力
123
line = gets.to_i
p line
出力結果
123

一行に複数要素存在する場合

標準入力
1 2 3
line = gets.split(' ')
p line
出力結果
["1", "2", "3"]

このままだと文字列として扱われるので、mapを使用して数値型の配列に変換します

標準入力
1 2 3
line = gets.split(' ').map(&:to_i)
p line
出力結果
[1, 2, 3]

複数行に一つずつ要素が存在する場合

標準入力
1
2
3
line = readlines.map(&:to_i)
p line 
出力結果
[1, 2, 3]

複数行に複数要素が存在する場合

標準入力
1 2 3
4 5 6
lines = []
while line = gets
    lines << line.chomp.split(' ').map(&:to_i)
end
p lines
出力結果
[[1, 2, 3], [4, 5, 6]]

より簡潔に書く方法

標準入力
1 2 3
4 5 6
lines = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p lines
出力結果
[[1, 2, 3], [4, 5, 6]]