2363 - Joc 8

De la Universitas MediaWiki

Sursa: [1]


Cerinţa

Elena și Maria au primit cadou un joc. Dintr-o cutie ce conține mai multe numere, fiecare extrage pe rand câte un număr și trebuie să descopere anumite condiții îndeplinite de aceste numere. Ele vor să determine câte numere alternante au fost extrase. Un număr este alternant dacă are număr impar de cifre și dacă orice cifră a numărului, cu excepția primei și a ultimei cifre se învecinează fie cu două cifre mai mari decât ea, fie cu două cifre mai mici decât ea.

Cunoscând numărul n de numere, precum şi cele n numere naturale extrase din cutie determinați câte dintre acestea au fost alternante.

Date de intrare

Fișierul de intrare joc8.in conţine pe prima linie numărul n de numere naturale, iar pe următoarea linie cele n numere naturale.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi fișierul de ieșire joc8.out va conţine pe prima linie un număr ce reprezintă numărul numerelor alternante citite.În caz contrar, pe ecran se va afișa: "Datele nu au fost introduse corect."

Restricţii şi precizări

  • 1 < n < 1000000.
  • cele n numere din joc au cel mult nouă cifre fiecare.

Exemple

joc8.in
10
193 7 721 14263 28 279 9 1523142 769 15752
Ecran
Datele sunt introduse corect.
joc8.out
6


Rezolvare

# 2363

def verifica_datele(n, numere):
    # Verifică dacă n este un număr întreg pozitiv mai mic decât 1000000
    if not isinstance(n, int) or n < 1 or n > 1000000:
        return False

    # Verifică dacă există exact n numere în listă și dacă fiecare număr are cel mult nouă cifre
    if len(numere) != n or not all(isinstance(nr, int) and 0 <= nr <= 999999999 for nr in numere):
        return False

    return True

def rezolva_problema(n, numere):
    numere_alternante = 0

    for nr in numere:
        nr_str = str(nr)
        nrcif = len(nr_str)

        if nrcif % 2 == 0 or nrcif == 1:
            continue

        alternant = True

        for i in range(1, nrcif - 1):
            if abs(int(nr_str[i]) - int(nr_str[i - 1])) != 2 or abs(int(nr_str[i]) - int(nr_str[i + 1])) != 2:
                alternant = False
                break

        if alternant:
            numere_alternante += 1

    return numere_alternante

if __name__ == "__main__":
    with open("joc8.in", "r") as f:
        n = int(f.readline().strip())
        numere = list(map(int, f.readline().strip().split()))

    if verifica_datele(n, numere):
        print("Datele sunt introduse corect.")
        rezultat = rezolva_problema(n, numere)
        with open("joc8.out", "w") as f:
            f.write(str(rezultat) + "\n")
    else:
        print("Datele nu au fost introduse corect.")

Explicație rezolvare

Funcția verifica_datele(n, numere) verifică dacă datele citite din fișierul de intrare sunt corecte, respectând restricțiile impuse de problemă. Ea primește numărul n de numere naturale citite din fișier și lista numere conținând aceste numere și returnează True dacă datele sunt introduse corect și False în caz contrar. Mai precis, ea verifică dacă n este un număr întreg pozitiv mai mic decât 1000000 și dacă lista de numere are exact n elemente, fiecare fiind un număr natural cu cel mult nouă cifre.

Funcția rezolva_problema(n, numere) primește aceleași date ca și funcția anterioară și calculează numărul de numere alternante din lista numere. O valoare este considerată alternantă dacă are număr impar de cifre și dacă orice cifră a numărului, cu excepția primei și a ultimei cifre, se învecinează fie cu două cifre mai mari decât ea, fie cu două cifre mai mici decât ea. Funcția parcurge toate numerele din lista numere, verifică dacă fiecare dintre ele este alternant și în caz afirmativ, crește cu 1 un contor pentru numerele alternante găsite.

În funcția principală main, se deschide fișierul de intrare "joc8.in", se citesc datele și se verifică dacă sunt introduse corect apelând funcția verifica_datele(n, numere). Dacă această funcție returnează True, se afișează un mesaj corespunzător și se calculează numărul de numere alternante apelând funcția rezolva_problema(n, numere). Acest număr se scrie în fișierul de ieșire "joc8.out". În caz contrar, se afișează un alt mesaj corespunzător.