何をしてよいかわからない人を救いたい
四則演算や条件分岐、ループ処理は勉強したものの、Paizaのようなスキルチェックで入力された値をどう取得してどう使うのかがわからない。これは、もはや問題を解くという次元ではない!!
わたしも同じ気持ちでした。もしかして、わたしだけなんですか? 何はともあれ、まとめておきます。戒め。
基本的な評価方法
① 入力 → ② なんらかの処理 → ③ 出力
上記でいう「② なんらかの処理」だけを書けばOKというものもありますが、特にPaizaのように、この一連の流れをコードで記述することが求められるものもあります。
しばしば問題文と一緒に「入力される値の例」と「期待される出力の例」が書いてあります。そして、これをヒントにコードを考えていきます。入力された値が取得できているか(できなかったのが筆者である)、意図した通りの処理になっているか、期待した結果が出力されているか、このいずれもを満たしていないとコードとして成り立ちません。
おさえておきたいメソッド
getsメソッド
入力した値を文字列として受け取るメソッドです。
input = gets
上の場合、変数(ここではinput)に、入力された値を代入する、という意味です。
コードを実行したときに入力待ちになる行、ですね。
自分がgetsを記載したところで、問題文にあるような「入力される値の例」が入ってくるものと考えましょう。
*複数行の入力を取得するシンプルな方法
下記のように、入力される行の数だけgetsを書いても取得できます。まずはこの方法を知っておくのもアリだと思います。
input1 = gets
input2 = gets
chompメソッド
改行を無視するメソッドです。
input = gets.chomp
*入力される値の"見えない改行"に注意する
getsで取得した値は、実は"見えない改行"が含まれている! ということに注意してください。
chomp
なしで次の値が入力されたとき
Apple
実は
Apple
(← 改行も含む)
という値になっています。
何が困るか? たとえば、文字列が一致しているかどうかによって条件分岐をさせたいときに困ります。
input = gets.to_s
if input == "Apple"
# ここに一致するときの処理
else
# ここに一致しないときの処理
end
1行目で入力された値「Apple」が変数inputに代入されたとします。しかし、chomp
がついていないので実際に代入されている値は、後ろに見えない改行を含む「Apple」です。
そうすると、いざif文を使ってinputと「Apple」という文字列が一致するかどうかを調べよう! としても、"見えない改行"のせいで一致していない判定になってしまいます。これでは意図しない処理に流れてしまいますね。これを乗り越えるためにchomp
もおさえておきたいです。
to_iメソッド
Integerのi。数値型として扱いたい時につけるメソッドです。
たとえ数字が入力されていても、文字列と認識されていると計算できないので注意です。
input = gets.to_i
to_sメソッド
Stringのs。文字列として扱いたい時につけるメソッドです。
getsメソッドは文字列として返すのがデフォルトなのでto_s
をつけなくても同じ意味になるのですがto_i
とセットで覚えておくとよいでしょう。
input = gets.to_s
# input = gets と同じ意味
splitメソッド
文字列を一定の規則で区切るメソッドです。
# 例1
input1, input2 = gets.split(" ")
# 例2
array = gets.split(" ")
たとえば、下記のように入力される値は半角スペース区切りで与えられますよ、というときがあります。
Tokyo Osaka
splitメソッドがあれば謎の半角スペース区切りも乗り越えられます。splitの後ろの丸かっこで区切り文字(ここでは半角スペース)を指定してあげることで、これを区切りとみなして、それぞれ変数に代入(例1)したり配列(例2)にしたりすることができます。なお、splitメソッドは空文字列で分割されるのがデフォルトのため、この例の場合(" ")
は省略しても大丈夫です。
具体的には、それぞれ下記のような形になります。
# 例1のとき
input1 = Tokyo
input2 = Osaka
# 例2のとき
array = ["Tokyo", "Osaka"]
mapメソッド
配列の数だけ処理を繰り返すメソッドです。
input1, input2 = gets.chomp.split(" ").map(&:to_i)
上の場合は、input1・input2の両方に対してto_iメソッドを使って数値型に変換しますよ、という意味です。
さいごに
入力に関するメソッドは使う機会が少なく、ここがネックでスキルチェックをはじめられなかった経験があり、記事にまとめて見ました。はじめられさえすれば、あとはこの延長上にある、と信じて。
なにを読んでもよくわからなくて、どこから手をつけて良いかわからない…となったわたしのような難民は、もしかして、この世に存在しないのかもしれないなと思いつつ。迷っている誰かがいたら届けばうれしいです。ここまで読んでいただき、ありがとうございました。