0863 - Parole

De la Universitas MediaWiki

Parolele sunt cele mai utilizate modalități de stabilire a identității unei persoane. În IT este necesară utilizarea unor parole tari, care să nu poată fi ghicite cu ajutorul unor programe specializate.

În continuare, prin parolă tare înțelegem un sir de caractere care respectă următoarele condiții:

  • conține cel puțin 8 caractere
  • conține cel puțin o literă mică
  • conține cel puțin o literă mare
  • conține cel puțin o cifră
  • conține cel puțin un caracter dintre .,?!;:_@#

Cerinţa

Se dă n o listă cu n parole. Să se determine câte dintre ele sunt parole tari.

Date de intrare

Fișierul de intrare parolein.txt conține pe prima linie numărul n, iar pe fiecare dintre următoarele n linii câte o parolă.

Date de ieşire

Fișierul de ieșire paroleout.txt va conține pe prima linie de parole tari C.

Restricții și precizări

  • 1 ⩽ n ⩽ 1000
  • fiecare linie fișierului de intrare va avea cel mult 50 de caractere

Exemplul 1

parolein.txt
5
al!ABe1Ar
alfabetar
a:1A
Alfabetar
qHj5K#.1NN
paroleout.txt
Datele de intrare corespund restrictiilor impuse.
2


Explicație

Cele două parole tari din listă sunt: al!ABe1Ar și qHj5K#.1NN.

Exemplul 2

parolein.txt
aceastalinedecoddepasestecele50decaractereimpuse
paroleout.txt
Datele de intrare nu corespund restrictiilor impuse.


Rezolvare

# functia de validare verifica daca datele de intrare sunt in intervalul specificat
def validare(n_validare, parole_validare):
    # verificam daca n este in intervalul 1-1000
    if not (1 <= n_validare <= 1000):
        raise ValueError  # ridicam o eroare daca n nu este in intervalul 1-1000
    for parola in parole_validare:  # parcurgem lista de parole
        # verificam daca lungimea parolei este mai mica sau egala cu 50
        if len(parola) > 50:
            raise ValueError
    file_out.write("Datele de intrare corespund restrictiilor impuse.\n")


# functia este_parola_tare verifica daca o parola este tare
def este_parola_tare(parola):
    # verificam daca parola contine cel putin 8 caractere,
    # cel putin o litera mica, cel putin o litera mare, cel putin o cifra si cel putin un caracter special
    return (len(parola) >= 8 and any(caracter.islower() for caracter in parola)
            and any(caracter.isupper() for caracter in parola) and any(
                caracter.isdigit() for caracter in parola) and any(caracter in ".,?!;:_@#" for caracter in parola))


if __name__ == '__main__':
    file_in = open("parolein.txt", "r")
    file_out = open("paroleout.txt", "w")

    try:
        # citim numarul de parole
        n_main = int(file_in.readline())
        # citim parolele
        parole_main = [file_in.readline().strip() for _ in range(n_main)]
        # validam datele de intrare
        validare(n_main, parole_main)
        # numaram cate parole sunt tari si scriem rezultatul in fisierul de iesire
        file_out.write(str(sum(este_parola_tare(parola) for parola in parole_main)) + '\n')

    # daca datele de intrare nu sunt valide, afisam un mesaj de eroare
    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
    # daca datele de intrare sunt incomplete, afisam un mesaj de eroare
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse.")