3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】はじめてのスキルチェック:標準入力のやさしい解釈

Last updated at Posted at 2020-05-01

何をしてよいかわからない人を救いたい

四則演算や条件分岐、ループ処理は勉強したものの、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メソッドを使って数値型に変換しますよ、という意味です。

さいごに

入力に関するメソッドは使う機会が少なく、ここがネックでスキルチェックをはじめられなかった経験があり、記事にまとめて見ました。はじめられさえすれば、あとはこの延長上にある、と信じて。
なにを読んでもよくわからなくて、どこから手をつけて良いかわからない…となったわたしのような難民は、もしかして、この世に存在しないのかもしれないなと思いつつ。迷っている誰かがいたら届けばうれしいです。ここまで読んでいただき、ありがとうございました。

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?