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 sub = [S[p1], S[p2], S[p3], S[p4], S[p5]]; // CPCTF的の条件をチェック // 1. 1文字目と3文字目のみが等しい // 2. それ以外の文字はすべて互いに異なる if (sub[0] === sub[2] && sub[0] !== sub[1] && sub[0] !== sub[3] && sub[0] !== sub[4] && sub[1] !== sub[2] && sub[1] !== sub[3] && sub[1] !== sub[4] && sub[2] !== sub[3] && sub[2] !== sub[4] && sub[3] !== sub[4]) { count++; } } } } } } return count; } // テスト例 console.log(countCPCTFSubstrings("ABACD")); // CPCTF的な文字列自体 console.log(countCPCTFSubstrings("ABABC")); // CPCTF的でない文字列