1923 - Cifre egale

De la Universitas MediaWiki

Cerinţa

Afişaţi, în ordine crescătoare, toate numerele dintr-un anumit interval care au toate cifrele egale. Sunt două tipuri de cerinţe:

  • 1. se dau a şi b si se cer toate numerele din intervalul a, b (inclusiv, eventual, capetele).
  • 2. Se da x si se cer toate numerele cu maxim x cifre.

Date de intrare

Din fişierul egalein.txt se citeşte mai întâi un număr T. Dacă T este 1 pe a doua linie sunt două numere a şi b, separate prin spaţiu. Dacă T este 2, pe a doua linie va fi numărul x.

Date de ieşire

In fişierul egaleout.txt se scriu, pe un rând numerele cerute separate prin câte un spaţiu.

Restricții și precizări

  • 1 ⩽ a ⩽ b ⩽ 10 17
  • 1 ⩽ x ⩽ 100
  • Pentru 20% din punctaj avem T = 1 şi 1 ⩽ a, b ⩽ 10 4
  • Pentru încă 20% din punctaj avem T = 1 şi 10 8 ⩽ a, b ⩽ 10 9
  • Pentru încă 10% din punctaj avem T = 1 şi a, b > 10 9
  • Pentru 50% din punctaj avem T=2

Exemplul 1

egalein.txt
1
8 30
egaleout.txt
Datele de intrare corespund restrictiilor impuse
8 9 11 22

Exemplul 2

egalein.txt
2
2
egaleout.txt
Datele de intrare corespund restrictiilor impuse
1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99

Exemplul 3

egalein.txt
-19999
5 9 0
egaleout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

# 1923  Cifre egale
def validare(t_validare, a_validare, b_validare, x_validare):
    # Verificăm dacă t este în intervalul 1-2
    if t_validare < 1 or t_validare > 2:
        raise ValueError  # Ridicăm o eroare dacă t nu este în intervalul 1-2
    # Dacă t este 1, verificăm dacă a și b sunt în intervalul 1-10^17
    if t_validare == 1:
        if a_validare < 1 or b_validare > 10**17:
            raise ValueError  # Ridicăm o eroare dacă a sau b nu sunt în intervalul 1-10^17
    else:
        # Dacă t nu este 1, verificăm dacă x este în intervalul 1-100
        if x_validare < 1 or x_validare > 100:
            raise ValueError  # Ridicăm o eroare dacă x nu este în intervalul 1-100
    file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def numere_egale(t_egale, a_egale, b_egale, x_egale):
    rezultate_egale = []    # Inițializăm o listă goală pentru a stoca rezultatele
    # Dacă t este 1, setăm start și end la a și b + 1, respectiv
    if t_egale == 1:
        start = a_egale
        end = b_egale + 1
    else:
        start = 1   # Dacă t nu este 1, setăm start la 1 și end la 10 la puterea x
        end = 10 ** x_egale

    for i in range(start, end):    # Parcurgem fiecare număr în intervalul de la start la end
        if len(set(str(i))) == 1:
            rezultate_egale.append(i)
    return rezultate_egale    # Returnăm lista de rezultate


if __name__ == '__main__':
    file_in = open("egalein.txt", "r")    # Deschidem fișierul de intrare pentru citire
    file_out = open("egaleout.txt", "w")    # Deschidem fișierul de ieșire pentru scriere

    try:
        T_main = int(file_in.readline())    # Citim tipul de cerință
        if T_main == 1:
            # Citim capetele intervalului
            a_main, b_main = map(int, file_in.readline().split())
            x_main = None
        else:
            x_main = int(file_in.readline())    # Citim numărul maxim de cifre
            a_main = b_main = None

        validare(T_main, a_main, b_main, x_main)    # Validăm datele de intrare
        # Calculăm și scriem numerele cu toate cifrele egale
        rezultate_main = numere_egale(T_main, a_main, b_main, x_main)
        file_out.write(' '.join(map(str, rezultate_main)) + '\n')

    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")