1923 - Cifre egale: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == 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 '''egale.in''' se citeşte mai întâi un număr '''T'''. Dacă '''T''' este '''1''' pe a doua linie sunt dou...
 
No edit summary
Line 5: Line 5:
* 2. Se da x si se cer toate numerele cu maxim '''x''' cifre.
* 2. Se da x si se cer toate numerele cu maxim '''x''' cifre.
== Date de intrare ==
== Date de intrare ==
Din fişierul '''egale.in''' 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'''.
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 ==
== Date de ieşire ==
In fişierul '''egale.out''' se scriu, pe un rând numerele cerute separate prin câte un spaţiu.
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 ==
== Restricții și precizări ==
* 1 &les; a &les; b &les; 10<sup> 17 </sup>
* 1 &les; a &les; b &les; 10<sup> 17 </sup>
Line 15: Line 15:
* Pentru încă '''10%''' din punctaj avem '''T = 1''' şi a, b > 10<sup> 9 </sup>
* Pentru încă '''10%''' din punctaj avem '''T = 1''' şi a, b > 10<sup> 9 </sup>
* Pentru '''50%''' din punctaj avem '''T=2'''
* Pentru '''50%''' din punctaj avem '''T=2'''
== Exemplu ==
== Exemplul 1 ==
; egale.in
; egalein.txt
: 1
: 1
: 8 30
: 8 30
; egale.out
; egaleout.txt
: Datele de intrare corespund restrictiilor impuse
: 8 9 11 22
: 8 9 11 22
<br>
== Exemplul 2 ==
; egale.in
; egalein.txt
: 2
: 2
: 2
: 2
; egale.out
; 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
: 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 ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Definim funcția numere_egale
# 1923  Cifre egale
def numere_egale():
def validare(t_validare, a_validare, b_validare, x_validare):
     # Deschidem fișierul de intrare 'egale.in'
    # Verificăm dacă t este în intervalul 1-2
     with open('egale.in', 'r') as intrare:
    if t_validare < 1 or t_validare > 2:
        # Citim primul rând din fișier și îl convertim la int
        raise ValueError  # Ridicăm o eroare dacă t nu este în intervalul 1-2
         T = int(intrare.readline())
    # Dacă t este 1, verificăm dacă a și b sunt în intervalul 1-10^17
        # Dacă A este 1, citim următorul rând și extragem valorile a și b
    if t_validare == 1:
         if T == 1:
        if a_validare < 1 or b_validare > 10**17:
             a, b = map(int, intrare.readline().split())
            raise ValueError  # Ridicăm o eroare dacă a sau b nu sunt în intervalul 1-10^17
             start = a
    else:
            end = b + 1
        # 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:
         else:
             # Dacă A nu este 1, citim următorul rând și extragem valoarea x
             x_main = int(file_in.readline())   # Citim numărul maxim de cifre
            x = int(intrare.readline())
             a_main = b_main = None
             start = 1
 
            end = 10 ** x
        validare(T_main, a_main, b_main, x_main)   # Validăm datele de intrare
    # Inițializăm o listă goală pentru a stoca rezultatele
         # Calculăm și scriem numerele cu toate cifrele egale
    rezultate = []
         rezultate_main = numere_egale(T_main, a_main, b_main, x_main)
    # Parcurgem fiecare număr în intervalul de la start la end
         file_out.write(' '.join(map(str, rezultate_main)) + '\n')
    for i in range(start, end):
         # Dacă toate cifrele numărului sunt egale (adică setul cifrelor sale conține un singur element), îl adăugăm la rezultate
         if len(set(str(i))) == 1:
            rezultate.append(i)
    # Deschidem fișierul de ieșire 'egale.out'
    with open('egale.out', 'w') as iesire:
         # Scriem rezultatele în fișier, separate prin spațiu
        iesire.write(' '.join(map(str, rezultate)))


numere_egale()
    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>
</syntaxhighlight>

Revision as of 12:30, 10 November 2023

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>

  1. 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>