2246 - Adobe

From Bitnami MediaWiki

Cerința[edit | edit source]

Domnul Eboda dorește să se angajeze la firma Adobe. La interviu el primește următoarea problemă.

Se dă un șir de caractere format din litere și caracterele *, + și -. Domnul Eboda trebuie să determine câte subsecvențe de lungime 5 sunt anagrame ale cuvântului ADOBE. Regulile suplimentare sunt că nu se face distincție între literele mari și cele mici și în plus, caracterul + poate suplini oricare consoană, caracterul - suplinește orice vocală, iar * suplinește orice literă. Cu aceste reguli putem spune că următoarele secvențe de cinci caractere sunt anagrame ale cuvântului adobe: aeobd, dBoAE, db---, Ae-++, *****, ++---, ad*-+.

Date de intrare[edit | edit source]

Programul citește de la tastatură șirul de caractere.

Date de ieșire[edit | edit source]

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."

Pe următoarea linie se va afișa un singur număr natural reprezentând numărul de subsecvențe de lungime 5 care sunt anagrame ale cuvântului ADOBE.

Î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."

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

  • Șirul va avea cel mult 100 000 de caractere și nu conține alte caractere în afara celor precizate în enunț.

Exemplu 1[edit | edit source]

Intrare
ebodaE+m***++
Ieșire
Datele de intrare corespund restricțiilor impuse.
4

Explicație[edit | edit source]

Cele patru subsecvențe sunt: eboda, bodaE, odaE+ și ***++.

Exemplu 2[edit | edit source]

Intrare
e1b2o3d4a5E6+7m8*9*0*9+8+76
Ieșire
Datele de intrare nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 2246 - Adobe

import re


def conditii(sir):

   if re.match("^[a-zA-Z*+-]*$", sir):
       return True


def adobe(sir):

   # Șirul este case-insensitive, deci poate fi convertit în litere mici
   sir = sir.lower()
   # Ținem cont de subsecvențe
   nr_subsecvente = 0
   # Pentru fiecare grupare de 5 caractere
   for i in range(0, len(sir)-5):
       # Dacă este anagramă a cuvântului "adobe"...
       if sorted(sir[i:i + 5]) == sorted("adobe"):
           # ...creștem numărul de subsecvențe
           nr_subsecvente += 1
           continue
       # Altfel...
       else:
           subsir = sir[i:i + 5]
           # Inițializăm numărul de consoane, vocale și litere lipsă
           # "Adobe" conține 2 consoane, 3 vocale; în total 5 litere
           consoane_lipsa, vocale_lipsa, litere_lipsa = 2, 3, 5
           # Pentru fiecare caracter din subsir...
           for caracter in subsir:
               # ...dacă caracterul este *...
               if caracter == "*":
                   # ...scădem numărul de vocale, consoane și litere lipsă
                   litere_lipsa -= 1
                   vocale_lipsa -= 1
                   consoane_lipsa -= 1
                   continue
               # ...dacă caracterul este vocală sau -...
               if caracter in ("a", "o", "e", "-"):
                   # ...scădem numărul de vocale și litere lipsă
                   vocale_lipsa -= 1
                   litere_lipsa -= 1
                   continue
               # ...dacă caracterul este consoană sau +...
               if caracter in ("b", "d", "+"):
                   # ...scădem numărul de consoane și litere lipsă
                   consoane_lipsa -= 1
                   litere_lipsa -= 1
                   continue
           # Dacă nu mai lipsesc consoane, vocale sau litere...
           if consoane_lipsa+vocale_lipsa+litere_lipsa == 0:
               # ...creștem numărul de subsecvențe
               nr_subsecvente += 1
   print(nr_subsecvente)


if __name__ == "__main__":

   sir = input()
   if not conditii(sir):
       print("Datele de intrare nu corespund restricțiilor impuse.")
   else:
       print("Datele de intrare corespund restricțiilor impuse.")
       adobe(sir)

</syntaxhighlight>