4127 – Șiruri4: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerința == Dându-se cele N numere din șir să se determine: <br> Câte numere din șirul inițial nu au nevoie de transformare (conțin doar cifre distincte)? <br> Câte numere va conține șirul după realizarea tuturor operațiilor de unire? <br> Care este numărul maxim de cifre ale unui număr din noul șir și câte numere au acest număr maxim de cifre? == Date de intrare == Fișierul de intrare siruri.in conține pe prima linie un număr natural c (1, 2 sau 3). P...
 
No edit summary
 
Line 31: Line 31:
<br>
<br>
Pentru 42 puncte, c = 3
Pentru 42 puncte, c = 3
== Exemplu 1 ==
== Exemplul 1 ==
; Intrare
; siruriin.txt
: siruri.in
:1
:1
:8
:8
:21245 51278 869 33447 723 397897 545786 6783221
:21245 51278 869 33447 723 397897 545786 6783221
; Ieșire
; siruriout.txt
: siruri.out
:3  
:3  
<br>
<br>
== Exemplu 2 ==
== Exemplul 2 ==
; Intrare
; siruriin.txt
: siruri.in
:2
:2
:8
:8
:21245 51278 869 33447 723 397897 545786 6783221
:21245 51278 869 33447 723 397897 545786 6783221
; Ieșire
; siruriout.txt
: siruri.out
:4
:4
<br>
<br>
Line 80: Line 76:


     return numere_transformate, numere
     return numere_transformate, numere
def verificare_restrictii(numar):    # funcția de verificare a datelor de intrare
    if 1 < numar <= 100.000  # adăugăm restricția pentru n
      1 < a[i] <= 1.000.000.000:
        return True
    else:
        return False


def main():
def main():
     with open("siruri.in", "r") as file_in:
     with open("siruriin.txt", "r") as file_in:
         cerinta = int(file_in.readline().strip())
         cerinta = int(file_in.readline().strip())
         N = int(file_in.readline().strip())
         N = int(file_in.readline().strip())
Line 89: Line 91:
     if cerinta == 1:
     if cerinta == 1:
         numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
         numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
         with open("siruri.out", "w") as file_out:
         with open("siruriout.txt", "w") as file_out:
             file_out.write(str(numere_fara_transformare))
             file_out.write(str(numere_fara_transformare))
     elif cerinta == 2:
     elif cerinta == 2:
         _, numere_dupa_procesare = procesare_sir(sir)
         _, numere_dupa_procesare = procesare_sir(sir)
         with open("siruri.out", "w") as file_out:
         with open("siruriout.txt", "w") as file_out:
             file_out.write(str(len(numere_dupa_procesare)) + "\n")
             file_out.write(str(len(numere_dupa_procesare)) + "\n")
             file_out.write(" ".join(map(str, numere_dupa_procesare)))
             file_out.write(" ".join(map(str, numere_dupa_procesare)))
Line 100: Line 102:
         numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
         numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
         numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
         numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
         with open("siruri.out", "w") as file_out:
         with open("siruriout.txt", "w") as file_out:
             file_out.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")
             file_out.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")


Line 133: Line 135:


def main():
def main():
     with open("siruri.in", "r") as file_in:
     with open("siruriin.txt", "r") as filein.txt:
         cerinta = int(file_in.readline().strip())
         cerinta = int(filein.txt.readline().strip())
         N = int(file_in.readline().strip())
         N = int(filein.txt.readline().strip())
         sir = list(map(int, file_in.readline().split()))
         sir = list(map(int, filein.txt.readline().split()))


     if cerinta == 1:
     if cerinta == 1:
         numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
         numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
         with open("siruri.out", "w") as file_out:
         with open("siruriout.txt", "w") as fileout.txt:
             file_out.write(str(numere_fara_transformare))
             fileout.txt.write(str(numere_fara_transformare))
     elif cerinta == 2:
     elif cerinta == 2:
         _, numere_dupa_procesare = procesare_sir(sir)
         _, numere_dupa_procesare = procesare_sir(sir)
         with open("siruri.out", "w") as file_out:
         with open("siruriout.txt", "w") as fileout.txt:
             file_out.write(str(len(numere_dupa_procesare)) + "\n")
             fileout.txt.write(str(len(numere_dupa_procesare)) + "\n")
             file_out.write(" ".join(map(str, numere_dupa_procesare)))
             fileout.txt.write(" ".join(map(str, numere_dupa_procesare)))
     elif cerinta == 3:
     elif cerinta == 3:
         _, numere_dupa_procesare = procesare_sir(sir)
         _, numere_dupa_procesare = procesare_sir(sir)
         numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
         numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
         numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
         numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
         with open("siruri.out", "w") as file_out:
         with open("siruriotxtut.", "w") as fileout.txt:
             file_out.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")
             fileout.txt.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 16:59, 8 January 2024

Cerința[edit | edit source]

Dându-se cele N numere din șir să se determine:
Câte numere din șirul inițial nu au nevoie de transformare (conțin doar cifre distincte)?
Câte numere va conține șirul după realizarea tuturor operațiilor de unire?
Care este numărul maxim de cifre ale unui număr din noul șir și câte numere au acest număr maxim de cifre?

Date de intrare[edit | edit source]

