0851 - Email
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>