はじめに
こんにちは!Ruby学習中の、やま さかな(@YamzknA)と申します。
paizaラーニングやってますか?
やってみるとパズルみたいな感じで楽しいですよね。
でも、標準入力受け取るのが、ひと手間で、ちょっと面倒ですよね。
そこで、入力値を受け取るときに、少し楽になる方法をご紹介します!
前提
3つの紹介項目
この記事では以下の3つの項目についてご紹介します
- 入力を受け取るときに整数型にしておく
- 何度か入力を受け取る場合に配列で受け取る
- 一度の入力でいくつか値を受け取る場合に、分割して処理する
また、最後には3つの小技をすべて合わせて使用すると、こんな風に楽に書けるというものを紹介します。
以下注意事項です
- 言語は
Ruby
です - 筆者はBランクが解ける程度のスキルレベルですので、参考程度に留めてください
また、paizaはスキルチェックにおいて、結構厳しく相談等を禁止していますので、ほかの人と問題について相談する際はご注意ください。
↓↓paizaスキルチェック禁止事項については、以下を参照
それでは、さっそく紹介していきます!
入力を受け取るときに整数型にしておく
入力はgets
では、文字列型として受け取ります。
使うときに毎回処理するのが面倒なので、文字を含まない場合は最初から整数型に変換しておきます。
また、入力の末尾には改行コードが含まれますが、to_iで処理した際に消えます。
(文字を受け取る際に忘れがちなので、僕は考えることをやめ、毎回chompしてます)
#入力が一桁の数字 3 の場合
##getだけで受け取る
hoge = gets
p hoge
=> '3\n' #文字列型、かつ、末尾に改行コード\nが入っている
##gets.to_iまたはgets.chomp.to_iで受け取る
hoge = gets.to_i
fuga = gets.chomp.to_i
=> 3 #整数型となる
↓↓chomp
に関しては、以下を参照
何度か入力を受け取る場合に配列で受け取る
paizaではたびたび、数回分gets
で取得した値を一度に扱いたいことがあります。
その際に文字列として受け取って、毎回処理していると大変なので、最初から配列として受け取ります。
その際に使用するのが、Array.new()
になります。
Array.new(n){}
は配列を新しく作ることができ、引数のn回分ブロック内の処理を行うというものです。
#入力が一桁の数字で、5回分受け取る場合
ary = Array.new(5) { gets.chomp.to_i }
p ary
=> [1, 2, 3, 4, 5]
#5回getsしたので、5つの入力受け取ったことになる
#受け取った値は毎度.chomp.to_iで処理している
↓↓Array.new
に関しては以下を参照
一度の入力でいくつか値を受け取る場合に、分割して処理する
入力として1 3 5 7 9
のように一度でいくつも渡される場合があります。
それらを一つずつ扱いたい場合は、split
で分割してから、map
で処理してしまいます。
ここで使用するmap(&:to_i)
は少し特殊な書き方ですが、やっていることは配列の要素に対して個別に.to_i
を行うというものです。
#入力が複数の数字で、一度に受け取る場合
nums = gets.chomp.split.map(&:to_i)
=> [1, 3, 5, 7, 9]
#文字列'1 3 5 7 9\n'をchompとsplitで処理し→['1', '3', '5', '7', '9']
#それらを個別にto_iした
↓↓map(&:to_i)
に関しては以下の[ mapメソッドの省略した書き方 ]を参照
これまで紹介してきたモノの合わせ技
上記3つのメソッドを合わせることで、複数の値を複数回受け取るといった処理を、1行で書くことができます。
例えば、一行目に以下何行にわたって値があるか記載がある場合で考えます。
4
1 2 3 4 5
2 4 6 8 10
1 3 5 7 9
5 4 3 2 1
num = gets.chomp.to_i
ary = Array.new(num) { gets.chomp.split.map(&:to_i) } #この1行で二次元配列を生成
p ary
=>
[[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [5, 4, 3, 2, 1]]
さいごに
ここまでお付き合いいただき、ありがとうございました。
今回は標準入力をパパっと受け取って、アルゴリズムに向き合うための小技をご紹介しました。
少しでも皆様のお役に立てれば幸いです。