2182 - 3 Cifre: Difference between revisions

From Bitnami MediaWiki
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet 20172017; numerele cu trei cifre consecutive care se pot extrage sunt 201, 172, 720 și 201. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?
== Enunt ==
Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet '''20172017'''; numerele cu trei cifre consecutive care se pot extrage sunt '''201, 172, 720 și 201'''. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?


== Cerinta ==
== Cerinta ==


Fiind numărul un număr natural n și n numere naturale x (100 ≤ x ≤ 4294967295) să se determine:
Fiind numărul un număr natural '''n''' și '''n''' numere naturale '''x (100 ≤ x ≤ 4294967295)''' să se determine:
1. Cel mai mic și cel mai mare număr din trei cifre consecutive care apar în cele n numere, de câte ori apar ele, în ce număr x[1] apar prima dată și în ce număr x[2] apar ultima dată.
1. Cel mai mic și cel mai mare număr din trei cifre consecutive care apar în cele '''n''' numere, de câte ori apar ele, în ce număr '''x[1]''' apar prima dată și în ce număr '''x[2]''' apar ultima dată.
2. Numerele din trei cifre consecutive care apar de cele mai multe ori în cele n numere.
2. Numerele din trei cifre consecutive care apar de cele mai multe ori în cele n numere.


== Date de intrare ==
== Date de intrare ==


Fișierul de intrare 3cifre.txt conţine pe prima linie, separate printr-un spațiu, numărul natural n, reprezentând numărul de numere și cerința (1 sau 2). Pe cea de a doua linie sunt scrise cele n numere naturale x[1] x[2] ... x[n], separate prin câte un spațiu.
Fișierul de intrare '''3cifrein.txt''' conţine pe prima linie, separate printr-un spațiu, numărul natural n, reprezentând numărul de numere și cerința (1 sau 2). Pe cea de a doua linie sunt scrise cele n numere naturale '''x[1] x[2] ... x[n]''', separate prin câte un spațiu.


== Date de iesire ==
== Date de iesire ==


Fișierul de ieșire 3cifre.txt va conține, pentru cerința 1, pe prima linie patru valori naturale nrmin nrapmin x1min x1max, separate prin câte un spațiu, reprezentând numărul minim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată, iar pe linia a doua alte patru valori naturale nrmax nrapmax x2min x2max, separate prin câte un spațiu, reprezentând numărul maxim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată. Pentru cerința 2, fișierul de ieșire va conține pe prima linie numărul maxim de apariții a numerelor din trei cifre consecutive care apar, iar pe linia a doua, separate prin câte un spațiu, numerele respective în ordine crescătoare.
Fișierul de ieșire '''3cifreout.txt''' va conține, pentru cerința 1, pe prima linie patru valori naturale '''nrmin nrapmin x1min x1max''', separate prin câte un spațiu, reprezentând numărul minim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată, iar pe linia a doua alte patru valori naturale '''nrmax nrapmax x2min x2max''', separate prin câte un spațiu, reprezentând numărul maxim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată. Pentru cerința 2, fișierul de ieșire va conține pe prima linie numărul maxim de apariții a numerelor din trei cifre consecutive care apar, iar pe linia a doua, separate prin câte un spațiu, numerele respective în ordine crescătoare.


== Restrictii si precizari ==
== Restrictii si precizari ==


*1 n 500000
*1 ⩽ n ⩽ 500000
*100 x[i] 4294967295
*100 ⩽ x[i] ⩽ 4294967295


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;7 1
;415 5213 2017 666 12345678 10000013 13
;Iesire
;Datele introduse corespund restrictiilor impuse.
;100 1 10000013 10000013
;678 1 12345678 12345678


== Exemplul 2 ==
;3cifrein.txt
;Intrare
:7 1
;7 1
:415 5213 2017 666 12345678 10000013 13
;25 521013 206678 666 12345678 10101013 13
;Iesire
;Datele introduse nu corespund restrictiilor impuse.


:Datele introduse corespund restrictiilor impuse.
;3cifreout.txt
:100 1 10000013 10000013
:678 1 12345678 12345678


== Rezolvare ==
== Exemplul 2 ==


<syntaxhighlight lang="python3" line="1">
;3cifreint.txt
def cautare_trei_cifre_consecutive(x):
:7 1
    numere_trei_cifre = set()
:25 521013 206678 666 12345678 10101013 13


    for numar in x:
:Datele introduse nu corespund restrictiilor impuse.
        str_numar = str(numar)
        for i in range(len(str_numar) - 2):
            numere_trei_cifre.add(int(str_numar[i:i+3]))


    return numere_trei_cifre


== Rezolvare ==


def cerinta1(x):
<syntaxhighlight lang="python3" line="1">
    numere_trei_cifre = cautare_trei_cifre_consecutive(x)


     if not numere_trei_cifre:
