1000 - CNP

From Bitnami MediaWiki

Cerința[edit | edit source]

Se consideră un fişier care conţine informaţii despre mai multe persoane, sub o formă nestructurată. Informaţiile sunt dispuse pe linii de maxim 200 de caractere şi pot conţine CNP-uri valide. Ştiind că CNP-ul unei persoane este un şir de exact 13 cifre consecutive, scrieţi un program care determină şi scrie în fişierul de ieșire, pe linii distincte, toate CNP-urile extrase din text. Dacă în fișierul de intrare nu se află niciun CNP, în fișierul de ieșire se va afișa numai valoarea 0.

Date de intrare[edit | edit source]

Fișierul de intrare cnp.in conține informațiile date.

Date de ieșire[edit | edit source]

Fișierul de ieșire cnp.out va conține CNP-urile determinate, câte unul pe o linie, sau valoarea 0 dacă în fișierul de intrare nu există CNP-uri.

Exemplul 1[edit | edit source]

cnp.in
Popescu Grigore, 14 ani, 1991212122334;
Gigel Banu - 1031102453435, Bujorului 7;
Dana Marin: 2690405358687, fara viza, 2450609987654 -
Jane Doe
cnp.out
1991212122334
1031102453435
2690405358687
2450609987654

Exemplul 2[edit | edit source]

cnp.in
Popescu Grigore, 14 ani, 1991212134;
Gigel Banu - 103110245Bujorului 7;
Dana Marin: 269-04-05-358687, fara viza, 2+450609+987654 -
Jane Doe
cnp.out
0

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1000 CNP

import re import os

def extrage_cnp(text):

 regex = r'\b\d{13}\b'  # căutăm grupuri de exact 13 cifre
 return re.findall(regex, text)

def verifica_date_intrare(nume_fisier):

 if not os.path.exists(nume_fisier):
   return False
 if not os.path.isfile(nume_fisier):
   return False
 if not os.access(nume_fisier, os.R_OK):
   return False
 return True

def main():

 nume_fisier_intrare = 'cnp.in'
 nume_fisier_iesire = 'cnp.out'
 if not verifica_date_intrare(nume_fisier_intrare):
   with open(nume_fisier_iesire, 'w') as fout:
     fout.write("Date invalide: Fisierul de intrare nu poate fi citit.")
   return
 # Verificare dacă fișierul de intrare este gol
 if os.path.getsize(nume_fisier_intrare) == 0:
   with open(nume_fisier_iesire, 'w') as fout:
     fout.write("Date invalide: Fisierul de intrare este gol.")
   return
 
 with open(nume_fisier_intrare, 'r') as fin:
   text = fin.read()
 
 cnp_list = extrage_cnp(text)
 
 if cnp_list:
   with open(nume_fisier_iesire, 'w') as fout:
     for cnp in cnp_list:
       fout.write(cnp + '\n')
 else:
   with open(nume_fisier_iesire, 'w') as fout:
     fout.write("0")

if __name__ == "__main__":

 main()

</syntaxhighlight>