2446 - Numere 24: Difference between revisions

From Bitnami MediaWiki
 
(4 intermediate revisions by 2 users not shown)
Line 31: Line 31:
: Datele sunt introduse corect.
: Datele sunt introduse corect.
: 10
: 10
=== Explicație ===
== Explicație ==
'''n=2''' și al doilea număr eliminat este '''10'''. ('''C''' fiind '''1''' se rezolvă numai cerința 1)
'''n=2''' și al doilea număr eliminat este '''10'''. ('''C''' fiind '''1''' se rezolvă numai cerința 1)
===Exemplul 2===
===Exemplul 2===
Line 38: Line 38:
: 1205
: 1205
; numere24.out
; numere24.out
: Datele sunt introduse corect.
: 0 2 1
: 0 2 1
=== Explicație ===
 
== Explicație ==
'''x=1205''', numărul '''120''' nu apare în șir, deci '''n1=0''', '''12''' apare de două ori, deci '''n2=2''', iar '''1''' apare o singură dată, deci '''n3=1''' ('''C''' fiind '''2''' se rezolvă numai cerința 2)
'''x=1205''', numărul '''120''' nu apare în șir, deci '''n1=0''', '''12''' apare de două ori, deci '''n2=2''', iar '''1''' apare o singură dată, deci '''n3=1''' ('''C''' fiind '''2''' se rezolvă numai cerința 2)


Line 47: Line 49:
: 2
: 2
; numere24.out
; numere24.out
: Datele sunt introduse corect.
: 153
: 153


=== Explicație ===
== Explicație ==
'''k=2''' și în noul șir sunt '''153''' de numere de câte '''2''' cifre. ('''C''' fiind '''3''' se rezolvă numai cerința '''3''')
'''k=2''' și în noul șir sunt '''153''' de numere de câte '''2''' cifre. ('''C''' fiind '''3''' se rezolvă numai cerința '''3''')
<br>
<br>
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate_number(numar, limit):
def validare_numar(numar, limit):
     if not numar.isdigit():
     if not numar.isdigit():
         return False
         return False
Line 62: Line 65:




def validate_numbers(n, x, k, c):
def validare_numere(n, x, k, c):
     if c == 1:
     if c == 1:
         return validate_number(n, 2000000000)
         return validare_numar(n, 2000000000)
     elif c == 2:
     elif c == 2:
         return all(validate_number(numar, 2000000000) for numar in [x])
         return all(validare_numar(numar, 2000000000) for numar in [x])
     elif c == 3:
     elif c == 3:
         return validate_number(k, 50)
         return validare_numar(k, 50)
     return False
     return False




def build_sequence():
def constr_sir():
     sequence = [str(i) for i in range(10)]
     sir = [str(i) for i in range(10)]
     for i in range(1, 10):
     for i in range(1, 10):
         sequence.append(str(i * 10 + i))
         sir.append(str(i * 10 + i))
     for i in range(1, 100):
     for i in range(1, 100):
         for j in range(10):
         for j in range(10):
             s = str(i) + str(j) + str(i)[::-1]
             s = str(i) + str(j) + str(i)[::-1]
             sequence.append(s)
             sir.append(s)
     return sequence
     return sir




def solve_case_1(n):
def cerinta_1(n):
     sequence = build_sequence()
     sir = constr_sir()
     removed_numbers = []
     numere_eliminate = []
     i = 0
     i = 0
     while len(removed_numbers) < n:
     while len(numere_eliminate) < n:
         if sequence[i] not in removed_numbers and sequence[i] != sequence[i][::-1]:
         if sir[i] not in numere_eliminate and sir[i] != sir[i][::-1]:
             removed_numbers.append(sequence[i])
             numere_eliminate.append(sir[i])
             sequence[i] = sequence[i][:-1]
             sir[i] = sir[i][:-1]
         else:
         else:
             i += 1
             i += 1
     return removed_numbers[-1]
     return numere_eliminate[-1]




def solve_case_2(x):
def cerinta_2(x):
     sequence = build_sequence()
     sir = constr_sir()
     counts = [0, 0, 0]
     counts = [0, 0, 0]
     for i in range(len(sequence)):
     for i in range(len(sir)):
         if sequence[i][-1] == x:
         if sir[i][-1] == x:
             counts[0] += 1
             counts[0] += 1
             if len(sequence[i]) >= 2 and sequence[i][-2] == x // 10:
             if len(sir[i]) >= 2 and sir[i][-2] == x // 10:
                 counts[1] += 1
                 counts[1] += 1
                 if len(sequence[i]) >= 3 and sequence[i][-3] == x // 100:
                 if len(sir[i]) >= 3 and sir[i][-3] == x // 100:
                     counts[2] += 1
                     counts[2] += 1
     return counts
     return counts