def verifica_restrictii(n, x):
         return 0, 0, 0, 0, 0, 0, 0, 0
     if not (1 <= n <= 500000):
         return False


     nr_min = min(numere_trei_cifre)
     for numar in x:
    nr_max = max(numere_trei_cifre)
        if not (100 <= numar <= 4294967295):
            return False


     nrap_min = x.count(nr_min)
     return True
    nrap_max = x.count(nr_max)


    x1min = x.index(nr_min) + 1
    x1max = len(x) - x[::-1].index(nr_min)


     x2min = x.index(nr_max) + 1
def trei_cifre_consecutive(n, x, cerinta):
     x2max = len(x) - x[::-1].index(nr_max)
     aparitii = {}
     min_nr, max_nr = float('inf'), 0


     return nr_min, nrap_min, x1min, x1max, nr_max, nrap_max, x2min, x2max
     for i in range(n):
        numar_str = str(x[i])
        for j in range(len(numar_str) - 2):
            cifre_consecutive = int(numar_str[j:j+3])


            if cifre_consecutive not in aparitii:
                aparitii[cifre_consecutive] = [1, i + 1, i + 1]
            else:
                aparitii[cifre_consecutive][0] += 1
                aparitii[cifre_consecutive][2] = i + 1


def cerinta2(x):
            min_nr = min(min_nr, cifre_consecutive)
    numere_trei_cifre = cautare_trei_cifre_consecutive(x)
            max_nr = max(max_nr, cifre_consecutive)


     if not numere_trei_cifre:
     if cerinta == 1:
         return 0, []
         nr_ap_min, nrap_min, x1min, x1max = min_nr, aparitii[min_nr][0], aparitii[min_nr][1], aparitii[min_nr][2]
        nr_ap_max, nrap_max, x2min, x2max = max_nr, aparitii[max_nr][0], aparitii[max_nr][1], aparitii[max_nr][2]
        return nr_ap_min, nrap_min, x1min, x1max, nr_ap_max, nrap_max, x2min, x2max


     max_aparitii = max(x.count(nr) for nr in numere_trei_cifre)
     elif cerinta == 2:
    numere_max_aparitii = [nr for nr in numere_trei_cifre if x.count(nr) == max_aparitii]
        max_aparitii = max(aparitii.values(), key=lambda x: x[0])[0]
        numere_max_aparitii = [numar for numar, info in aparitii.items() if info[0] == max_aparitii]
        numere_max_aparitii.sort()
        return max_aparitii, numere_max_aparitii


    return max_aparitii, sorted(numere_max_aparitii)


if __name__ == "__main__":
    with open("3cifrein.txt", "r") as file:
        n, cerinta = map(int, file.readline().split())
        x = list(map(int, file.readline().split()))


def main():
     if verifica_restrictii(n, x):
     # Citirea datelor de intrare din fișier
         rezultat = trei_cifre_consecutive(n, x, cerinta)
    with open("3cifre.txt", "r") as f:
         n, cerinta = map(int, f.readline().split())
        x = list(map(int, f.readline().split()))


    # Calcularea rezultatelor în funcție de cerința specificată
        with open("3cifreout.txt", "w") as file_out:
    if cerinta == 1:
            if cerinta == 1:
        rezultate = cerinta1(x)
                file_out.write(f"{rezultat[0]} {rezultat[1]} {rezultat[2]} {rezultat[3]}\n")
                file_out.write(f"{rezultat[4]} {rezultat[5]} {rezultat[6]} {rezultat[7]}\n")
            elif cerinta == 2:
                file_out.write(f"{rezultat[0]}\n")
                file_out.write(" ".join(map(str, rezultat[1])) + "\n")
     else:
     else:
         rezultate = cerinta2(x)
         print("Datele de intrare nu respectă restricțiile specificate.")


    # Scrierea rezultatelor în fișierul de ieșire
    with open("3cifre.txt", "w") as g:
        for valoare in rezultate:
            g.write(f"{valoare} ")
if __name__ == "__main__":
    main()
</syntaxhighlight>
</syntaxhighlight>



Latest revision as of 15:29, 2 January 2024

Enunt[edit]

Așa cum știm, lui Gigel îi place să se joace cu numerele. A scris pe caiet un număr, apoi a văzut că din acesta se pot extrage mai multe numere cu trei cifre consecutive. De exemplu, a scris pe caiet 20172017; numerele cu trei cifre consecutive care se pot extrage sunt 201, 172, 720 și 201. Gigel începe să-și pună diferite întrebări: care este cel mai mare număr cu trei cifre consecutive obținut? Dar cel mai mic? De câte ori apar ele? Unde apar? Care este cel mai mare număr de apariții a unui număr cu trei cifre?

