プログラマコード問題2010/10/25-Lv.1失敗率


[質問]


スーパーゲーム開発者のオレリーは大きな悩みに陥った.彼女が作ったブランド「呉天成」は大きな成功を収めたが、最近は新しいユーザーの数が激減している.なぜなら、新しいユーザーと既存のユーザーの間の舞台の違いが大きすぎるからです.
どうすればいいか悩んだ彼女は、ゲームの時間を動的に増やして難易度を調整することにした.やはりスーパー開発者であり、ほとんどのロジックは実現しやすいが、失敗率を探す部分で危機に陥っている.オレリーの失敗率を求めるコードを完了します.
失敗率は次のように定義されます.
ステージに到着しても空になっていないプレイヤー数/ステージに到着したプレイヤー数
現在停止しているステージ番号を含む配列フェーズをパラメータとして指定した場合は、失敗率の高いステージからステージ番号を含む配列を降順に返すように、ソルバを完了します.
せいげんじょうけん
舞台の個数Nは1以上500以下の自然数である.
ステージの長さは1以上200000以下です.
ステージは、1以上N+1以下の自然数を含む.
各自然数は、ユーザが現在挑戦しているステージの番号を表します.
ただし、N+1は、最後のステージ(N番目のステージ)にクリアしたユーザを表す.
同じ失敗率の舞台があれば、トランペットの舞台を先に来てもらうことができます.
ステージに到着したプレイヤーがいない場合、そのステージの失敗率は0と定義されます.
I/O例
N
stages
result
5
[2, 1, 2, 6, 2, 4, 3, 3]
[3,4,2,1,5]
4
[4,4,4,4,4]
[4,1,2,3]
I/O例説明
I/O例#1
1番ステージには8人のユーザーが挑戦し、そのうち1人のユーザーはまだ通関していない.そのため、1番ステージの失敗率は以下の通り.
1ステージ失敗率:1/8
第2ステージには7人のユーザーが挑戦し、そのうち3人のユーザーはまだ通関していない.そのため、2番目の舞台の失敗率は以下の通りです.
フェーズ2失敗率:3/7
同様に、残りの舞台の失敗率は以下の通りである.
フェーズ3失敗率:2/4
フェーズ4失敗率:1/2
フェーズ5失敗率:0/1
各ステージの番号を失敗率の降順に並べます.
[3,4,2,1,5]
I/O例#2
すべてのユーザが最後のステージにいるため、4番目のステージの失敗率は1であり、残りのステージの失敗率は0である.
[4,1,2,3]

[回答]

function solution(N, stages) {
    var answer = [];
    let length = stages.length;
    let stagePlayer = 0;
    let currentStage = 0;

    while(length > 0 && currentStage < N) {
        stages.forEach(stage => stagePlayer = stage === currentStage + 1 ? stagePlayer + 1 : stagePlayer);
  
        answer[currentStage] = {stage: currentStage + 1, rate: stagePlayer / length};

        length -= stagePlayer;
        currentStage++;
        stagePlayer = 0;
    }

    if(answer.length !== N) {
        for(let i = answer.length; i < N; i++) {
            answer[answer.length] = {stage: i + 1, rate: 0};
        }
    }

    return answer.sort((a, b) => b.rate - a.rate).map(el => el.stage);
}
各段階で失敗率を求める方法は、マイナス記号と除算記号をよく使うことです.
これらを失敗率sortとし、stageの値returnが重要である.stageと失敗率オブジェクトを並べて、
失敗率でsortを行い、mapstage万を抽出し、returnを行った.
途中で何人か失敗をずっと示していたので、考えました.stageから5があり、すべてのプレイヤーが5未満の場所で遊んでいたら
配列には5番目の値が作成されていないため、if文を使用し、その後の失敗率は0です.
定価stage.