def solve_case_3(k):
def cerinta_3(k):
     sequence = build_sequence()
     sir = constr_sir()
     count = 0
     count = 0
     for num in sequence:
     for num in sir:
         if len(num) == k:
         if len(num) == k:
             count += 1
             count += 1
Line 120: Line 123:




def main():
if __name__ == '__main__':
     with open('numere24.in', 'r') as f:
     with open('numere24.in', 'r') as f:
         c = int(f.readline().strip())
         c = int(f.readline().strip())
         n, x, k = map(int, f.readline().split())
         n, x, k = map(int, f.readline().split())


     if validate_numbers(n, x, k, c):
     if validare_numere(n, x, k, c):
         print("Datele sunt introduse corect.")
         print("Datele sunt introduse corect.")
         if c == 1:
         if c == 1:
             result = solve_case_1(n)
             result = cerinta_1(n)
             with open('numere24.out', 'w') as f:
             with open('numere24.out', 'w') as f:
                 f.write(str(result) + '\n')
                 f.write(str(result) + '\n')
         elif c == 2:
         elif c == 2:
             counts = solve_case_2(x)
             counts = cerinta_2(x)
             with open('numere24.out', 'w') as f:
             with open('numere24.out', 'w') as f:
                 f.write(' '.join(map(str, counts)) + '\n')
                 f.write(' '.join(map(str, counts)) + '\n')
         elif c == 3:
         elif c == 3:
             count = solve_case_3(k)
             count = cerinta_3(k)
             with open('numere24.out', 'w') as f:
             with open('numere24.out', 'w') as f:
                 f.write(str(count) + '\n')
                 f.write(str(count) + '\n')
Line 143: Line 146:


</syntaxhighlight>
</syntaxhighlight>
== Explicație rezolvare==
  Funcția validate_number(numar, limit) primește un șir de caractere numar și un număr întreg limit, și verifică dacă numar este un număr pozitiv și nu depășește limita specificată. Funcția returnează True dacă numar este valid și False altfel. <br> Funcția validate_numbers(n, x, k, c) primește patru argumente și validează fiecare argument în funcție de cazul specificat de c. Dacă toți argumentele sunt valide, funcția returnează True, altfel returnează False.<br> Funcția build_sequence() construiește o secvență de numere palindromice prin combinarea a trei tipuri de numere: cifre simple (0-9), numere cu două cifre identice (11, 22, ... , 99) și numere cu trei cifre, unde prima și ultima cifră sunt aceleași, iar cifra din mijloc variază de la 0 la 9. <br> Funcția solve_case_1(n) primește un număr întreg n și găsește cel de-al n-lea număr din secvența construită în funcția build_sequence() care nu este un palindrom și îl elimină prin ștergerea ultimei cifre. Funcția returnează numărul eliminat. <br> Funcția solve_case_2(x) primește un număr întreg x și calculează numărul de numere din secvența construită în funcția build_sequence() care au ultima cifră egală cu x, a doua cifră (dacă există) egală cu x // 10, și a treia cifră (dacă există) egală cu x // 100. Funcția returnează o listă cu cele trei numere calculate. <br> Funcția solve_case_3(k) primește un număr întreg k și calculează numărul de numere din secvența construită în funcția build_sequence() care au k cifre. Funcția returnează numărul calculat. <br> Funcția main() citește datele de intrare din fișierul numere24.in, validează datele cu ajutorul funcției validate_numbers(), și apoi apelează funcția specifică cazului specificat de c și scrie rezultatul în fișierul numere24.out.

Latest revision as of 11:03, 25 April 2023

Enunț[edit | edit source]

Se consideră răsturnatul unui număr natural valoarea obținută prin parcurgerea cifrelor acestuia de la dreapta la stânga. De exemplu, răsturnatul numărului 245 este 542. Un număr este palindrom dacă este egal cu răsturnatul său. De exemplu 121 este palindrom, iar numărul 21 nu este palindrom. Se consideră inițial șirul numerelor naturale 0, 1, 2, 3, 4, … Din acest șir se elimină numerele divizibile cu 10 și, după fiecare număr care NU este palindrom, se inserează răsturnatul său. Noul șir astfel obținut va fi 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 21, 13, 31, …

Cerinţa[edit | edit source]

Scrieți un program care să citească: 1. un număr natural n și să afișeze al n-lea număr eliminat din șirul inițial; 2. un număr natural x și să afișeze următoarele trei numere: n1 – numărul de apariții în noul șir ale numărului obținut din x prin eliminarea ultimei sale cifre; n2 – numărul de apariții în noul șir ale numărului obținut din x prin eliminarea ultimelor sale două cifre; n3 – numărul de apariții în noul șir ale numărului obținut din x prin eliminarea ultimelor sale trei cifre. 3. un număr natural k și să afișeze numărul valorilor de k cifre din noul șir.

Date de intrare[edit | edit source]