Cerinta[edit]

Fiind numărul un număr natural n și n numere naturale x (100 ≤ x ≤ 4294967295) să se determine: 1. Cel mai mic și cel mai mare număr din trei cifre consecutive care apar în cele n numere, de câte ori apar ele, în ce număr x[1] apar prima dată și în ce număr x[2] apar ultima dată. 2. Numerele din trei cifre consecutive care apar de cele mai multe ori în cele n numere.

Date de intrare[edit]

Fișierul de intrare 3cifrein.txt conţine pe prima linie, separate printr-un spațiu, numărul natural n, reprezentând numărul de numere și cerința (1 sau 2). Pe cea de a doua linie sunt scrise cele n numere naturale x[1] x[2] ... x[n], separate prin câte un spațiu.

Date de iesire[edit]

Fișierul de ieșire 3cifreout.txt va conține, pentru cerința 1, pe prima linie patru valori naturale nrmin nrapmin x1min x1max, separate prin câte un spațiu, reprezentând numărul minim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată, iar pe linia a doua alte patru valori naturale nrmax nrapmax x2min x2max, separate prin câte un spațiu, reprezentând numărul maxim de trei cifre care apare, numărul de apariții a acestuia, numărul în care apare prima dată, respectiv numărul în care apare ultima dată. Pentru cerința 2, fișierul de ieșire va conține pe prima linie numărul maxim de apariții a numerelor din trei cifre consecutive care apar, iar pe linia a doua, separate prin câte un spațiu, numerele respective în ordine crescătoare.

Restrictii si precizari[edit]

  • 1 ⩽ n ⩽ 500000
  • 100 ⩽ x[i] ⩽ 4294967295

Exemplul 1[edit]

3cifrein.txt
7 1
415 5213 2017 666 12345678 10000013 13
Datele introduse corespund restrictiilor impuse.
3cifreout.txt
100 1 10000013 10000013
678 1 12345678 12345678

Exemplul 2[edit]

3cifreint.txt
7 1
25 521013 206678 666 12345678 10101013 13
Datele introduse nu corespund restrictiilor impuse.


Rezolvare[edit]

<syntaxhighlight lang="python3" line="1">

def verifica_restrictii(n, x):

   if not (1 <= n <= 500000):
       return False
   for numar in x:
       if not (100 <= numar <= 4294967295):
           return False
   return True


def trei_cifre_consecutive(n, x, cerinta):

   aparitii = {}
   min_nr, max_nr = float('inf'), 0
   for i in range(n):
       numar_str = str(x[i])
       for j in range(len(numar_str) - 2):
           cifre_consecutive = int(numar_str[j:j+3])
           if cifre_consecutive not in aparitii:
               aparitii[cifre_consecutive] = [1, i + 1, i + 1]
           else:
               aparitii[cifre_consecutive][0] += 1
               aparitii[cifre_consecutive][2] = i + 1
           min_nr = min(min_nr, cifre_consecutive)
           max_nr = max(max_nr, cifre_consecutive)
   if cerinta == 1:
       nr_ap_min, nrap_min, x1min, x1max = min_nr, aparitii[min_nr][0], aparitii[min_nr][1], aparitii[min_nr][2]
       nr_ap_max, nrap_max, x2min, x2max = max_nr, aparitii[max_nr][0], aparitii[max_nr][1], aparitii[max_nr][2]
       return nr_ap_min, nrap_min, x1min, x1max, nr_ap_max, nrap_max, x2min, x2max
   elif cerinta == 2:
       max_aparitii = max(aparitii.values(), key=lambda x: x[0])[0]
       numere_max_aparitii = [numar for numar, info in aparitii.items() if info[0] == max_aparitii]
       numere_max_aparitii.sort()
       return max_aparitii, numere_max_aparitii


if __name__ == "__main__":

   with open("3cifrein.txt", "r") as file:
       n, cerinta = map(int, file.readline().split())
       x = list(map(int, file.readline().split()))
   if verifica_restrictii(n, x):
       rezultat = trei_cifre_consecutive(n, x, cerinta)
       with open("3cifreout.txt", "w") as file_out:
           if cerinta == 1:
               file_out.write(f"{rezultat[0]} {rezultat[1]} {rezultat[2]} {rezultat[3]}\n")
               file_out.write(f"{rezultat[4]} {rezultat[5]} {rezultat[6]} {rezultat[7]}\n")
           elif cerinta == 2:
               file_out.write(f"{rezultat[0]}\n")
               file_out.write(" ".join(map(str, rezultat[1])) + "\n")
   else:
       print("Datele de intrare nu respectă restricțiile specificate.")

</syntaxhighlight>

Explicatie[edit]

Se observă că atât 111 cât și 113 apar de câte 3 ori.