[プログラマー]ダーツゲーム


問題の説明


ダーツゲーム


KakaoTalkの4番目の星!退屈な時?KakaoTalkゲームスター~

ダーツボードに3回ダーツを投げ、点数の和で実力を競うゲームは、誰でも気軽に楽しめます.
入社したばかりの武智はコード力が認められ、ゲームの核心部分である採点ロジックを担当した.ダーツゲームの得点ロジックは以下の通りです.
  • ダーツゲームは3回のチャンスがあります.
  • の機会ごとに0点から10点を得ることができます.
  • 点、単(S)、双(D)、三(T)領域が存在し、各領域の当選点数
    1平方、2平方、3平方(分数1、分数2、分数3)で計算します.
  • オプションでは、スター賞(*)、アチャ賞(#)が存在し、スター賞(*)を受賞した場合の対応する点数とそれまでの点数がそれぞれ2倍になる.阿次賞(#)が当選した時、この点数は負数だった.
  • スター賞(*)も初の機会で受賞できます.そんな中、初のスター賞(*)の点数が2倍になった.(例4参照)
  • スター賞(*)の効果は、他のスター賞(*)の効果と重なる可能性があります.そんな中、重なるスター賞(*)の点数は4倍.(例4参照)
  • スター賞(*)の効果は「アチャ賞」(#)の効果と重なる可能性があります.この場合、重なったアッチャ賞(#)の点数は-2倍です.(例5参照)
  • 単一(S)、二重(D)、三(T)の各スコアは1つ存在する.
  • スター賞(*)、雅察賞(#)は1点ごとに1つしか存在しないし、存在しないかもしれない.
  • 0~10の整数と、アルファベットS、D、T、*、および#からなる文字列を入力すると、合計スコアが返される関数を作成します.

    入力フォーマット


    3組の文字列は、スコア|加算|「オプション」で構成されています.
    例)1 S 2 D*3 T
  • 分は0から10の整数です.
  • ボーナスはS、D、Tの1つです.
  • オプティカル(光学式)ドライブは*または#のいずれかで、ない場合があります.
  • 出力フォーマット


    3回の機会で得られたスコアの合計の整数値を出力します.
    例)37

    I/O例



    に答える

    function solution(_dartResult) {
      let dartResult = [..._dartResult];
      let parseDartResult = [];
      let temp = [];
      let cursor = 0;
      let tempStr = '';
    
      const multiplication = (item, index, origin) => {
        if (index === origin.length - 1 || index === origin.length - 2) {
          return (item *= 2);
        }
        return item;
      };
    
      const negative = (item, index, origin) => {
        if (index === origin.length - 1) {
          return -item;
        }
        return item;
      };
    
      const add = (prev, acc) => (prev += acc);
    
      while (cursor < dartResult.length) {
        const currentValue = dartResult[cursor];
    
        if (isNaN(parseInt(currentValue))) {
          tempStr += currentValue;
          parseDartResult.push(tempStr);
          cursor = 0;
          tempStr = '';
        } else {
          tempStr += currentValue;
        }
        dartResult.shift();
      }
    
      parseDartResult.forEach((item) => {
        if (item.indexOf('S') > -1) {
          temp.push((+item.split('S')[0]) ** 1);
        }
    
        if (item.indexOf('D') > -1) {
          temp.push((+item.split('D')[0]) ** 2);
        }
    
        if (item.indexOf('T') > -1) {
          temp.push((+item.split('T')[0]) ** 3);
        }
    
        if (item === '*') {
          temp = temp.map(multiplication);
        }
    
        if (item === '#') {
          temp = temp.map(negative);
        }
      });
    
      return temp.reduce(add, 0);
    }
    
  • に入力されたdartResult文字列をそれぞれ文字として作成し、並べ替えます.
  • のように形成された文字配列グループは、各機会に適した文字を合成し、配列する.
  • のように合成された配列は、複文の周りで点数に合致するように計算される.