0851 - Email

From Bitnami 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[edit | edit source]

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[edit | edit source]

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

Date de ieșire[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

<syntaxhighlight lang="python" line> 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()


</syntaxhighlight>