1820 - Binar: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinta == Ionel a învăţat recent la Informatică reprezentarea numerelor în baza 2. Pentru a-și aprofunda cunoştinţele, profesorul său a inventat următoarea problemă: Dintr-un fişier text se citeşte un şir de N valori de 1, 0 şi -1. Valoarea -1 are semnificaţia de terminare a unui număr, iar valorile de 0 şi 1 reprezintă cifrele în baza 2 a câte unui număr natural. Să se determine primele NR valori codificate, cu numerele de apariţii cât mai mari....
 
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Cerinta ==
== Cerinta ==


Ionel a învăţat recent la Informatică reprezentarea numerelor în baza 2. Pentru a-și aprofunda cunoştinţele, profesorul său a inventat următoarea problemă: Dintr-un fişier text se citeşte un şir de N valori de 1, 0 şi -1. Valoarea -1 are semnificaţia de terminare a unui număr, iar valorile de 0 şi 1 reprezintă cifrele în baza 2 a câte unui număr natural. Să se determine primele NR valori codificate, cu numerele de apariţii cât mai mari.
Ionel a învăţat recent la Informatică reprezentarea numerelor în baza 2. Pentru a-și aprofunda cunoştinţele, profesorul său a inventat următoarea problemă: Dintr-un fişier text se citeşte un şir de '''N''' valori de '''1, 0''' şi '''-1'''. Valoarea -1 are semnificaţia de terminare a unui număr, iar valorile de 0 şi 1 reprezintă cifrele în baza 2 a câte unui număr natural. Să se determine primele '''NR''' valori codificate, cu numerele de apariţii cât mai mari.


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


Fişierul binar.txt cu următoarea structura:
Fişierul '''binarin.txt''' cu următoarea structura:
*pe prima linie numerele N şi NR cu semnificaţia din enunţ.
*pe prima linie numerele '''N''' şi '''NR''' cu semnificaţia din enunţ.
*pe a doua linie N valori de 1, 0 sau -1.
*pe a doua linie '''N''' valori de 1, 0 sau -1.


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


Fişierul binar.txt va conţine perechi distincte de numere X, AP cu semnificaţia X – valoarea codificata în baza 10, AP – numărul de apariţii ale valorii X, pe fiecare linie câte o pereche despărţită printr-un spaţiu. Perechile vor fi afişate în ordinea descrescătoare a valorii AP, iar la valori egale, în ordinea descrescătoare a valorii lui X.
Fişierul '''binarout.txt''' va conţine perechi distincte de numere '''X''', '''AP''' cu semnificaţia '''X''' – valoarea codificata în baza 10, '''AP '''– numărul de apariţii ale valorii '''X''', pe fiecare linie câte o pereche despărţită printr-un spaţiu. Perechile vor fi afişate în ordinea descrescătoare a valorii '''AP''', iar la valori egale, în ordinea descrescătoare a valorii lui '''X'''.


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


*10 N 100.000.
*10 ⩽ N ⩽ 100.000.
*1 NR 3.
*1 ⩽ NR ⩽ 3.
*Înaintea fiecărei valori de -1 se găseşte cel putin o valoare de 0 sau 1.
*Înaintea fiecărei valori de -1 se găseşte cel putin o valoare de 0 sau 1.
*Numerele codificate astfel sunt mai mici decat 10000 în baza 10.
*Numerele codificate astfel sunt mai mici decat 10000 în baza 10.
Line 24: Line 24:


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;binarin.txt
:19 3
:19 3
:1 0 -1 1 -1 1 0 -1 1 1 -1 1 0 1 -1 1 0 1 -1
:1 0 -1 1 -1 1 0 -1 1 1 -1 1 0 1 -1 1 0 1 -1
;Iesire
;binarout.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:5 2
:5 2
:2 2
:2 2
Line 34: Line 34:


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;binarin.txt
:10 5
:10 5
:-1 1 1 0 0 8 3 -10 0 8
:-1 1 1 0 0 8 3 -10 0 8
;Iesire
;binarout.txt
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def decodeaza_binar(binar):
def binar_to_decimal(binar):
     numar = 0
     # Convertirea unui număr binar în decimal
     putere = 0
     decimal = 0
     for cifra in reversed(binar):
     for bit in binar:
         numar += int(cifra) * (2 ** putere)
         decimal = decimal * 2 + int(bit)
        putere += 1
     return decimal
     return numar


