【Ruby】標準入力の値取得


 はじめに

こちらの記事は、Rubyをある程度学び、下記を考えている方向けの記事となります。

  • 転職を見据えてPaizaのスキルチェックでランクを上げたいと考えている方
  • 競技プログラミングに興味のある方



標準入力 【 standard input(stdin)】 とは

IT用語辞典e-Wordsによりますと、

標準入力とは、コンピュータ上で実行されているプログラムが、特に何も指定されていない場合に標準的に利用するデータ入力元。コンピュータの入力装置やOSが提供するデータ入力機能・経路などを指し、多くのシステムではキーボード装置による利用者の文字入力が標準入力に設定されている。

初心者の方には下記のPaizaFAQの説明が簡単でわかりやすいです。

標準入力はプログラムに値を渡す入力元のこと、標準出力はプログラムから出力される値の出力先のことをいいます。標準入力の仕組みを使うと、キーボードやファイルなど外部から値(データ)をプログラムに与えることができます。

もっと詳しく知りたい方はこの記事の説明が理解しやすいと思います。
cpコマンドの動きを例に入力/出力、標準という点がわかりやすく説明されています。
標準入力・標準出力ってなに?

こちらはマンガで視覚的に学べます。
「標準入力」 ~マンガでプログラミング用語解説



1行に1つの要素だけの場合

文字列

標準入力
apple
値取得
str = gets.chomp
出力結果
p str
=> "apple"

整数

標準入力
123
値取得
# to_iメソッドが改行も含め整数に変換するので、chompメソッドは不要
int = gets.to_i
出力結果
p int
=> 123

1行に複数の要素がある場合

文字列

標準入力
apple banana cherry
値取得
# 引数を省略した場合空白文字(半角スペース、改行、タブ)で区切るのでchompメソッド不要
# split(' ')でも同じ結果になる
str = gets.split
出力結果
p str
# 配列として格納される
=> ["apple", "banana", "cherry"]

値をそれぞれ変数に格納したい場合(多重代入)

値取得/出力結果
str_1, str_2, str_3 = gets.split

p str_1 => "apple"
p str_2 => "banana"
p str_3 => "cherry"

整数

標準入力
1 2 3
値取得
int = gets.split.map(&:to_i)
出力結果
p int
=> [1, 2, 3]

値をそれぞれ変数に格納したい場合(多重代入) ※ Paiza等で良く使う

値取得/出力結果
int_1, int_2, int_3 = gets.split.map(&:to_i)

p int_1 => 1
p int_2 => 2
p int_3 => 3

複数行に1つずつの要素だけの場合

文字列

標準入力
apple
banana
cherry
値取得
str = readlines.map(&:chomp)
出力結果
p str
# 配列として格納される
=> ["apple", "banana", "cherry"]

整数

標準入力
1
2
3
値取得
int = readlines.map(&:to_i)
出力結果
p int
# 配列として格納される
=> [1, 2, 3]

複数行に複数の要素がある場合

文字列

標準入力
apple banana cherry
durian grape peach
値取得
str = readlines.map { |s| s.split }
出力結果
p str
# 多次元配列として格納される
=> [["apple", "banana", "cherry"], ["durian", "grape", "peach"]]

多次元配列を一次元にしたい場合

arr = str.flatten
p arr
=> ["apple", "banana", "cherry", "durian", "grape", "peach"]

整数

標準入力
1 2 3
4 5 6
値取得
int = readlines.map { |i| i.split.map(&:to_i) }
出力結果
# 多次元配列として格納される
p int
=> [[1, 2, 3], [4, 5, 6]]

多次元配列を一次元にしたい場合

arr = int.flatten
p arr
=> [1, 2, 3, 4, 5, 6]

 まとめ

RubyやRailsを勉強した後、Paizaのスキルチェックに挑戦した際に、標準入力の値取得で大コケしたのをきっかけにこの記事を書きました。

この記事を書くにあたって、splitメソッドや、to_iメソッドがどこまでを対象に処理するのかということが理解でき大変勉強になりました。
今まで値取得時にはchompメソッドが必須だと思っていましたが、他のメソッドが同じ処理をしてくれている場合は省略し、すっきりしたコードを書くことができますね。