ルール
アルファベットが順番に定義された配列が存在する.
だが、順番の中で1つ抜けているものがあるからそれを特定する。
大文字・小文字のパターンがあるので注意する。
テストコード
Test.assert_equals(find_missing_letter(["a","b","c","d","f"]), "e")
Test.assert_equals(find_missing_letter(["O","Q","R","S"]), "P")
Test.assert_equals(find_missing_letter(["b","d"]), "c")
Test.assert_equals(find_missing_letter(["a","b","d"]), "c")
Test.assert_equals(find_missing_letter(["b","d","e"]), "c")
リファクタリング前の判定メソッド
次のアルファベットを判別するために、ハッシュで次のアルファベットを取れるように定義した。
この時に、小文字のパターンしか考えてなかったから、後から大文字パターンも定義したのでソースコードの重複と雑なif文が生まれてしまった。
一旦テストは通ってるからリファクタして重複とハッシュを定数として別に定義したいところ
def find_missing_letter(fml)
keys = ('a'..'z').to_a
values = ('b'..'z').to_a.push('a')
ary = [keys, values].transpose
downcase_check_hash = Hash[*ary.flatten]
keys = ('A'..'Z').to_a
values = ('B'..'Z').to_a.push('A')
ary = [keys, values].transpose
upcase_check_hash = Hash[*ary.flatten]
list = []
result = []
if downcase_check_hash.include? fml.first
fml.each do |word|
if list.empty?
list << downcase_check_hash[word]
elsif list.last == word
list << downcase_check_hash[word]
else
return downcase_check_hash.key(word)
end
end
else
fml.each do |word|
if list.empty?
list << upcase_check_hash[word]
elsif list.last == word
list << upcase_check_hash[word]
else
return upcase_check_hash.key(word)
end
end
end
end
すこしだけ綺麗に
def find_missing_letter(fml)
char = fml[0]
fml = fml.map(&:downcase)
### {"a"=>"b", "b"=>"c", "c"=>"d" ....}のようなhashを作ろうとしてた。
keys = ('a'..'z').to_a
values = ('b'..'z').to_a.push('a')
ary = [keys, values].transpose
check_hash = Hash[*ary.flatten]
### ~~~
list = []
result = []
fml.each do |word|
if list.empty?
list << check_hash[word]
elsif list.last == word
list << check_hash[word]
else
return keys.include?(char) ? check_hash.key(word): check_hash.key(word).upcase
end
end
end
そもそもこれで行けるのか...
def find_missing_letter(arr)
((arr.first..arr.last).to_a - arr).first
end