2901 – Data Pal

De la Universitas MediaWiki

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

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

Explicație

Sunt 4 date palindromice: două în secolul 12 și două în secolul 22