2901 – Data Pal
Context
În vacanța de iarnă Adelina a decis să renunțe la teme și a ales să citească o parte din cărțile aduse de Moș Crăciun: cele cu teme istorice sau SF. Pe măsură ce citea își nota în caiet datele calendaristice ale acelor evenimente care au impresionat-o. După vacanță îi povestește colegului de bancă despre aceste evenimente și remarcă faptul că unele date calendaristice au o formă specială, de palindrom: citite de la dreapta la stânga reprezintă aceeași dată ca atunci când se citesc obișnuit, de la stânga la dreapta.
Cerința
Pentru cele nr_date date calendaristice din agenda Adelinei numărați și afișați câte date palindromice au fost găsite iar apoi precizați secolele cu cele mai multe date palindromice.
Date de intrare
Fișierul de intrare datapalin.txt conține următoarele informații : - pe prima linie un număr nr_date reprezentând numărul de date calendaristice; - pe fiecare dintre următoarele nr_date linii câte o dată calendaristică de forma zz/ll/aaaa (două cifre pentru zi, două cifre pentru lună, patru cifre pentru an) .
Date de ieșire
Fișierul de ieșire datapalout.txt va conține pe prima linie numărul de date calendaristice palindrom iar pe a doua linie secolele cu cele mai multe date palindrom, în ordine cronologică. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse.", iar daca indeplinesc cerintele enuntate se va afisa mesajul Datele de intrare corespund restricțiilor impuse."
Restricţii şi precizări
- 0 < nr_date⩽ 1000
- toate datele calendaristice sunt valide;
- în colecția de date de test există întotdeauna cel puțin o dată palindromică
- anii aparțin perioadei 10-9999 și sunt d.Hr.
Exemplu 1
- datapalin.txt
5 01122110 11111111 19111111 09122190 12111121
- datapalout.txt
Datele de intrare corespund cerintelor impuse 4 12 22
Exemplu 2
- datapalin.txt
5 01122110 11111111 19111111 0912190 12111121
- datapalout.txt
Datele de intrare nu corespund cerintelor impuse
Rezolvare
<syntaxhighlight lang="python" line> from collections import defaultdict
def este_palindrom(data):
return data == data[::-1]
def citeste_date_din_fisier(cale_fisier):
try: with open(cale_fisier, "r") as f: nr_date = int(f.readline().strip()) date_agenda = [f.readline().strip() for _ in range(nr_date)] except (ValueError, FileNotFoundError): return None # Returnăm None dacă nu se pot citi datele din fișier
return date_agenda
def gaseste_secole_cu_cele_mai_multe_date_palindromice(date_palindromice):
secole_aparitii = defaultdict(list)
for data in date_palindromice: an = int(data[4:]) secol = an // 100 + 1 secole_aparitii[secol].append(an)
max_count = max(len(aparitii) for aparitii in secole_aparitii.values()) secole_max_count = sorted([secol for secol, aparitii in secole_aparitii.items() if len(aparitii) == max_count])
return secole_max_count
def main():
date_agenda = citeste_date_din_fisier("datapalin.txt")
if date_agenda is None or any(len(data) != 8 for data in date_agenda): with open("datapalout.txt", "w") as f_output: f_output.write("Datele de intrare nu corespund cerintelor impuse\n") else: # Câte date palindromice au fost găsite date_palindromice = [data for data in date_agenda if este_palindrom(data)] numar_date_palindromice = len(date_palindromice)
# Găsește secolele cu cele mai multe date palindromice secole_max_count = gaseste_secole_cu_cele_mai_multe_date_palindromice(date_palindromice)
# Scrie rezultatele în fișierul de ieșire with open("datapalout.txt", "w") as f_output: f_output.write("Datele de intrare corespund cerintelor impuse\n") f_output.write(str(numar_date_palindromice) + "\n") f_output.write(" ".join(map(str, secole_max_count)))
if __name__ == "__main__":
main()
</syntaxhighlight>
Explicație
Sunt 4 date palindromice: două în secolul 12 și două în secolul 22