Ruby 複数の標準入力値の取得

競技プログラミングなどでは、プログラムで使う値が「標準入力」で渡されます。 その値の取得方法について。今回は、取得したい値が複数ある場合です。

標準入力値が複数あるとき

(例題)s1, s2, s3の値が標準入力で渡される。 「私は、s1とs2とs3が好きです。」と表示するプログラムを作成。

値は文字列でスペース区切り、最後に改行を含むものとする。

標準入力値の渡され方について、以下2パターンをそれぞれ考えていきます。

  1. 1行に1つの値があり、3行ある場合
  2. 1行に3つの値が並んでいる場合

(1) 1行に1つの値があり、3行ある場合

入力が以下のように3行あった場合です。 標準入力で渡される値はapple, banana, orangeとします。

apple
banana
orange

getsは、1行の文字列を受け取るメソッドです。 複数行の値はどうやって受け取るのでしょうか。 答えは単純。getsをまた書くだけです。

input1 = gets
input2 = gets
input3 = gets
p input1  #=> "apple\n"
p input2  #=> "banana\n"
p input3  #=> "orange\n"

最後の改行\nが入ってしまっているので、chompをつけます。 そして式展開させれば完成。

input1 = gets.chomp
input2 = gets.chomp
input3 = gets.chomp
puts "私は、#{input1}#{input2}#{input3}が好きです。"
#=> 私は、appleとbananaとorangeが好きです。

(2) 1行に3つの値が並んでいる場合

まず、普通に受け取ってみます。

input = gets
p input  #=> "apple banana orange\n"

1つの文字列として受け取りました(\nは改行文字)。 単語ごとに分けたいので、配列に入れてみます。

input = gets.split
p input  #=> ["apple", "banana", "orange"]

splitは、文字列を区切り文字で分割して配列に入れるメソッドです。 split(',')のように引数に指定した任意の文字で分割することができます。 引数を省略すると空白文字(半角スペースや改行文字など)で分割されます。先頭と末尾の空白文字は削除されるので、chompは省略できるようです。

例題の解答例は以下の通り。

input = gets.split
puts "私は、#{input[0]}#{input[1]}#{input[2]}が好きです。"
#=> 私は、appleとbananaとorangeが好きです。

docs.ruby-lang.org

式展開#{ }と配列については以下をご覧ください。

masuyama13.hatenablog.com