2246 - Adobe

De la Universitas MediaWiki

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 000 de 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

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