paizaでRubyを特訓中です。
キリがいいと思ったので、基本的な標準入力と出力方法について残します。
標準入力とは
めっちゃ大雑把にいうと、キーボードから入力される値です。
キーボードからの入力じゃない時は値をファイルにまとめて入力したりもします。
僕的には、この方々の説明がわかりやすかったです。
標準入出力とは?プログラミングテストの過去問で解説
標準入力とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
一つのデータを入力
文字列の場合
入力値 abc
期待される出力 abc
input = gets
puts input # -> abc
数値の場合
入力値 123
期待される出力 123
input = gets.to_i
puts input # -> 123
入力される値は問答無用でstring型に変換されますので、to_iメソッドを使ってinteger型にしましょう!
出力を複数行にする
文字列の場合
入力値
abc
期待される出力
a
b
c
1行で入力したものを複数行の出力にしてみます。
input = gets.chomp.split("")
# -> ["a", "b", "c"]
puts input
順番に説明します。
chompメソッドを使って入力値から改行を抹殺します。String型だとデフォルトだと末尾に改行がくっついちゃってるんで配列にした時改行コードも入っちゃいます。(["a", "b", "c", "\n"]のように)
詳しくはこちらから
String#chomp (Ruby 3.0.0 リファレンスマニュアル)
次にsplitメソッドを使って配列にします。引数を("")とすることで一文字ずつ分けてくれます。
※(" ")にすると空白を境に区切って配列に入れてくれます。
数値の場合
input = gets.split("").map(&:to_i)
# -> [1, 2, 3]
puts input
splitメソッドを使って同じように配列に入れたいのですが、そのまま入れると["1", "2", "3"]こんな風に文字列になっちゃいます。
「そんなのかんけーねぇ」な人はそのままでもいいですが、僕は嫌なので数値に変換します。
その時登場するのがmapメソッドです。配列の中身を一つずつ引っ張り出して処理してくれるいいやつなので仲良くなることをお勧めします。
公式リファレンスでは
# すべて 3 倍にした配列を返す
p (1..3).map {|n| n * 3 } # => [3, 6, 9]
こんな書き方をしてますが、
array.map(&:to_i)
array.map{|n| n.to_i}
上の二つは同じ処理をしています。
なんで、(&:to_i)みたいな書き方をしてるの? &って何?と思った方はこちらの方が詳しく説明してくださっていますのでご覧ください。
【Ruby】array.map(&:method)を理解する
複数行の入力
文字列の場合
入力値
a
b
c
期待される出力
a
b
c
while input = gets
puts input
end
while文を使って入力される値がなくなるまで繰り返し処理をして、出力してくれます。
for inを使ったり、timesメソッドを使ったりする方法はあると思いますが、特に行数の指定を気にしないのであれば、これが一番シンプルだと思います。
数値の場合
while input = gets.to_i
puts input
end
まあこれは説明しなくてもわかりますね。
まとめ
標準入力なんで、使わなくない?と思っていましたが、これらを理解することで、配列が絡んでくるアルゴリズムを書くのが、かなり楽になった気がします。
ですので、苦手だな〜って思っている人はやってみてください