2415 - Nr Pal

De la Universitas MediaWiki

Sursa: [1]


Cerinţa

Se dau numar întrebări de forma: Câte palindromuri există în intervalul [a, b]?, unde a și b sunt numere naturale date, cu a ≤ b.

Date de intrare

Fișierul de intrare nr_pal.in conține pe prima linie numărul natural nenul numar, iar pe următoarele numar linii, numar perechii de forma a b ce reprezintă capetele intervalelor.

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 nr_pal.out va conține răspunsurile la cele numar întrebări, fiecare pe câte un rând.. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."'.

Restricţii şi precizări

  • 0 < n100000
  • 0ab1.000.000.000

Exemple

Exemplul 1

nr_pal.in
2
5 23
1 255
Ecran
Datele sunt introduse corect.
nr_pal.out
7
34

Explicație

La prima întrebare în intervalul [5,23] exista 7 palindromuri: 5,6,7,8,9,11,22.

Rezolvare

# 2415

def numar_palindroame(a, b):
    count = 0
    for i in range(a, b + 1):
        if str(i) == str(i)[::-1]:
            count += 1
    return count


def citire_date(nume_fisier):
    with open(nume_fisier, 'r') as f:
        numar = int(f.readline())
        intervale = []
        for i in range(numar):
            a, b = map(int, f.readline().split())
            intervale.append((a, b))
    return intervale



def main():
    try:
        intervale = citire_date('nr_pal.in')
        print("Datele sunt introduse corect.")
        with open('nr_pal.out', 'w') as f:
            for a, b in intervale:
                f.write(str(numar_palindroame(a, b)) + '\n')
    except ValueError:
        print("Datele nu corespund restricțiilor impuse.")

if __name__ == '__main__':
    main()

Explicație rezolvare

   Funcția numar_palindroame(a, b) primește două argumente a și b, reprezentând capetele intervalului, și calculează numărul de palindroame din intervalul dat. Inițial, variabila count este setată la 0, apoi se parcurge intervalul de la a la b + 1. Pentru fiecare număr în interval, se verifică dacă reprezentarea sa sub formă de șir de caractere este aceeași cu șirul obținut prin inversarea acestuia (str(i)[::-1] reprezintă șirul obținut prin inversarea șirului str(i)), caz în care variabila count este incrementată. Funcția returnează valoarea finală a variabilei count.
Funcția citire_date(nume_fisier) primește un singur argument nume_fisier, reprezentând numele fișierului de intrare, și returnează o listă de perechi de forma (a, b), reprezentând intervalul specificat în fiecare linie a fișierului de intrare. Funcția deschide fișierul de intrare și citește numărul de întrebări, apoi parcurge liniile rămase din fișier și extrage capetele intervalului din fiecare linie cu ajutorul funcției split(). Capetele intervalului sunt convertite la numere întregi cu ajutorul funcției int() și sunt adăugate la o listă de intervale. Funcția returnează lista de intervale.
Funcția main() reprezintă punctul de intrare în program. În primul rând, se încearcă citirea datelor de intrare folosind funcția citire_date(). Dacă datele sunt citite cu succes, se afișează un mesaj de confirmare și se deschide fișierul de ieșire. Pentru fiecare interval din lista de intervale, se calculează numărul de palindroame din interval folosind funcția numar_palindroame() și se scrie valoarea în fișierul de ieșire. Dacă apare o excepție de tipul ValueError în timpul citirii datelor de intrare, se afișează un mesaj de eroare.