2363 - Joc 8
Sursa: [1]
Cerinţa[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 1 < n < 1000000.
- cele n numere din joc au cel mult nouă cifre fiecare.
Exemple[edit | edit source]
- joc8.in
- 10
- 193 7 721 14263 28 279 9 1523142 769 15752
- Ecran
- Datele sunt introduse corect.
- joc8.out
- 6
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 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.")
</syntaxhighlight>
Explicație rezolvare[edit | edit source]
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.