はじめに
研修でPaizaのRuby編を解くのでメモです。
以下備忘録ですが、フローチャートは常に意識したいですね。。。
✅リンク
・Ruby 2.7.0 リファレンスマニュアル 制御構造
→一通りRubyの構文がまとまっている◎
※過去のPHPに関してまとめ
標準入力
1行の標準入力
getsメソッドを利用
標準入力(実際に入力される値): 2 3
標準出力(期待される出力): 6
解答コード: n1 = gets.to_i n2 = gets.to_i puts n1 * n2
getsはget stringの略で、文字列型として入力を受け取る点に要注意!!
標準入力の分割
1行から複数の値を取得したいケース
splitメソッドを利用する
実際に入力される値: 1 1
期待される出力: 2
解答コード: input = gets numbers = input.split(" ") puts numbers[0].to_i + numbers[1].to_i
🙄正直いまいちスマートな感じはしませんね。。。
each文を利用する
input = gets numbers = input.split(" ") n = 0 numbers.each do |number| n += number.to_i end puts n
🙄こっちの方が配列の要素数が増えても対応できてよさそうですね◎
一番小さい値
実際に入力される値: 10 12 4 8 46
期待される出力: 4
解答コード: array = readlines.map(&:to_i) p array.min
🙄逆に最大値はmaxメソッド。シンプルですね!
文字の一致
実際に入力される値: sato masaru
期待される出力: NG
解答コード:
s1 = gets
s2 = gets
if s1 == s2
puts "OK"
else
puts "NG"
end
数の並び替え
実際に入力される値: 5 3 5 19 1 2
期待される出力: 1 2 3 5 19
解答コード:
array = readlines.map(&:to_i)
puts array.sort.uniq
🙄JSやPHPに比べて圧倒的にメソッドが便利な気が。。。気のせいか??
ですが、これ間違いでして、1番上は配列の個数を表してたみたいです。。。笑
ほかのケースだと不正解になるので変えます。
👇なぜかこれでクリアできました。が、nが不要なのでちゃんと使う感じで書きます。
n = gets array = readlines.map(&:to_i) puts array.sort
これもn不要。。。笑
n = gets array = readlines.map(&:to_i) array.sort.each do |number| puts number end
結果、while文で実装しました。
n = gets.to_i array = readlines.map(&:to_i).sort i = 0 while i < n puts array[i] i += 1 end
🙄これ問題がなんともですね。。。nを使わないと正解できないような問題がよかった。
便利なメソッドまとめ
書き方は{}とdo,endの書き方で2種類。
基本はdo,endを使うことが多いが、{}だと1行で書ける。
※ブロック{}付きのメソッドをイテレータと呼ぶ
・配列の要素の数だけ繰り返し処理をしてくれるmapメソッド
以下通常の書き方
配列の入った変数.map {|変数名| 処理内容 }
以下は、mapの省略記法※各要素にメソッドを適用するとき利用可能
オブジェクト.map(&:メソッド名)
活用例
animal = ["dog", "cat", "koara","bird"] animal.map {|a| a.length}
結果
animalの中身は ["dog", "cat", "koara","bird"] 戻り値は [3, 3, 5, 4]
※eachはレシーバ自体が返ってくる!
【Ruby】array.map(&:method)を理解する
array.map(&:メソッド名)の(&:メソッド名)部分は:メソッド名.to_proc.callを省略した形!!
def slow Array.map { |i| i.to_s} end def fast Array.map(&:to_s) end
※map!メソッドの利用
→配列の値を処理結果に置き換えたい場合に使用
🙄とにかく記述を簡略化できる。
Rubyのmap, map!メソッドの使い方
Ruby mapメソッドについて
・置き換えのtrメソッドとgsubメソッド
puts "test".tr("te","TE") # 「TEsT」と出力 puts "test".gsub("te","TE") # 「TEst」と出力
🙄これは試してみてわかるやつですね。。。gsubは正規表現でも使えるみたいなので複雑なパターンで使えそうですね!
結論、trは手軽に使える。gsubは複雑なこともできる。
trとgsubの違いは何ですか?
String#tr
String#gsub
・配列内の数字の合計 sumメソッド
・配列の並び替え sortメソッド
reverseも簡単にできる。
Rubyでsortを使って降順にする方法を現役エンジニアが解説【初心者向け】
・配列から重複した要素を取り除けるuniqメソッド
・正規表現で使うgrepメソッド
配列.grep(オブジェクト)
配列の各要素とオブジェクトの所属関係がtrueかどうかで調べる
Rubyのgrepメソッドの使い方を現役エンジニアが解説【初心者向け】
・小数点関連
・Rubyで数値の切り捨て・切り上げ・四捨五入する
→ceilメソッドで小数点切り上げ
・【Ruby】to_fメソッドの使い方を理解しよう
→小数点以下も表示させたいときに使用
知っておくべきことまとめ
✅事前知識(便利です!!)
・”puts k ,n”のように書くと2つの変数が改行されて出力される
・getsはString、readlinesはArrayクラスになる
・ArrayとHashでeachメソッドの挙動が変わる
・配列の比較は超簡単※ 配列 – 配列や配列 & 配列
・num = [*1..5]とすると連番で作れる
・chompによる改行コード削除
※末尾の改行コードを削除する(ない場合は何もしない。)
【Ruby入門】chomp、chop、strip、gsubによる改行の削除徹底比較!
繰り返し処理の応用。
「array << ‘hoge’」でpush代わりになる。
👇その他目を通しておきたい記事。
ruby 配列 基本操作まとめ
→基本的な部分が簡潔によくまとまっている。
【Ruby】ファイル読み込みメソッドまとめ
→readlinesやgetsなどの処理内容(nil時の返り値まで)を簡潔にまとめられていて参考になります。
・Ruby 2.7.0 リファレンスマニュアル 制御構造
→一通りRubyの構文がまとまっている◎
・【Ruby・Rails】三項演算子(条件演算子)を使ってif文をスリムに書こう!
・Rubyで配列に要素を追加・挿入する:push, insert, unshift
✅puts/pring/pの違い
stringの場合、putsは改行する、printは改行しない、pはダブルクォーテーション含めて出力
以下は備忘録。
※putsは出力済みの内容から頭も改行するがpは改行しない。
実際に入力される値: 10 12 4 8 46
pはデバッグ用
解答コード: line = readlines.map(&:to_i) p line # print line # これも同じ※to_sメソッドで文字列になる
出力: [10, 12, 4, 8, 46]
🙄配列で出力されます
たとえば文字列をもった変数をpで出力するとコロンもクォートも込みで出力される。
s = "test" p s # 「"test"」と出力
🙄これは面白いですね~putsとうまく併用していく必要がありそう。
putsはto_sメソッドで文字列で改行されて出力
解答コード: line = readlines.map(&:to_i) puts line
出力: 10 12 4 8 46
🙄1つの要素ごとに改行されて出力されますね
Rubyの変数について
@変数(インスタンス変数)
→クラス内で全メソッドで共通して使用することが出来る。
@@変数(クラス変数)
→そのクラスおよびそこから生成されるオブジェクト(インスタンス)の中ならどこからでも参照可能。※あまり使わないそう。
ローカル変数
→変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終わりまで。
★アクセサがあるものはクラス外から呼び出せる
★@はアクセサがなくても定義できるがクラス外からは呼び出せない
rubyの変数について
→Progateでは@変数(インスタンス変数)や@@変数(クラス変数)について、あまり触れられていなかったので上記記事は参考になりました。
おわりに
メソッドによっても出力内容が大きく変わるのは注意したいところ。。。
また、前述したが、JSやPHPに比べて圧倒的にメソッドが便利な気がする。気のせいか??
もうちょい深堀していきたい!!
コメントを残す