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