カードゲーム

スタック・キューメニュー応用編 【3 つのキュー・品出し・キューじゃんけん・満員エスカレーター・カードゲーム 】

【3 つのキュー】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const cue = [[], [], []];
   for (let i = 1; i <= N; i++) {
      const Q = lines[i].split(' ');
      switch (Q[0]) {
      case 'push':
         cue[Q[1] - 1].push(Q[2]);
         break;
      case 'pop':
         cue[Q[1] - 1].shift();
         break;
      }
   }
   for (let i = 0; i < cue.length; i++) {
      for (let j = 0; j < cue[i].length; j++) {
         console.log(cue[i][j]);
      }
   }
});
hogeちゃんの画像

末尾に追加。

先頭から取り出し。

【品出し】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const cue = [];
   for (let i = 1; i <= N; i++) {
      const Q = lines[i].split(' ');
      switch (Q[0]) {
      case 'add':
         cue.push(Q[1]);
         break;
      case 'buy':
         for (let i = 0; i < Q[1]; i++) {
            cue.shift();
         }
         break;
      }
   }
   for (let i = 0; i < cue.length; i++) {
      console.log(cue[i]);
   }
});
hogeちゃんの画像

末尾に追加。

先頭から取り出し。

【キューじゃんけん】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const paiza = [];
   const kyoko = [];
   let [p_win, k_win] = [0, 0];
   for (let i = 1; i <= N; i++) {
      const Q = lines[i].split(' ');
      paiza.push(Q[0]);
      kyoko.push(Q[1]);
   }
   for (let i = N + 1; i <= K + N; i++) {
      const p = paiza.shift();
      const k = kyoko.shift();
      switch (p) {
         case 'R':
            if (k === 'S') {
               p_win++;
            } else if (k === 'P') {
               k_win++;
            }
            break;
         case 'S':
            if (k === 'P') {
               p_win++;
             } else if (k === 'R') {
             k_win++;
          }
            break;
         case 'P':
            if (k === 'R') {
               p_win++;
            } else if (k === 'S') {
               k_win++;
            }
            break;
      }
   const [C_1, C_2] = lines[i].split(' ');
   switch (C_1) {
      case 'push':
         paiza.push(p);
         break;
   }
   switch (C_2) {
      case 'push':
         kyoko.push(k);
         break;
      }
   }
   if (p_win > k_win) {
      console.log('paiza');
   } else if (p_win < k_win) {
      console.log('kyoko');
   } else {
      console.log('draw');
   }
});
hogeちゃんの画像

キューの 先頭の要素同士でじゃんけん勝負。

【満員エスカレーター】コード 1/2

reader.on('close', () => {
  const [N, X] = lines[0].split(' ').map(Number);
  const ESC = [];
  let sum = 0;
  let num = 0;
  for (let i = 1; i <= N; i++) {
    const Q = lines[i].split(' ');
    switch (Q[0]) {
    case 'ride':
      for (let j = 2; j < Number(Q[1]) + 2; j++) {
        if (sum + Number(Q[j]) <= X) {
          sum += Number(Q[j]);
          ESC.unshift(Number(Q[j]));
          num++;
        }
      }
      break;
    case 'get_off':
      for (let j = 0; j < Q[1]; j++) {
        sum -= ESC.pop();
        num--;
        if(num===0){
            break;
        }
      }
      break;
    }
  }
  console.log(num);
  console.log(sum);
});
hogeちゃんの画像

降りる時は pop()
乗る時は unshift()

【満員エスカレーター】コード 2/2

reader.on('close', () => {
   const [N, X] = lines.splice(0, 1)[0].split(' ').map(Number);
   const EV = [];
   let num = 0;
   let sum = 0;
   for (let i = 0; i < N; i++) {
      const Q = lines.splice(0, 1)[0].split(' ');
      const n = Number(Q[1]);
      switch (Q[0]) {
      case 'ride':
         for (let i = 2; i < n + 2; i++) {
            const w = Number(Q[i]);
            sum += w;
            num++;
            if (sum <= X) {
               EV.push(w);
            } else {
               sum -= w;
               num--;
            }
         }
         break;
      case 'get_off':
         for (let i = 0; i < n; i++) {
            if (!num) {
               break;
            } else {
               sum -= EV.shift();
               num--;
            }
         }
         break;
      }
   }
   console.log(num);
   console.log(sum);
});
hogeちゃんの画像

降りる時は shift()
乗る時は push()

【カードゲーム】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const deck = [];  // 山札
   const my_card = [];  // 持ち札
   const graveyard = [];  // 墓地
   const exclude = [];  // 除外
   let lose = true;
   for (let i = 1; i <= 40; i++) {  // 40 枚のデッキ
      deck.unshift(i);
   }
   for (let i = 1; i <= 5; i++) {  // 山札の上から 5 枚引く
      my_card.push(deck.pop());
   }
   for (let i = 2; i <= K; i++) {
      if (my_card.includes(N)) {
         console.log(i - 1);
         lose = false;
         break;
      } else {
         const event = lines[i].split(' ')[0];
         const X = Number(lines[i].split(' ')[1]);
         switch (event) {
         case 'draw':  // 山札の上からX 枚引く
            for (let i = 1; i <= X; i++) {
               my_card.push(deck.pop());
            }
            break;
         case 'discard':  // 山札の上から X 枚を上から順番に墓地へ送る
            for (let i = 1; i <= X; i++) {
               graveyard.push(deck.pop());
            }
            break;
         case 'return_from_the_graveyard':  // 墓地の上から X 枚を上のから順番に山札の一番下に加える
            for (let i = 1; i <= X; i++) {
               deck.unshift(graveyard.pop());
            }
            break;
         case 'exclude':
            for (let i = 1; i <= X; i++) {  // 山札から X 枚を上から順番に除外
               exclude.push(deck.pop());
            }
            break;
         case 'return_from_the_exclusion':  // 除外カードから X 枚を上から順に山札の一番下に加える
            for (let i = 1; i <= X; i++) {
               deck.unshift(exclude.pop());
            }
            break;
         }
      }
      if (my_card.includes(N)) {
         console.log(i);
         lose = false;
         break;
      }
   }
   if (lose) {
      console.log('Lose');
   }
});
hogeちゃんの画像

墓地と除外って 分かり難いって思うのはマリンだけ??。

コメント