Fișierul de intrare numere24.in conține pe prima linie un număr natural C, care poate fi 1, 2 sau 3. Pe linia a doua se găsește numărul natural n, dacă C=1, sau numărul natural x, dacă C=2 sau numărul natural k, dacă C=3, numerele având semnificația din enunț

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou dacă valoarea lui C este 1, se va rezolva numai cerința 1. În acest caz, în fişierul de ieşire numere24.out se va scrie al n-lea număr eliminat. Dacă valoarea lui C este 2, se va rezolva numai cerința 2. În acest caz, în fişierul de ieşire numere24.out se vor scrie trei numere, n1, n2, n3, cu semnificația din enunț, în această ordine, separate prin câte spațiu. Dacă valoarea lui C este 3, se va rezolva numai cerința 3. În acest caz, fişierul de ieşire numere24.out va conține numărul valorilor de k cifre din noul șir . Î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[edit | edit source]

  • 1 ⩽ n ⩽ 2.000.000.000
  • 1000 ⩽ x ⩽ 2.000.000.000
  • 1 ⩽ k ⩽ 50 (1 ⩽ k ⩽ 18, pentru teste în valoare de 20 de puncte)
  • Pentru rezolvarea corectă a primei cerințe se acordă 10 puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 25 de puncte, iar pentru rezolvarea corectă a celei de a treia cerințe se acordă 55 de puncte.
  • În concurs s-au acordat 10 puncte din oficiu. Aici se acordă 10 puncte pentru exemplele din enunț.

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

numere24.in
1
2
numere24.out
Datele sunt introduse corect.
10

Explicație[edit | edit source]

n=2 și al doilea număr eliminat este 10. (C fiind 1 se rezolvă numai cerința 1)

Exemplul 2[edit | edit source]

numere24.in
2
1205
numere24.out
Datele sunt introduse corect.
0 2 1

Explicație[edit | edit source]

x=1205, numărul 120 nu apare în șir, deci n1=0, 12 apare de două ori, deci n2=2, iar 1 apare o singură dată, deci n3=1 (C fiind 2 se rezolvă numai cerința 2)

Exemplul 3[edit | edit source]

numere24.in
3
2
numere24.out
Datele sunt introduse corect.
153

Explicație[edit | edit source]

k=2 și în noul șir sunt 153 de numere de câte 2 cifre. (C fiind 3 se rezolvă numai cerința 3)

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare_numar(numar, limit):

   if not numar.isdigit():
       return False
   if int(numar) < 0 or int(numar) > limit:
       return False
   return True


def validare_numere(n, x, k, c):

   if c == 1:
       return validare_numar(n, 2000000000)
   elif c == 2:
       return all(validare_numar(numar, 2000000000) for numar in [x])
   elif c == 3:
       return validare_numar(k, 50)
   return False


def constr_sir():

   sir = [str(i) for i in range(10)]
   for i in range(1, 10):
       sir.append(str(i * 10 + i))
   for i in range(1, 100):
       for j in range(10):
           s = str(i) + str(j) + str(i)[::-1]
           sir.append(s)
   return sir


def cerinta_1(n):

   sir = constr_sir()
   numere_eliminate = []
   i = 0
   while len(numere_eliminate) < n:
       if sir[i] not in numere_eliminate and sir[i] != sir[i][::-1]:
           numere_eliminate.append(sir[i])
           sir[i] = sir[i][:-1]
       else:
           i += 1
   return numere_eliminate[-1]


def cerinta_2(x):

   sir = constr_sir()
   counts = [0, 0, 0]
   for i in range(len(sir)):
       if sir[i][-1] == x:
           counts[0] += 1
           if len(sir[i]) >= 2 and sir[i][-2] == x // 10:
               counts[1] += 1
               if len(sir[i]) >= 3 and sir[i][-3] == x // 100:
                   counts[2] += 1
   return counts


def cerinta_3(k):

   sir = constr_sir()
   count = 0
   for num in sir:
       if len(num) == k:
           count += 1
       elif len(num) > k:
           break
   return count


if __name__ == '__main__':

   with open('numere24.in', 'r') as f:
       c = int(f.readline().strip())
       n, x, k = map(int, f.readline().split())
   if validare_numere(n, x, k, c):
       print("Datele sunt introduse corect.")
       if c == 1:
           result = cerinta_1(n)
           with open('numere24.out', 'w') as f:
               f.write(str(result) + '\n')
       elif c == 2:
           counts = cerinta_2(x)
           with open('numere24.out', 'w') as f:
               f.write(' '.join(map(str, counts)) + '\n')
       elif c == 3:
           count = cerinta_3(k)
           with open('numere24.out', 'w') as f:
               f.write(str(count) + '\n')
   else:
       print("Datele nu corespund restricțiilor impuse.")

</syntaxhighlight>