Fișierul de intrare siruri.in conține pe prima linie un număr natural c (1, 2 sau 3). Pe a doua linie se găsește un număr natural nenul N. Pe a treia linie se află N numere naturale separate de câte un spațiu reprezentând șirul inițial.

Date de ieșire[edit | edit source]

În fișierul de ieșire siruri.out se va afla în funcție de cerința dată:
dacă c = 1, se va afișa pe prima linie numărul de numere ce nu au nevoie de transformare
dacă c = 2, se va afișa pe prima linie numărul de numere din șir după realizarea tuturor operațiilor de unire
dacă c = 3, se vor afișa pe prima linie două numere separate printr-un singur spatiu, reprezentând numărul maxim de cifre ale unui număr după efectuarea operațiilor de unire, respectiv numărul de astfel de numere cu număr maxim de cifre.

Restricții și precizări[edit | edit source]

c ∈ {1, 2, 3}
1 ≤ N ≤ 100.000
1 ≤ a[i] ≤ 1.000.000.000
a[i] conține doar cifre nenule, pentru oricare 1 ≤ i ≤ n
Pentru 18 puncte, c = 1
Pentru 40 puncte, c = 2
Pentru 42 puncte, c = 3

Exemplul 1[edit | edit source]

siruriin.txt
1
8
21245 51278 869 33447 723 397897 545786 6783221
siruriout.txt
3


Exemplul 2[edit | edit source]

siruriin.txt
2
8
21245 51278 869 33447 723 397897 545786 6783221
siruriout.txt
4


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 4127 – Șiruri4

def transformare_numar(numar):

   cifre_pastrate = set()
   rezultat = ""
   for cifra in str(numar)[::-1]:
       if cifra not in cifre_pastrate:
           cifre_pastrate.add(cifra)
           rezultat += cifra
   return int(rezultat[::-1])

def procesare_sir(sir):

   numere_transformate = 0
   numere = []
   for i in range(len(sir) - 1):
       if str(sir[i])[-1] == str(sir[i + 1])[0]:
           numar_nou = transformare_numar(int(str(sir[i]) + str(sir[i + 1])))
           numere_transformate += 1
           numere.append(numar_nou)
       else:
           numere.append(transformare_numar(sir[i]))
   numere.append(transformare_numar(sir[-1]))
   return numere_transformate, numere

def verificare_restrictii(numar): # funcția de verificare a datelor de intrare

   if 1 < numar <= 100.000   # adăugăm restricția pentru n
      1 < a[i] <= 1.000.000.000:
       return True
   else:
       return False

def main():

   with open("siruriin.txt", "r") as file_in:
       cerinta = int(file_in.readline().strip())
       N = int(file_in.readline().strip())
       sir = list(map(int, file_in.readline().split()))
   if cerinta == 1:
       numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
       with open("siruriout.txt", "w") as file_out:
           file_out.write(str(numere_fara_transformare))
   elif cerinta == 2:
       _, numere_dupa_procesare = procesare_sir(sir)
       with open("siruriout.txt", "w") as file_out:
           file_out.write(str(len(numere_dupa_procesare)) + "\n")
           file_out.write(" ".join(map(str, numere_dupa_procesare)))
   elif cerinta == 3:
       _, numere_dupa_procesare = procesare_sir(sir)
       numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
       numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
       with open("siruriout.txt", "w") as file_out:
           file_out.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")

if __name__ == "__main__":

   main()

def transformare_numar(numar):

   cifre_pastrate = set()
   rezultat = ""
   for cifra in str(numar)[::-1]:
       if cifra not in cifre_pastrate:
           cifre_pastrate.add(cifra)
           rezultat += cifra
   return int(rezultat[::-1])

def procesare_sir(sir):

   numere_transformate = 0
   numere = []
   for i in range(len(sir) - 1):
       if str(sir[i])[-1] == str(sir[i + 1])[0]:
           numar_nou = transformare_numar(int(str(sir[i]) + str(sir[i + 1])))
           numere_transformate += 1
           numere.append(numar_nou)
       else:
           numere.append(transformare_numar(sir[i]))
   numere.append(transformare_numar(sir[-1]))
   return numere_transformate, numere

def main():

   with open("siruriin.txt", "r") as filein.txt:
       cerinta = int(filein.txt.readline().strip())
       N = int(filein.txt.readline().strip())
       sir = list(map(int, filein.txt.readline().split()))
   if cerinta == 1:
       numere_fara_transformare = sum(transformare_numar(numar) == numar for numar in sir)
       with open("siruriout.txt", "w") as fileout.txt:
           fileout.txt.write(str(numere_fara_transformare))
   elif cerinta == 2:
       _, numere_dupa_procesare = procesare_sir(sir)
       with open("siruriout.txt", "w") as fileout.txt:
           fileout.txt.write(str(len(numere_dupa_procesare)) + "\n")
           fileout.txt.write(" ".join(map(str, numere_dupa_procesare)))
   elif cerinta == 3:
       _, numere_dupa_procesare = procesare_sir(sir)
       numar_maxim_cifre = max(len(str(numar)) for numar in numere_dupa_procesare)
       numere_maxim_cifre = sum(len(str(numar)) == numar_maxim_cifre for numar in numere_dupa_procesare)
       with open("siruriotxtut.", "w") as fileout.txt:
           fileout.txt.write(f"{numar_maxim_cifre} {numere_maxim_cifre}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>