記事内容
Rubyの基礎を学ぶため、以前から気になっていたPaizaでRuby入門を学習。
その後、学んだ知識を試すべくスキルチェック問題に挑戦したときに感じた最低限必要な知識をまとめてみました!
前提
言語:Ruby
標準入力・出力について
まず最初に立ちはだかる標準入力についてご説明します。
標準入力とは、シンプルに言うと値を受け取る
ことです。
標準出力とは、受け取った値を画面に出力する
ことでです。
rubyではgetsメソッド
を使用することで、入力された要素を受け取ることができます。
foo # 入力された要素
line = gets # 入力された要素を受け取り、line変数に格納
puts line
出力結果
foo
上記のプログラムでは、入力された要素をgetsメソッドで受け取り、受け取った要素をputsメソッドで出力しています。
スキルチェックでは予め入力されている要素をgetsメソッド
で受け取っていく形になり、その要素をもとに問題を解ていきます。
また、文字列以外にも**「数値」や「一行に複数の要素が存在する場合」****「複数行にわたる要素が存在する場合」**など、様々な条件があり、それぞれ受け取り方も異なります。
前置きが長くなりましたが、要素の受け取り方を条件別に解説していきます。
文字列編
1行 && 複数要素の場合
foo bar # 入力された要素
line = gets.split # 入力された要素を受け取り、line変数に格納
p line
出力結果
["foo","bar"]
split
・・・指定した区切り文字で対象となる文字列を分割して配列にするメソッド
splitメソッドを使用して、入力された文字列の空白部分で分割し、配列で返しています。
※引数に半角スペース(' ')
を指定しても動作は一緒です。
複数行の場合
foo # 1行目の要素
bar # 2行目の要素
line = readlines # 入力された要素を受け取り、line変数に格納
count = line.length # 配列の要素数(2)を取得
count.times do |i|
line[i] = line[i].chomp # 改行を取り除く
end
p line
出力結果
["foo","bar"]
readlines
・・・複数行の文字列を、1行の配列として返してくれるメソッド
length
・・・**「文字列の長さ」と「配列の要素数」**を返してくれるメソッド
※ 今回の場合、readlinesメソッド
を使用して配列として取得したため、後者が適用されています。
chomp
・・・文字列の末尾についた改行を取り除き、新しい文字列を返してくれるメソッド
※ chompメソッド
を使用しないと文字列の末尾に改行\nが入ってしまいます。
["paiza\n", "paiza\n"]
上記のコードを簡略化した場合
line = readlines.map(&:chomp) # オブジェクト.map(&:メソッド名)
出力結果
["foo","bar"] # 出力結果は一緒
map
・・・配列の要素の数だけ繰り返し処理を実行し、**戻り値を配列に返してくれるメソッド
今回の場合、各要素にchompメソッドを適用するため、省略記法を使用しております。
line = readlines.map{ |i| i.chomp } # 省略前
複数行 && 複数要素の場合
foo bar # 1行目の要素
hoge hoge # 2行目の要素
array = [] # 空の配列を作成
while line = gets
array.push(line.chomp.split) # 配列に要素を追加
end
p array
出力結果
[["foo","bar"],["hoge", "hoge"]] # 出力結果
push
・・・配列の末尾に引数を要素として追加するメソッド
まず、入力された要素を格納するため、空の配列を作成しています。
次に、while文で入力された要素をline変数
に代入し、pushメソッド
を使用して空の配列に要素を追加しています。
※ 条件式をline = gets
とすることで入力された要素の数だけ繰り返し処理されます。
数値編
getsメソッド
は「get string」の略で、名前からも分かるように入力された文字列を取得します。
そのため、数値が入力された場合は、to_iメソッド
を使用して文字列から数値へと変換する必要があります。
それ以外は、先ほどの文字列とほぼ同じ方法で要素を受け取ることができます。
10 # 入力されている要素
line = gets.to_i # 数値に変換
puts line
出力結果
10
1行 && 複数要素の場合
10 20 # 入力されている要素
line = gets.split.map(&:to_i)
p line
出力結果
[10, 20] # 出力結果
複数行の場合
10 # 1行目の要素
20 # 2行目の要素
line = readlines.map(&:to_i)
p line
出力結果
[10, 20] # 出力結果
複数行 && 複数要素の場合
10 20 # 1行目の要素
30 40 # 2行目の要素
array = []
while line = gets
array.push(line.split.map(&:to_i))
end
p array
出力結果
[[10, 20],[30,40]] # 出力結果
最後に
恥ずかしながらpaizaで学習するまで標準入力という概念を知りませんでした、、笑
そのため、最初は戸惑いましたが、要素の受け取り方さえ分かればこっちのものです!
また、問題文がややこしく書かれているため、まず、入力例と出力例を確認し、その後、問題文を確認してみると内容が理解しやすいと個人的には感じました。
それでは、自分はこれからBランクを目指す旅に出発します✨
間違っている箇所や分かりづらい箇所が多々あるかと思います。
その際は、気軽にコメントいただけれると幸いです。
最後までご覧いただき、ありがとうございました!