1346 - PbInfo

De la Universitas MediaWiki

Cerinţa

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

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

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

  • 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

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


Exemplul 2

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


Exemplul 3

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


Exemplul 4

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


Rezolvare

# 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")


# 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")