カラオケマシン問題をやってみる

  • このエントリーをはてなブックマークに追加
ruby

例によってRubyのアウトプット問題をやりつつ、わからないところをググり倒す備忘録。
問題は上記参照。

解答例はいろいろあるのだけれど、とりあえずヒットしたコードを読みながらわからないところを今日の積み上げに書いていくスタイル。
コードを掲載させていただきますが、問題があればすぐに消しますのでよろしくお願いします!

class KaraokeMachine
  def initialize(melody)
    @melody = melody
  end

  MELODIES = %w[C C# D D# E F F# G G# A A# B].freeze

  def transpose(number)
    @melody.split('').map { |code|
      code.match?(/\w/) ? adjust_melody_line(code, number) : code
    }.join('')
  end

  def adjust_melody_line(code, number)
    MELODIES[new_index(code, number)]
  end

  def new_index(code, number)
    original_index = MELODIES.index(code)
    (original_index + number).modulo(MELODIES.size)
  end
end

今日の積み上げ

initialize()

クラス内に記述した場合オブジェクトが生成されると自動的に呼び出される。

.freeze

オブジェクトの内容の変更を禁止する。

/\w/

正規表現
\w : 単語構成文字 [a-zA-Z0-9_] # 全角文字は含まれない
// : マッチするか?
つまり対象の文字にマッチしているかどうか

%w()

配列を作る。配列の要素はスペース区切りで指定。

array = %w(one two three four)
p array
# => ["one", "two", "three", "four"]

おすすめテキスト

テストを書かれた伊藤さんのチェリー本で勉強しています。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*