<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CTF - Mot de Passe</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin: 50px;
        }
        input {
            padding: 10px;
            font-size: 18px;
        }
        .rules {
            margin-top: 20px;
            text-align: left;
            display: inline-block;
        }
        .valid {
            color: green;
        }
        .invalid {
            color: red;
        }
    </style>
</head>
<body>
    <h1>Défi CTF : Trouve le bon mot de passe</h1>
    <input type="text" id="password" placeholder="Entrez votre mot de passe">
    <div class="rules" id="rules"></div>
    <div class="flag">Bien joué ! REMICTF{}</div>

    <script>
        const rules = [
            { text: "Doit contenir au moins un chiffre et un caractère spécial.", test: pwd => /\d/.test(pwd) && /[^a-zA-Z0-9]/.test(pwd) },
            { text: "Doit faire au moins 8 caractères.", test: pwd => pwd.length >= 8 },
            { text: "Doit contenir au moins une majuscule et une minuscule.", test: pwd => /[a-z]/.test(pwd) && /[A-Z]/.test(pwd) },
            { text: "Doit être un palindrome.", test: pwd => pwd === pwd.split('').reverse().join('') },
            { text: "Doit contenir au moins 3 voyelles et 3 consonnes.", test: pwd => (pwd.match(/[aeiou]/gi) || []).length >= 3 && (pwd.match(/[bcdfghjklmnpqrstvwxyz]/gi) || []).length >= 3 },
            { text: "Doit contenir un nombre pair de lettres.", test: pwd => (pwd.replace(/[^a-zA-Z]/g, '').length) % 2 === 0 },
            { text: "La somme des valeurs ASCII doit être un multiple de 7.", test: pwd => pwd.split('').reduce((sum, c) => sum + c.charCodeAt(0), 0) % 7 === 0 },
            { text: "Doit avoir autant de lettres que de chiffres.", test: pwd => {
                let letters = (pwd.match(/[a-zA-Z]/g) || []).length;
                let numbers = (pwd.match(/[0-9]/g) || []).length;
                return letters === numbers;
            }},
            { text: "La somme des chiffres doit être un nombre premier.", test: pwd => {
                let sum = (pwd.match(/[0-9]/g) || []).reduce((a, b) => a + parseInt(b), 0);
                return sum > 1 && ![...Array(sum).keys()].slice(2).some(n => sum % n === 0);
            }},
            { text: "La lettre la plus fréquente doit apparaître autant de fois qu'il y a de voyelles.", test: pwd => {
                let freq = [...pwd].reduce((acc, c) => (acc[c] = (acc[c] || 0) + 1, acc), {});
                let maxFreq = Math.max(...Object.values(freq));
                let vowelCount = (pwd.match(/[aeiou]/gi) || []).length;
                return maxFreq === vowelCount;
            }},
        ];
        
        document.getElementById("password").addEventListener("input", function() {
            let pwd = this.value;
            let rulesDiv = document.getElementById("rules");
            rulesDiv.innerHTML = "";
            
            for (let i = 0; i < rules.length; i++) {
                let rule = rules[i];
                let valid = rule.test(pwd);
                let ruleElement = document.createElement("p");
                ruleElement.textContent = rule.text;
                ruleElement.className = valid ? "valid" : "invalid";
                rulesDiv.appendChild(ruleElement);
                if (!valid) return;
            }
            
            
        });
    </script>
</body>
</html>
