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

# はじめに
今日も引き続き問題を解いていきます！

# Q26 2つの文字列の末尾に対して一致・不一致を判断するプログラムの実装
以下の要件を満たすend_otherメソッドを実装。

- メソッドの引数に、任意の2つの文字列を指定する。
- 引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
- 上記を満たせていない場合は、Falseを出力する
- 入力された文字が大文字でも小文字でも、同一の文字として処理を行う
雛形
```
def end_other(a, b)
  # 処理を記述
end

# 呼び出し例
end_other('Hiabc', 'abc') 
```
出力例
end_other('Hiabc', 'abc') → True
end_other('AbC', 'HiaBc') → True
end_other('abc', 'HaIoBc') → False
解答
```
def end_other(a, b)
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
  if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
end_other('Hiabc', 'abc') 
```
問題数も重なってきて、今までの問題に比べるとかなり複雑化してきた印象です。
ポイントはsliceの範囲指定とdowncase
範囲を指定して要素を切り取る場合は、以下のように記述して使うことが出来る。
```
# 要素を定義
array = "Hiabc"

#配列番号（インデックス番号）の-3から-1の範囲の文字列を切り取る
array.slice(-3..-1)
#=> abc
```
downcaseメソッドは大文字を小文字に変換するメソッド
```
# 大文字を含んだ文字列を定義
irb(main):001:0> name = "Hiabc"
=> "Hiabc"

# downcaseメソッドを使用し、小文字に変換
irb(main):002:0> name.downcase
=> "hiabc"
```
結果記述の2〜5行目では以下のように出力される。
```
a_down = hiabc
b_down = abc
a_len = 5
b_len = 3
```

# Q27 if,else問題
正の整数を入力。その整数が、10の倍数（10,20,30...）からの差が2以内であるときはTrueそれ以外はFalseと出力するメソッドを作る。
出力例
near_ten(12)→True
near_ten(17)→False
near_ten(19)→True
```
def near_ten(num)
  quotient = num % 10
  if quotient <= 2 || quotient >= 8
    puts "True"
  else
    puts "False"
  end
end
```
一の位が「0.1.2.8.9」のどれかであれば10の倍数からの差が2以内と判断することができる。

# Q28 預金システムのアルゴリズム問題 
以下の条件を達成するプログラムを実装。
銀行口座に10万円の預金残高があり、お金を引き出すプログラムを作成。
- お金を引き出すwithdrawメソッドを作成する
- お金を引き出すと手数料110円かかり、「◯◯円引き落としました。残高は◯◯円です」と表示する（残高は手数料を引いた額を表示します）
- 引き落とし金額と手数料の合算が、預金残高より大きい場合は「残高不足です」と表示する
```
def withdraw(balance, amount)
  fee = 110
  if balance >= (amount + fee)
    balance -= (amount + fee)
    puts "#{amount}円引き落としました。残高は#{balance}円です"
  else
    puts "残高不足です"
  end
end

balance = 100000
puts "いくら引き落としますか？（手数料110円かかります）"
amount = gets.to_i
withdraw(balance, amount)
```
balance = 預金残高
amount = 引き落とし学
fee = 手数料

# Q29 配列に格納された数値の合計値を算出するプログラムの実装
配列に格納された3つの数値の合計を算出するプログラムを実装。
以下の要件を満たすlone_sumメソッドを実装。
- 配列に格納された3つの数値の合計を出力する
- ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

雛形
```
def lone_sum(ary)
  # 処理を記述
end

# 呼び出し例
lone_sum([1, 2, 3])
```
出力例
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0
解答
```
def lone_sum(ary)
  # 配列から、重複しない要素のみ取り出す
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # uniq_nums配列内の合計
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
end

# 呼び出し例
lone_sum([1, 2, 3])
```

# Q30 rubyの検索問題（バイナリーサーチ）
以下の配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索するコードを作成。
添字が0の要素、つまり以下の配列における「1」は「配列の0番目に存在する」と表現。
```
array=[1,3,5,6,9,10,13,20,26,31]
```
任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示し、
存在する場合は、配列の何番目にあるかを表示してください。
※配列の上限である32以上の値による検索は想定しないものとする
検索はバイナリーサーチ（2分割検索）を使用して行います。
#### バイナリーサーチとは？
ソート済みのリストや配列に入ったデータ（同一の値はないものとする）に対する検索を行うときに用いられる手法。まず、中央の値を確認し、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断する。それを繰り返し、片側には存在しないことを確かめながら検索していく方法。
1回の処理で選択肢が半分になるので、処理速度の向上が期待できる。
出力例
```
検索したい数字を入力してください
5
5は配列の2番目に存在します 
```
```
検索したい数字を入力してください
7
7は配列内に存在しません
```
解答
```
def binary_search(array, right, target)
  left = 0
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i
number_of_elements = array.length

result = binary_search(array, number_of_elements, target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result}番目に存在します "
end
```
例えばtargetとして`31`を入力した場合、2〜12行目で以下のように処理が進む。
```
#1回目のループ
left=0
right=10
center=5
array[center]=10

#2回目のループ
left=6
right=10
center=8
array[center]=26

#3回目のループ
left=9
right=10
center=9
array[center]=31
```
そして6行目の`return center`によって返り値が`9`となり、24〜28行目の処理`で31は配列の9番目に存在します`と出力される。

# おわりに
Rubyの問題を解くアウトプットも明日で終了になります！
今日もお疲れさまでした！！