[プログラマー]さっきの歌


問題の説明


ラジオをよく聴くニオは、ラジオから出たばかりの音楽がどんな音楽なのかよく知りたい.この時、ニオは次のポータルサイトの「さっきの歌」サービスをよく利用した.さっきの歌はテレビやラジオなどの音楽のテーマなどの情報を提供するサービスでした.
ニオは自分の覚えているメロディーを持って、さっきの歌で音楽を探していました.しかし、放送中に1曲の音楽を繰り返し再生する場合もあり、ニオの記憶の中のメロディーは、音楽の終わり部分と冒頭部分から続くメロディーかもしれない.逆に、途中で音楽を中断すると、原曲にニオの記憶のメロディーがあっても、ニオが聞いたことのない曲ではない可能性があります.そこで、ニオは記憶の中のメロディーを再生時間と提供された楽譜と比較したいと思っています.以下の仮定をすると、ニオが探している音楽のテーマを求めます.
  • 音楽サービスは、音楽タイトル、再生開始時間、終了時間、楽譜を提供しています.
  • ニオの記憶にあるメロディーや楽譜に使われる音は、C、C#、D、D#、E、F、F#、G#、A、A#、B 12個.
  • 毎分1音再生.音楽は最初から再生しなければならず、再生時間が音楽の長さより長い場合、音楽会は絶えず最初から繰り返し再生しなければならない.再生時間が音楽の長さより短い場合は、最初から再生時間のみとなります.
  • 音楽再生時間は00:00を超えない.
  • 複数の条件が一致する音楽があれば、ラジオの再生時間が最も長い音楽タイトルに戻る.再生時間が同じ場合は、まず入力した音楽タイトルに戻ります.
  • 該当する音楽がない場合は「(None)」を返します.
  • 入力フォーマット


    ニオの記憶のメロディーを入力として含む文字列.  mと再生された曲の情報リスト  musicinfosが与えられる.
  • m銀音  1以上  1439以下で構成されています.
  • musicinfos  100個以下の歌曲情報の配列を含み、各歌曲情報は、音楽開始時刻、終了時刻、音楽タイトル、楽譜情報「,」からなる.
  • 音楽の開始と終了時間は24時間  HH:MM  形式.
  • 音楽タイトルの長さは「,」以外の出力可能文字です.  1  以上  64  次の文字列.
  • 楽譜情報は  1以上  1439以下で構成されています.
  • 出力フォーマット


    条件を満たす音楽タイトルを出力します.

    I/O例


    説明:


    第1の例では、HELLOの長さは7分であるが、12:00から12:14まで再生されるので、実際には記憶のメロディーABCDEFGを含むCDEFGABCDEFGABで再生される.第3の例では、HELLOはC#DEFGABC#DEFGABで再生され、WOLDはABCDEで再生される.HELLO中のABC#は記憶中のメロディーABCと一致せず、WORLD中のABC記憶中のメロディーと一致する.

    首都コード

  • PlayTime、PlayTimeが音楽より短いか等しい場合は、聴いている音楽と比較します.
  • playTimeが長くなるとナビゲーションが開始されます.
    2-1. curmusicに音楽を加え、playTime-現在の音楽の長さを減算します.
    2-2. プレイタイム設定に従って繰り返し文を設定し、curmusicの0番目のインデックスからcurmusicに貼り付けます.
    2-3. ブラウズ中に音楽がcurmusicに含まれている場合、curmusic[i+1]が「#」でない場合は、すぐにタイトルに戻ります.
  • //失敗.
  • 音楽にA#、B#などがある場合は、#を削除し、トーンを小文字に変更します.
  • ナビゲーション開始
    2-1. 現在探索中の音楽も同様であり,#があればピッチを小文字に変換する.
    2-2. プレイタイムに対応した再生音楽を作成します.
    2-3で再生される音楽には、あなたが聴く音楽が含まれています.
    2-3-1. 答え[0]音楽を再生する長さが保存されているので、現在の音楽が長い場合は
    2-3-2. 答え[0]音楽の長さを指定、答え[1]タイトルを指定
  • response[0]が0でない場合、response[1]のタイトルが返されます.答え[0]が0の場合は、対応する音楽がないので「(None)」を返します.
  • Solution

    function solution(m, musicinfos) {
        let answer = [0, '']
        let music = '';
        for (let i = 0; i < m.length; i++) {
            if (m[i + 1] === '#') {
                music += m[i].toLowerCase()
                i++
            } else {
                music += m[i]
            }
        }
        for (let i = 0; i < musicinfos.length; i++) {
            let info = musicinfos[i].split(',')
            let startTime = info[0].split(':')
            let endTime = info[1].split(':')
            let startMin = Number(startTime[0]) * 60 + Number(startTime[1])
            let endMin = Number(endTime[0]) * 60 + Number(endTime[1])
            let playTime = endMin - startMin
            let curMusic = '';
            for (let j = 0; j < info[3].length; j++) {
                if (info[3][j + 1] === '#') {
                    curMusic += info[3][j].toLowerCase();
                    j++
                } else {
                    curMusic += info[3][j]
                }
            }
            if (playTime <= curMusic.length) curMusic = curMusic.slice(0, playTime)
            else {
                curMusic = curMusic.repeat(playTime / curMusic.length) + curMusic.slice(0, playTime % curMusic.length)
            }
            if (curMusic.split(music).join('').length !== curMusic.length) {
                if (answer[0] < curMusic.length) {
                    answer[0] = curMusic.length
                    answer[1] = info[2]
                }
            }
        }
        return answer[0] ? answer[1] : '(None)'
    }

    GItHub repo