LoginSignup
2
5

More than 3 years have passed since last update.

【Ruby】コーディングテストで使える?標準入力から値を受け取る方法

Posted at

※ 筆者はRuby初心者です。動作確認をしてから投稿していますが、間違いがありましたらコメントや編集リクエストで教えてくださると幸いです。

はじめに

Rubyでコーディングテストを受験する必要がでてきたのですが、筆者はRubyを書いたことがありません。

まず標準入力を受け取れなければ、コーディングテストなんてできません。
標準入力を取得する方法をまとめていきます。

動作環境

  • ruby 2.3.7p456

自宅で眠っていたMac Book Airに標準インストールされていたものを使用します。

標準入力1

超基本として、標準入力として「こんにちは」という文字列を受け取るものとするサンプルです。

ruby;input1.rb
p '文字を入力してください。'
input = gets 
p input

p は、標準出力するという意味です。
p の他に、printputs があるようです。
役割を簡潔にまとめると、

メソッド 使い分け
p デバッグ用。文字列型の場合、ダブルクォーテーションで囲んで表示してくれる。数値はそのまま表示。
print オブジェクトを文字列として表示。
puts オブジェクトを文字列として表示。最後に改行コードつき。

ターミナルを起動して、作成したスクリプトを実行します。
「こんにちは」と入力してEnterを押下すると、下記のように表示されます。

$ ruby input1.rb 
"文字を入力してください。"
こんにちは
"こんにちは\n"

標準出力の最後に\nがついています。
print を使えば、表示されなくなります。
pを使いながら、最後の\nを削除したい場合は、chomp!を使用すればよいとのこと。
参考文献をそのまま引用させていただくと、

chomp!メソッドは、文字列の末尾の改行文字を取り除きます。レシーバ自身を変更するメソッドです。戻り値は、末尾に改行文字があったときはレシーバ自身、なかったときはnilです。

というわけで最後のpchomp!を付与して実行します。

ruby;input1.rb
p '文字を入力してください。'
input = gets 
p input chomp!

実行すると、

$ ruby input1.rb 
"文字を入力してください。"
こんにちは
"こんにちは"

最後の\nが削除されます。

標準入力2

次は、標準入力で「1,あいうえお,かきくけこ」で、「,」区切りで取得したい場合を想定します。

ruby;input2.rb
p '文字を入力してください。'
input = gets.split(',')
p input

上記のようにsplitを使用すると、簡単に「,」区切りで取得できました。

$ ruby input2.rb 
"文字を入力してください。"
1,あいうえお,かきくけこ
["1", "あいうえお", "かきくけこ\n"]

また最後に\nがついているので、前述したchomp! を追加しました。
そうすると、下記のようなエラーになってしまいました。

input1.rb:3:in `<main>': undefined method `chomp!' for ["1", "あいうえお", "かきくけこ\n"]:Array (NoMethodError)
Did you mean?  compact!

配列にchomp! は使用できないのだと推定。
というわけで、ループを回して1単語ごと出力して、そこでchomp! してみる。

input2.rb
p '文字を入力してください。'
lines = gets.split(',')
p lines
for line in lines do
  p line.chomp
end

for文のdoは省略可能とのこと。
普通は省略するのか分かりませんが、doを書いたサンプルになります。
初心者の自分の体感では、doは書いておいて、ブロックを明確にしておいたほうがよいと思いました。
(参考文献が見つからなかったので、あくまで初心者の感覚です。Rubyist的には違うかもしれません。)

これを実行すると、下記のようになります。

$ ruby input2.rb 
"文字を入力してください。"
1,あいうえお,かきくけこ
["1", "あいうえお", "かきくけこ\n"]
"1"
"あいうえお"
"かきくけこ"

標準入力3

いままで使用していたgets では、標準入力の1行分しか取得できません。
複数行取得するためには、readline を使用する必要があります。

以下がサンプルです。
たぶんfor文でもよいのですが、勉強のためにwhile文にしています。

input3.rb
p '文字を入力してください。'
line = readlines
len = line.length
i = 0
while i < len
    line[i] = line[i].chomp
    p line[i]
    i += 1
end
p line

これを実行して、「あ、Enter、い、Enter、う」と標準入力します。
次にcontrol + dを押します。(Macの場合)
そうすると、下記のように表示されます。

$ ruby input3.rb 
"文字を入力してください。"
あ
い
う
"あ"
"い"
"う"
["あ", "い", "う"]

おわりに

これで標準入力には対応できるはず…
もし、コーディングテストの練習を進める中で、ミスなどに気がついたら適宜修正していきます。

参考文献

基礎からわかる!Rubyで標準入力を扱う方法(複数行、配列)
printとputsとpの違いとは (Ruby) - kakuyonの日記
chomp, chomp! (String) - Rubyリファレンス
split (String) - Rubyリファレンス
for文 - 繰り返し - Ruby入門

2
5
4

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
2
5