カラオケマシン問題に挑戦

カラオケマシン問題のコードを書いたので貼っておく。テストは省略。

class KaraokeMachine
  SCALE = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#']
  attr_reader :melody

  def initialize(melody)
    @melody = melody
  end

  def num_to_solfa(num)
    SCALE[num]
  end

  def solfa_to_num(solfa)
    SCALE.index(solfa)
  end

  def trans(solfa, amount)
    num = solfa_to_num(solfa) + amount
    num = num % SCALE.size
    num_to_solfa(num)
  end

  def transpose(amount)
    @melody.gsub(/([A-G]#?)/) { trans($1, amount) }
  end
end