0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsで判定機能を作って遊ぶ[Find the missing letter]

Last updated at Posted at 2022-11-25

ルール

アルファベットが順番に定義された配列が存在する.
だが、順番の中で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
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?