0851 - Email

De la Universitas MediaWiki

O adresă de email este alcătuită din numele de utilizator și numele de domeniu, separate prin simbolul @. De exemplu, gigel@pbinfo.ro este o adresă de email corectă ca structură, chiar dacă inexistentă.

Cerinţa

Se dă o listă de adrese de email corecte ca structură. Să se determine câte adrese de email sunt asociate cu fiecare nume de domeniu

Date de intrare

Fișierul de intrare emailin.txt conține mai multe adrese de email, câte una pe o linie.

Date de ieșire

Fișierul de ieșire emailout.txt va conține pe prima linie numărul C de nume de domenii diferite. Următoarele C linii conțin câte un nume de domeniu, urmat de un spațiu și de numărul de adrese date asociate cu acel domeniu. Numele de domeniu se vor afișa în ordine descrescătoare a numărului de adrese asociate. Dacă există mai multe nume de domenii cu același număr de adrese asociate, se vor afișa în ordine lexicografică.

Restricţii şi precizări

  • fișierul de intrare va conține cel mult 1000 de adrese distincte, cu cel mult 200 de domenii distincte;
  • lungimea maximă a unei adrese de email este de 50 de caractere;
  • numele de domeniu începe după simbolul @ și se termină la sfârșitul adresei;
  • adresa de email nu conține spații sau alte caractere albe.

Exemplu 1

emailin.txt
gigel@pbinfo.ro
gigel@yahoo.com
ionel.c@gmail.com
gigi@pbinfo.ro
vasile@yahoo.com
jr@gmail.com
qwerty@yahoo.com
emailout.txt
Datele de intrare corespund restrictiilor impuse
3
yahoo.com 3
gmail.com 2
pbinfo.ro 2


Exemplu 2

emailin.txt
012345678901234567890123456789012345678901234567891@pbinfo.ro
gigel@yahoo.com
ionel.c@gmail.com
gigi@pbinfo.ro
vasile@yahoo.com
jr@gmail.com
qwerty@yahoo.com
emailout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

from collections import Counter


def count_domains(emails):
    # Funcția numără câte adrese de email sunt asociate cu fiecare nume de domeniu.

    # Extragem numele de domeniu din fiecare adresă de email și le numărăm
    domains = [email.split('@')[1] for email in emails]
    return Counter(domains)


def main():
    with open('emailin.txt', 'r') as fin, open('emailout.txt', 'w') as fout:
        emails = [line.strip() for line in fin]

        # Verificăm dacă adresele de email respectă restricțiile
        if len(emails) > 1000 or any(len(email) > 50 for email in emails):
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
            return

        fout.write("Datele de intrare corespund restrictiilor impuse\n")

        # Numărăm câte adrese de email sunt asociate cu fiecare nume de domeniu
        domain_counts = count_domains(emails)

        # Sortăm numele de domeniu în ordine descrescătoare a numărului de adrese asociate
        sorted_domains = sorted(domain_counts.items(), key=lambda x: (-x[1], x[0]))

        # Scriem numărul de nume de domenii diferite și numărul de adrese asociate cu fiecare domeniu
        fout.write(str(len(sorted_domains)) + '\n')
        for domain, count in sorted_domains:
            fout.write(f'{domain} {count}\n')


if __name__ == "__main__":
    main()