1923 - Cifre egale
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
<syntaxhighlight lang="python" line>
- 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")
</syntaxhighlight>