1346 - PbInfo

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Hacker-ul Gogu și-a neglijat serios activitatea în ultima vreme, așa că și-a propus să mai spargă încă un site, care, din întâmplare, este chiar www.pbinfo.ro.

Date de intrare[edit | edit source]

Pe prima linie se citește un șir reprezentând un link al site-ului PbInfo. Pe linia a doua, se citește un număr întreg n (1 <= n <= 20), iar pe următoarele n linii se citesc n cuvinte cheie. Scopul vostru este să aflați dacă hacker-ul Gogu s-a infiltrat și a schimbat link-ul original.

Date de ieşire[edit | edit source]

Dacă link-ul dat conține unul din cuvintele cheie precizate în fișierul de intrare sau conține cuvântul “virus”, afișați DA, altfel afișați NU.

Restricții și precizări[edit | edit source]

  • cuvintele vor fi mai scurte decât link-ul precizat, iar link-ul va avea maxim 100 de caractere;
  • hacker-ul Gogu nu este profesionist, așa că nu este nevoie să va alarmați;
  • input-ul va conține numai litere mici ale alfabetului englez și separatorii ,.!?/:.

Exemplul 1[edit | edit source]

pbinfoin.txt
//htttp:www.pbinfo.ro
3
hacked
gogu
htttp
pbinfoout.txt
Datele de intrare corespund restrictiilor impuse.
DA


Exemplul 2[edit | edit source]

pbinfoin.txt
//http:www.pbinfo.ro 
3
hacked
gogu
htttp
pbinfoout.txt
Datele de intrare corespund restrictiilor impuse.
NU


Exemplul 3[edit | edit source]

pbinfoin.txt
//http:www.pbinfo.virus.ro
1
gogu
pbinfoout.txt
Datele de intrare corespund restrictiilor impuse.
DA


Exemplul 4[edit | edit source]

pbinfoin.txt
//http:www.pbinfo.virus.ro
223
hacked
gogu
pbinfoout.txt
Datele de intrare nu corespund restrictiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. functia de validare verifica daca datele de intrare sunt in intervalul specificat

def validare(n_validare, link_validare, cuvinte_cheie_validare):

   # verificam daca n este in intervalul 1-20
   if n_validare <= 0 or n_validare > 20:
       raise ValueError  # ridicam o eroare daca n nu este in intervalul 1-20
   # verificam daca lungimea link-ului este mai mica sau egala cu 100
   if len(link_validare) > 100:
       raise ValueError
   for cuvant in cuvinte_cheie_validare:    # parcurgem lista de cuvinte cheie
       # verificam daca lungimea cuvantului este mai mica decat lungimea link-ului
       if len(cuvant) >= len(link_validare):
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse.\n")


  1. functia is_hacked verifica daca link-ul a fost spart

def is_hacked(link, cuvinte_cheie):

   # verificam daca link-ul contine unul din cuvintele cheie sau cuvantul "virus"
   return any(cuvant in link for cuvant in cuvinte_cheie) or "virus" in link


if __name__ == '__main__':

   file_in = open("pbinfoin.txt", "r")
   file_out = open("pbinfoout.txt", "w")
   try:
       # citim link-ul
       link_main = file_in.readline().strip()
       # citim numarul de cuvinte cheie
       n_main = int(file_in.readline())
       # citim cuvintele cheie
       cuvinte_cheie_main = [file_in.readline().strip() for _ in range(n_main)]
       # validam datele de intrare
       validare(n_main, link_main, cuvinte_cheie_main)
       # verificam daca link-ul a fost spart si scriem rezultatul in fisierul de iesire
       file_out.write('DA\n' if is_hacked(link_main, cuvinte_cheie_main) else 'NU\n')
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>