問題文を読み解くのがめんどい。。。
面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所はこっちの記事に書いてあるYO!!
concentration.js
// [問題文(原文)]
// 神経衰弱と呼ばれるトランプゲームのシミュレーションをしましょう。
// 今回は数字が書かれたトランプのみを考え、ジョーカーは考えません。
//
// まず、トランプを縦 H 枚、横 W 枚の長方形の形に並べた状態でスタートします。
// H × W 枚のトランプには 1 〜 13 の数字のうちどれか1つが書かれています。
// また、同じ数字が書かれたトランプが複数あります。
//
// プレイヤーが N 人おり、それぞれ 1 〜 N で番号付けられています。
// ゲームが始まると、1番の人から、このような手順でプレイしていきます。
//
// ・並べられたトランプから2枚のトランプを選び、めくります。
// ・めくった2枚のトランプに異なる数字が書かれていれば、次のプレイヤーの手番となります。同じ数字であれば、次の操作をおこないます。
// ・まず、2枚のトランプはめくったプレーヤーのものとなり、取り除かれます。
// ・トランプがすべて取り除かれた場合、ゲームは終了となります。
// ・トランプが残っている場合、同じプレーヤーがまた最初の手順に戻り、トランプをめくります。
//
// ここで、N 番のプレイヤーの次のプレイヤーは 1 番のプレイヤーであるとします。
//
// ゲームの初期状態におけるトランプの配置と、ゲームが終わるまでに捲られたトランプに関する時系列順の記録が与えられます。
// その記録を用いて、各プレイヤーが取り除いたトランプの枚数を求めてください。
function concentration(lines) {
// 入力は以下のフォーマットで与えられます。
//
// H W N
// t_{1,1} t_{1,2} ... t_{1,W}
// t_{2,1} t_{2,2} ... t_{2,W}
// ...
// t_{H,1} t_{H,2} ... t_{H,W}
// L
// a_1 b_1 A_1 B_1
// a_2 b_2 A_2 B_2
// ...
// a_L b_L A_L B_L
//
// 1行目には3つの整数 H, W, Nが入力されます。
// H と W はそれぞれ並べられたトランプの縦方向の枚数と横方向の枚数で、N はプレイヤーの数を表します。
//
// 続く H 行には、配置されたトランプに書かれた数字が入力されます。
// t_{i,j} は i 行 j 列に置かれたトランプに書かれた数字を表します。
//
// 次の行には、記録の長さ L が与えられます。
//
// 続く L 行には、捲られたトランプの記録が時系列順で与えられます。
// これは、a_i 行 b_i 列のトランプと A_i 行 B_i 列のトランプが捲られたことを表します。
// カードの配置はJSONで管理(連想配列でもいいけどJSON)
const cards = {};
// プレイヤー(取得枚数を管理)
const players = [];
// 現在処理中のプレイヤー番号
let palyerIndex = 0;
// 入力チェック面倒くさいので正常系のみ対応するよ
const [row, col, playerCnt] = lines[0].split(" ").map(v => Number(v));
// カード情報を設定
lines.slice(1, row + 1).forEach((line, rowIndex) =>
line.split(" ").forEach((card, colIndex) => cards[`${rowIndex + 1}_${colIndex + 1}`] = card)
);
// プレイヤーの取得枚数の初期化
Array.from({ length: playerCnt }, (_, i) => players[i] = 0);
// 取得状況ループ
lines.slice(row + 2).forEach((line) => {
const [a, b, A, B] = line.split(" ");
if (cards[`${a}_${b}`] === cards[`${A}_${B}`]) {
players[palyerIndex] = (players[palyerIndex] || 0) + 2;
} else {
// プレイヤーチェンジ
palyerIndex = (palyerIndex + 1) === playerCnt ? 0 : palyerIndex + 1;
}
});
// i 行目には i 番目のプレイヤーが取り除いたトランプの枚数を出力してください。
// 各行の最後は改行し、余計な文字、空行を含んではいけません。
players.forEach(cnt => console.log(cnt));
}
module.exports = {
concentration
};
問題文は小難しく書いてあるけど、やることって
・1行目にカードの枚数(Row*Col)とプレイヤー数
・2行目~カード情報
・1行目のRow + 2行目からプレイヤーの取得情報
・組み合わせがあってるかどうかのチェック、合ってたらプレイヤーに集計・外れてたらプレイヤーチェンジ
ココらへんがキチンと理解・整理できればプログラムなんてスグに組めるよね(ニッコリ