Rubyの問題を解いて知識を深める③

# はじめに
今日も問題を解いていきます。コメントで教えていただ通り自分用なので限定共有投稿です。

# Q11 if else問題
in1to10メソッドを実装する
- 第一引数のnumが1以上かつ10以下の範囲であればTrueを出力すること
- 第二引数のoutside_modeがTrueの場合は、第一引数numが条件範囲外でもTrueを出力すること
- それ以外はFalseを出力すること
雛形
```
def in1to10(num,outside_mode)
  # ここに条件式を記述する
end
in1to10(5,false)
in1to10(11,false) 
in1to10(11,true) 
```
```
def in1to10(num,outside_mode)
  if (num >= 1 && num <= 10) || outside_mode
    puts true
  else
    pits false
  end
end
in1to10(5,false)
in1to10(11,false) 
in1to10(11,true) 
```
ポイントは`&&`と`||`、論理演算子です。
&&はどちらもtrueの場合
||はどちらかがtrueの場合

# Q12 インスタンスの生成
クラスfruit以下のように定義する。
インスタンス
| インスタンス名 | 名前 | 価格 |
|:-:|:-:|:-:|
| apple  | リンゴ  | 120  |
| orange  | オレンジ  | 200  |
| strawbery  | イチゴ  | 60  |

インスタンス変数
- name
- price

クラスメソッド
| メソッド名 | 処理 |
|:-:|:-:|
| fresh  | 「とれたて新鮮な果実です」 と表示  |

インスタンスメソッド
| メソッド名 | 処理 |
|:-:|:-:|
| initialize  | 引数で名前と価格を渡し、インスタンス変数nameとpriceに代入|
| introduce  | 「【名前】は【価格】円です」と表示  |

実行結果は以下のようになる
```
採れたて新鮮な果実です
リンゴは120円です
オレンジは200円です
イチゴは60円です
```

雛形
```
class Fruit
 def クラスメソッド
   # 正しくメソッドを定義した上で、ここに処理を記入してください
 end

 def initialize
   # ここに処理を記入してください
 end

 def インスタンスメソッド
   # 正しくメソッドを定義した上で、ここに処理を記入してください
 end
end


# 3つのインスタンスを生成してください

# クラスメソッドを呼び出し、「採れたて新鮮な果実です」と表示してください
# インスタンス毎にインスタンスメソッドを呼び出し、「【名前】は【価格】円です」と表示してください
```
ヒントから答えを導く
```
class Fruit
 def self.fresh
   puts "採れたて新鮮な果実です"
 end

 def initialize(name, price)
   @name = name
   @price = price
 end

 def introduce
   puts "#{@name}は#{@price}円です"
 end
end

apple = Fruit.new("リンゴ",120)
orange = Fruit.new("オレンジ",200)
strawberry = Fruit.new("イチゴ",60)

Fruit.fresh
apple.introduce
orange.introduce
strawberry.introduce
```
この問題は特に振り返ることもないし。

# Q13 任意の文字列を部分的に削除するプログラムの実装
missing_charメソッドを実装する
- 対象となる文字列からn番目の文字を削除すること
- 削除された文字以外の文字列を出力すること
雛形
```
def missing_char(str, n)
  # 処理を記述
end

# 呼び出し例（1つ目の引数には対象となる文字列を、2つ目の引数には対象となる文字列から何番目の文字を削除するのかを指定しましょう）
missing_char('kitten', 1)
```
出力例
```
missing_char('kitten', 1) → 'itten'
missing_char('kitten', 2) → 'ktten'
missing_char('kitten', 4) → 'kiten'
```
答え
```
def missing_char(str, n)
  str.slice!(n - 1)
  puts str
end

missing_char('kitten', 1)
```
ポイントはnから1を引いていること。
字列の順番を指定する際も、配列と同じように先頭の文字列は0からカウントされるため。
1なら2文字目が削除される。-1を加えることで1で1文字目が削除される。

# Q14 if,else問題(演算子)
police_troubleメソッドを実装。
あなたは警官です。aとb二人の容疑者の取り調べをしています。このとき、次のルールで証言の真偽判定を行います。
- 第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること
- 第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること
- 第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること
雛形
```
def police_trouble(a, b)
  # ここに条件式を記述する
end

# 呼び出し例
police_trouble(true, true) 
police_trouble(false, false)
police_trouble(true, false)
```
出力例
```
police_trouble(true, true) → True
police_trouble(false, false) → True
police_trouble(true, false) → False
```
答え
```
def police_trouble(a, b)
  if (a && b) || (!a && !b)
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
police_trouble(true, true) 
police_trouble(false, false)
police_trouble(true, false) 
```
ポイントは!（エクスクラメーションマーク）
`&&`と`||`は上記の通り。
```
# aがtrueの場合にfalse、aがfalseの場合にtrue
!a
```
!をつけることで逆になる！
`(a && b) || (!a && !b)`とは「aとbの証言がどちらもtrue、または、どちらも証言がfalse」の場合「True」と出力される。それ以外であれば「False」と出力される条件。

# Q15 文字数を算出するプログラムの実装
対象となる文字列から特定の文字列の数を算出し、その数を出力するプログラムを実装
- 対象となる文字列の中から、"hi"という特定の文字列の数を取得すること
- 上記で取得した数を出力すること
雛形
```
def count_hi(str)
  #  処理を記述
end

# 呼び出し例（引数には対象となる文字列を指定します）
count_hi('abc hi ho')
```
出力例
```
count_hi('abc hi ho') → 1
count_hi('ABChi hi') → 2
count_hi('hihi') → 2
```
回答
```
def count_hi(str)
  puts str.scan("hi").length
end

# 呼び出し例（引数には対象となる文字列を指定します）
count_hi('abc hi ho')
```
ポイントはscanメソッド、対象の要素から引数で指定した文字列を数え、配列として返すメソッド
```
"foobarbazfoobarbaz".scan("ba")
=> ["ba", "ba", "ba", "ba"]
```
上記のように出力されます。
これにlengthをつけるだけ。

# おわりに
問題はまだまだ続く。