LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

はじめに

今日も引き続き問題を解いていきます!

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の問題を解くアウトプットも明日で終了になります!
今日もお疲れさまでした!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0