def main():
    # Citirea datelor de intrare
    with open("binar.txt", "r") as file:
        N, NR = map(int, file.readline().split())
        valori = list(map(int, file.readline().split()))


     # Decodificarea și numărarea aparițiilor
def verifica_rezultat(input_file, output_file):
    frecventa = {}
     # Citire date de intrare
    index = 0
     with open(input_file, "r") as f:
     while index < N:
         N, NR = map(int, f.readline().split())
         if valori[index] == -1:
        sir_binar = list(map(int, f.readline().split()))
            index += 1
            continue


        cod_binar = []
    # Initializare dicționar pentru frecvențe
        while index < N and valori[index] in {0, 1}:
    frecvente = {}
            cod_binar.append(str(valori[index]))
            index += 1


         numar_decodificat = decodeaza_binar(cod_binar)
    # Parcurgere șir binar
         frecventa[numar_decodificat] = frecventa.get(numar_decodificat, 0) + 1
    i = 0
    while i < N:
         numar_binar = []
         while i < N and sir_binar[i] != -1:
            numar_binar.append(str(sir_binar[i]))
            i += 1


     # Sortarea și scrierea în fișierul de ieșire
        numar_decimal = binar_to_decimal(numar_binar)
     with open("binar.txt", "w") as file_out:
        if numar_decimal in frecvente:
         for x, ap in sorted(frecventa.items(), key=lambda item: (-item[1], -item[0])):
            frecvente[numar_decimal] += 1
            file_out.write(f"{x} {ap}\n")
        else:
            frecvente[numar_decimal] = 1
 
        i += 1
 
     # Sortare și scriere rezultat în fișierul de ieșire
     rezultate_sortate = sorted(frecvente.items(), key=lambda x: (-x[1], -x[0]))
 
    # Citire rezultat așteptat
    with open(output_file, "r") as g:
        rezultat_asteptat = [tuple(map(int, linie.split())) for linie in g.readlines()]
 
    # Verificare rezultat
    if rezultate_sortate[:NR] == rezultat_asteptat:
        print("Rezultat corect!")
    else:
        print("Rezultat incorect!")
        print("Rezultat așteptat:")
        print(rezultat_asteptat)
        print("Rezultat obținut:")
        print(rezultate_sortate[:NR])
 
 
# Citire date de intrare
with open("binarin.txt", "r") as f:
    N, NR = map(int, f.readline().split())
    sir_binar = list(map(int, f.readline().split()))
 
# Initializare dicționar pentru frecvențe
frecvente = {}
 
# Parcurgere șir binar
i = 0
while i < N:
    numar_binar = []
    while i < N and sir_binar[i] != -1:
        numar_binar.append(str(sir_binar[i]))
         i += 1
 
    numar_decimal = binar_to_decimal(numar_binar)
    if numar_decimal in frecvente:
        frecvente[numar_decimal] += 1
    else:
        frecvente[numar_decimal] = 1
 
    i += 1
 
# Sortare și scriere rezultat în fișierul de ieșire
rezultate_sortate = sorted(frecvente.items(), key=lambda x: (-x[1], -x[0]))
 
with open("binarout.txt", "w") as g:
    for valoare, aparitii in rezultate_sortate[:NR]:
        g.write(f"{valoare} {aparitii}\n")
 
# Apelare funcție de verificare
verifica_rezultat("binarin.txt", "binarout.txt")


if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:08, 29 December 2023

Cerinta[edit]

Ionel a învăţat recent la Informatică reprezentarea numerelor în baza 2. Pentru a-și aprofunda cunoştinţele, profesorul său a inventat următoarea problemă: Dintr-un fişier text se citeşte un şir de N valori de 1, 0 şi -1. Valoarea -1 are semnificaţia de terminare a unui număr, iar valorile de 0 şi 1 reprezintă cifrele în baza 2 a câte unui număr natural. Să se determine primele NR valori codificate, cu numerele de apariţii cât mai mari.

Date de intrare[edit]

Fişierul binarin.txt cu următoarea structura:

  • pe prima linie numerele N şi NR cu semnificaţia din enunţ.
  • pe a doua linie N valori de 1, 0 sau -1.

Date de iesire[edit]

