2246 - Adobe
Cerința
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
Programul citește de la tastatură șirul de caractere.
Date de ieșire
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
- Șirul va avea cel mult
100 000de caractere și nu conține alte caractere în afara celor precizate în enunț.
Exemplu 1
- Intrare
- ebodaE+m***++
- Ieșire
- Datele de intrare corespund restricțiilor impuse.
- 4
Explicație
Cele patru subsecvențe sunt: eboda, bodaE, odaE+ și ***++.
Exemplu 2
- Intrare
- e1b2o3d4a5E6+7m8*9*0*9+8+76
- Ieșire
- Datele de intrare nu corespund restricțiilor impuse.
Rezolvare
<syntaxhighlight lang="python" line="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>