2901 – Data Pal: Difference between revisions
Tita Marian (talk | contribs) 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... |
Tita Marian (talk | contribs) 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 ''' | 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 ''' | 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 | |||
01122110 | |||
11111111 | |||
19111111 | |||
09122190 | |||
12111121 | |||
; Ieșire | ; Ieșire | ||
Datele de intrare corespund cerintelor impuse | |||
4 | |||
12 22 | |||
<br> | <br> | ||
== Exemplu 2 == | == Exemplu 2 == | ||
; Intrare | ; Intrare | ||
5 | |||
01122110 | |||
11111111 | |||
19111111 | |||
0912190 | |||
12111121 | |||
; Ieșire | ; Ieșire | ||
Datele de intrare nu corespund cerintelor impuse | |||
<br> | <br> | ||
Line 77: | Line 78: | ||
def main(): | def main(): | ||
date_agenda = citeste_date_din_fisier(" | 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(" | 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") | ||
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__": | 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