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