はじめに
こちらの記事は、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メソッドが必須だと思っていましたが、他のメソッドが同じ処理をしてくれている場合は省略し、すっきりしたコードを書くことができますね。