2901 – Data Pal: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==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 re...
 
No edit summary
Line 4: Line 4:
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.
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 ==
== Date de intrare ==
Fișierul de intrare '''datapal.in''' conține următoarele informații :
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 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) .
- 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 ==  
== Date de ieșire ==  
Fișierul de ieșire '''datapal.out''' 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ă.
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.".
Î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 ==
== Restricţii şi precizări ==
* 0 < '''nr_date'''⩽ 1000
* 0 < '''nr_date'''⩽ 1000
Line 18: Line 18:
== Exemplu 1 ==
== Exemplu 1 ==
; Intrare
; Intrare
: 5
5
: 01122110
01122110
: 11111111
11111111
: 19111111
19111111
: 09122190
09122190
: 12111121
12111121


; Ieșire
; Ieșire
: 4  
Datele de intrare corespund cerintelor impuse
: 12 22
4  
12 22
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
; Intrare
; Intrare
: 5
5
: 01122110
01122110
: 11111111
11111111
: 19111111
19111111
: 0912190
0912190
: 12111121
12111121
; Ieșire
; Ieșire
: Datele de intrare nu corespund cerintelor impuse
Datele de intrare nu corespund cerintelor impuse


<br>
<br>
Line 77: Line 78:


def main():
def main():
     date_agenda = citeste_date_din_fisier("datapal.in")
     date_agenda = citeste_date_din_fisier("datapalin.txt")


     if date_agenda is None or any(len(data) != 8 for data in date_agenda):
     if date_agenda is None or any(len(data) != 8 for data in date_agenda):
         with open("datapal.out", "w") as f_output:
         with open("datapalout.txt", "w") as f_output:
             f_output.write("Datele de intrare nu corespund cerintelor impuse\n")
             f_output.write("Datele de intrare nu corespund cerintelor impuse\n")
         return  # Ieșim din program dacă datele nu corespund cerințelor
    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)


    # Câte date palindromice au fost găsite
        # Găsește secolele cu cele mai multe date palindromice
    date_palindromice = [data for data in date_agenda if este_palindrom(data)]
        secole_max_count = gaseste_secole_cu_cele_mai_multe_date_palindromice(date_palindromice)
    numar_date_palindromice = len(date_palindromice)


    # Găsește secolele cu cele mai multe date palindromice
        # Scrie rezultatele în fișierul de ieșire
    secole_max_count = gaseste_secole_cu_cele_mai_multe_date_palindromice(date_palindromice)
        with open("datapalout.txt", "w") as f_output:
 
            f_output.write("Datele de intrare corespund cerintelor impuse\n")
    # Scrie rezultatele în fișierul de ieșire
            f_output.write(str(numar_date_palindromice) + "\n")
    with open("datapal.out", "w") as f_output:
            f_output.write(" ".join(map(str, secole_max_count)))
        f_output.write(str(numar_date_palindromice) + "\n")
        f_output.write(" ".join(map(str, secole_max_count)))




if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()


</syntaxhighlight>
</syntaxhighlight>
==Explicație==
==Explicație==
Sunt 4 date palindromice: două în secolul 12 și două în secolul 22
Sunt 4 date palindromice: două în secolul 12 și două în secolul 22

Revision as of 18:28, 4 January 2024

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

Intrare
5
01122110
11111111
19111111
09122190
12111121
Ieșire
Datele de intrare corespund cerintelor impuse
4 
12 22


Exemplu 2

Intrare
5
01122110
11111111
19111111
0912190
12111121
Ieșire
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