function countCPCTFSubstrings(S) { const N = S.length; let count = 0; // 5つの位置(p1, p2, p3, p4, p5)を選ぶ for (let p1 = 0; p1 < N; p1++) { for (let p2 = p1 + 1; p2 < N; p2++) { for (let p3 = p2 + 1; p3 < N; p3++) { for (let p4 = p3 + 1; p4 < N; p4++) { for (let p5 = p4 + 1; p5 < N; p5++) { // 部分文字列を構成 const c1 = S[p1]; const c2 = S[p2]; const c3 = S[p3]; const c4 = S[p4]; const c5 = S[p5]; // CPCTF的の条件をチェック if ( c1 === c3 && // 1文字目と3文字目が等しい c1 !== c2 && c1 !== c4 && c1 !== c5 && // 1文字目と2,4,5文字目は異なる c2 !== c3 && c2 !== c4 && c2 !== c5 && // 2文字目と他は異なる c3 !== c4 && c3 !== c5 && // 3文字目と4,5文字目は異なる c4 !== c5 // 4文字目と5文字目は異なる ) { count++; } } } } } } return count; }