Rubyによる標準入力と言語仕様深堀

はじめに

研修でPaizaのRuby編を解くのでメモです。

以下備忘録ですが、フローチャートは常に意識したいですね。。。

アルゴリズムとフローチャート

✅リンク

レベルアップ問題集

Ruby 2.7.0 リファレンスマニュアル 制御構造
→一通りRubyの構文がまとまっている◎

※過去のPHPに関してまとめ

PHPによる標準入力

標準入力

参考:Ruby 標準入力から値を受け取る方法

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

🙄こっちの方が配列の要素数が増えても対応できてよさそうですね◎

一番小さい値

参考:rubyで配列の要素の最大値と最小値を取得

実際に入力される値:
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を使わないと正解できないような問題がよかった。

便利なメソッドまとめ

eachメソッド

書き方は{}と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を省略した形!!

&amp;:メソッド名はブロック変数渡しより若干高速

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メソッド

Rubyで配列の要素を合計するベストな方法

・配列の並び替え 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メソッドの挙動が変わる

Hashに対する繰り返し※Eachメソッドなど

・配列の比較は超簡単※ 配列 – 配列や配列 & 配列

2つの配列から重複を省いたり、重複を得たり

・num = [*1..5]とすると連番で作れる

[ruby]連番の配列を用意する

・chompによる改行コード削除

※末尾の改行コードを削除する(ない場合は何もしない。)

【Ruby入門】chomp、chop、strip、gsubによる改行の削除徹底比較!

Rubyのbreakとnextの使い方

繰り返し処理の応用。

ruby 配列 基本操作まとめ

「array << ‘hoge’」でpush代わりになる。

👇その他目を通しておきたい記事。

ruby 配列 基本操作まとめ
→基本的な部分が簡潔によくまとまっている。

【Ruby】ファイル読み込みメソッドまとめ
→readlinesやgetsなどの処理内容(nil時の返り値まで)を簡潔にまとめられていて参考になります。

Ruby 2.7.0 リファレンスマニュアル 制御構造
→一通りRubyの構文がまとまっている◎

【Ruby・Rails】三項演算子(条件演算子)を使ってif文をスリムに書こう!

Rubyで配列に要素を追加・挿入する:push, insert, unshift

 

✅puts/pring/pの違い

参考:【ruby】p pp puts print 違い。

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に比べて圧倒的にメソッドが便利な気がする。気のせいか??

もうちょい深堀していきたい!!

コメントを残す