Fişierul binarout.txt va conţine perechi distincte de numere X, AP cu semnificaţia X – valoarea codificata în baza 10, AP – numărul de apariţii ale valorii X, pe fiecare linie câte o pereche despărţită printr-un spaţiu. Perechile vor fi afişate în ordinea descrescătoare a valorii AP, iar la valori egale, în ordinea descrescătoare a valorii lui X.

Restrictii si precizari[edit]

  • 10 ⩽ N ⩽ 100.000.
  • 1 ⩽ NR ⩽ 3.
  • Înaintea fiecărei valori de -1 se găseşte cel putin o valoare de 0 sau 1.
  • Numerele codificate astfel sunt mai mici decat 10000 în baza 10.
  • Se poate ca la stânga unui număr codificat să fie doar valori de 0.
  • În şir sunt codificate cel puţin 3 valori distincte.
  • Şirul de valori se incheie cu o valoare de -1.

Exemplul 1[edit]

binarin.txt
19 3
1 0 -1 1 -1 1 0 -1 1 1 -1 1 0 1 -1 1 0 1 -1
binarout.txt
Datele introduse corespund restrictiilor impuse
5 2
2 2
3 1

Exemplul 2[edit]

binarin.txt
10 5
-1 1 1 0 0 8 3 -10 0 8
binarout.txt
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit]

<syntaxhighlight lang="python3" line="1"> def binar_to_decimal(binar):

   # Convertirea unui număr binar în decimal
   decimal = 0
   for bit in binar:
       decimal = decimal * 2 + int(bit)
   return decimal


def verifica_rezultat(input_file, output_file):

   # Citire date de intrare
   with open(input_file, "r") as f:
       N, NR = map(int, f.readline().split())
       sir_binar = list(map(int, f.readline().split()))
   # Initializare dicționar pentru frecvențe
   frecvente = {}
   # Parcurgere șir binar
   i = 0
   while i < N:
       numar_binar = []
       while i < N and sir_binar[i] != -1:
           numar_binar.append(str(sir_binar[i]))
           i += 1
       numar_decimal = binar_to_decimal(numar_binar)
       if numar_decimal in frecvente:
           frecvente[numar_decimal] += 1
       else:
           frecvente[numar_decimal] = 1
       i += 1
   # Sortare și scriere rezultat în fișierul de ieșire
   rezultate_sortate = sorted(frecvente.items(), key=lambda x: (-x[1], -x[0]))
   # Citire rezultat așteptat
   with open(output_file, "r") as g:
       rezultat_asteptat = [tuple(map(int, linie.split())) for linie in g.readlines()]
   # Verificare rezultat
   if rezultate_sortate[:NR] == rezultat_asteptat:
       print("Rezultat corect!")
   else:
       print("Rezultat incorect!")
       print("Rezultat așteptat:")
       print(rezultat_asteptat)
       print("Rezultat obținut:")
       print(rezultate_sortate[:NR])


  1. Citire date de intrare

with open("binarin.txt", "r") as f:

   N, NR = map(int, f.readline().split())
   sir_binar = list(map(int, f.readline().split()))
  1. Initializare dicționar pentru frecvențe

frecvente = {}

  1. Parcurgere șir binar

i = 0 while i < N:

   numar_binar = []
   while i < N and sir_binar[i] != -1:
       numar_binar.append(str(sir_binar[i]))
       i += 1
   numar_decimal = binar_to_decimal(numar_binar)
   if numar_decimal in frecvente:
       frecvente[numar_decimal] += 1
   else:
       frecvente[numar_decimal] = 1
   i += 1
  1. Sortare și scriere rezultat în fișierul de ieșire

rezultate_sortate = sorted(frecvente.items(), key=lambda x: (-x[1], -x[0]))

with open("binarout.txt", "w") as g:

   for valoare, aparitii in rezultate_sortate[:NR]:
       g.write(f"{valoare} {aparitii}\n")
  1. Apelare funcție de verificare

verifica_rezultat("binarin.txt", "binarout.txt")


</syntaxhighlight>

Explicatie[edit]

Numerele codificate sunt: 1 apare odată, 2 apare de 2 ori, 3 apare odată şi 5 apare de 2 ori. Sunt afişate primele 3 în ordinea descrescătoare a numărului de apariţii. Numerele 2 şi 5 care au acelaşi număr de apariţii se afișează în ordinea descrescătoare a valorii lor.