2901 – Data Pal: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
Line 17: Line 17:


== Exemplu 1 ==
== Exemplu 1 ==
; Intrare
; datapalin.txt
  5
  5
  01122110
  01122110
Line 25: Line 25:
  12111121
  12111121


; Ieșire
; datapalout.txt
  Datele de intrare corespund cerintelor impuse
  Datele de intrare corespund cerintelor impuse
  4  
  4  
Line 31: Line 31:
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
; Intrare
; datapalin.txt
  5
  5
  01122110
  01122110
Line 38: Line 38:
  0912190
  0912190
  12111121
  12111121
; Ieșire
; datapalout.txt
  Datele de intrare nu corespund cerintelor impuse
  Datele de intrare nu corespund cerintelor impuse



Latest revision as of 19:21, 9 January 2024

Context[edit]

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

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

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

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

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

datapalin.txt
5
01122110
11111111
19111111
09122190
12111121
datapalout.txt
Datele de intrare corespund cerintelor impuse
4 
12 22


Exemplu 2[edit]

datapalin.txt
5
01122110
11111111
19111111
0912190
12111121
datapalout.txt
Datele de intrare nu corespund cerintelor impuse


Rezolvare[edit]

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

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