using System;
using System.Linq;
using System.Text.RegularExpressions;

class PasswortChecker
{
    
    public int isGutesPasswort(string passwort)
    {
        int zeichenAnzahl = 0;
        int buchstabenAnzahl = 0;
        int ziffernAnzahl = 0;
        int grossbuchstabenAnzahl = 0;
        int kleinbuchstabenAnzahl = 0;
        int sonderzeichenAnzahl = 0;
        int zifferInnerhalb = 0;
        int sonderzeichenInnerhalb = 0;

        int punkteZaehler = 0;

        // Array zur prüfung der Stringbestandteile im einzelnen erzeugen
        string[] passwortBestandteile = Regex.Split(passwort, @"");
        passwortBestandteile = passwortBestandteile.Where(val => val != "").ToArray();

        zeichenAnzahl = passwortBestandteile.Length;

        int passwortBestandteileIndex = 0;
        foreach (string passwortBestandteil in passwortBestandteile)
        {
            // Prüfung auf Erfüllung der Kriterien mit regulären Ausdrücken
            if (Regex.IsMatch(passwortBestandteil, "[A-Z]")) { grossbuchstabenAnzahl++; buchstabenAnzahl++; }
            if (Regex.IsMatch(passwortBestandteil, "[a-z]")) { kleinbuchstabenAnzahl++; buchstabenAnzahl++; }
            if (Regex.IsMatch(passwortBestandteil, "[0-9]")) ziffernAnzahl++;
            if (!Regex.IsMatch(passwortBestandteil, "[A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû]")) sonderzeichenAnzahl++;

            if (passwortBestandteileIndex != 0 && passwortBestandteileIndex != zeichenAnzahl)
            {
                if (!Regex.IsMatch(passwortBestandteil, "[A-Za-z0-9öäüÄÖÜßáàâéèêíìîóòôúùû]")) sonderzeichenInnerhalb++;
                if (Regex.IsMatch(passwortBestandteil, "[0-9]")) zifferInnerhalb++;
            }

            passwortBestandteileIndex++;
        }

        // Ausgabe der Gründe für etwaige Punktabzüge
        if (zeichenAnzahl >= 12) punkteZaehler++; else Console.WriteLine("\r\nPunktverlust -1 wegen zu weniger Zeichen - Es sollen min. 12 sein und sind nur: " + Convert.ToString(zeichenAnzahl));
        if (kleinbuchstabenAnzahl >= 1) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen zu weniger Kleinbuchstaben");
        if (grossbuchstabenAnzahl >= 2) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen zu weniger Großbuchstaben");
        if (buchstabenAnzahl >= 2) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen zu weniger Buchstaben");
        if (ziffernAnzahl >= 2) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen zu weniger Ziffern");
        if (sonderzeichenAnzahl >= 2) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen zu weniger Sonderzeichen");
        if (sonderzeichenInnerhalb >= 1) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen fehlendem oder falscher Position eines Sonderzeichens");
        if (zifferInnerhalb >= 1) punkteZaehler++; else Console.WriteLine("Punktverlust -1 wegen fehlender oder falscher Position einer Ziffer");

        return punkteZaehler;
    }
}

class hauptProgramm
{

    static void Main(string[] args)
    {
        Console.WriteLine("Bitte geben Sie das Passwort ein, das getestet werden soll: ");
        string passwort = Console.ReadLine();

        PasswortChecker pwc = new PasswortChecker();
        int ergebnis = pwc.isGutesPasswort(passwort);

        string antwort = "";
        if (ergebnis < 8)
        {
            antwort = "Das ist zu wenig, bitte ändren Sie das Passwort und starten Sie die Anwendung erneut!";
        }
        else
        {
            antwort = "Das ist Perfekt - alle Kriterien sind erfüllt!";
        }

        Console.WriteLine("Das Passwort erreicht " + Convert.ToString(ergebnis) + " von 8 erreichbaren Punkten. " + antwort);

        // Konsolenfenster offen halten
        Console.WriteLine("Druecken Sie zum Bennden eine beliebige Taste");
        Console.ReadKey();
    }
}