2560 - Bits: Difference between revisions

From Bitnami MediaWiki
 
Line 34: Line 34:


;Ieșire
;Ieșire
:Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse."
:Datele de intrare corespund restricțiilor impuse.


==Explicație==
==Explicație==

Latest revision as of 17:53, 7 May 2023

Enunț[edit | edit source]

Se dă un număr natural N.

Cerință[edit | edit source]

Determinați valoarea unor anumiți biți din reprezentarea sa în baza 2.



Date de intrare[edit | edit source]

Fișierul de intrare bits.in conține pe prima linie două numere naturale N și Q separate prin spațiu. Pe linia a doua se află Q numere naturale separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." Fișierul de ieșire bits.out conține pe prima linie Q valori, neseparate prin spațiu, reprezentând, în ordine, răspunsurile la întrebări. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

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

  • 0 ≤ N ≤ 2^63-1
  • 1 ≤ Q ≤ 63
  • valorile de pe a doua linie a fișierului de intrare sunt distincte și cuprinse între 0 și 62 (inclusiv)
  • biții se numerotează începând cu poziția 0 (cel mai puțin semnificativ)
  • numărul N este reprezentat pe 64 de biți

Exemplul 1[edit | edit source]

bits.in
12 4
2 0 3 20
bits.out
1010
Ieșire
Datele de intrare corespund restricțiilor impuse.

Explicație[edit | edit source]

Reprezentarea internă a valorii 12 este 000...0001100. Biții de pe pozițiile 0 și 20 au valoarea 0 iar cei de pe pozițiile 2 și 3 au valoarea 1.

Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line="1" start="1">

def validate_input(n, q, queries):

   """
   Verifică dacă datele de intrare respectă condițiile problemei.
   """
   if not 0 <= n <= 2**63 - 1:
       return False
   if not 1 <= q <= 63:
       return False
   if len(queries) != q:
       return False
   if any(query < 0 or query > 62 for query in queries):
       return False
   return True

def get_bits(n, queries):

   """
   Returnează valorile biților specificați din reprezentarea în baza 2 a lui n.
   """
   binary_n = bin(n)[2:].zfill(64)
   results = []
   for query in queries:
       bit_value = binary_n[-query-1]
       results.append(bit_value)
   return .join(results)

if __name__ == '__main__':

   with open('bits.in', 'r') as f_in, open('bits.out', 'w') as f_out:
       n, q = map(int, f_in.readline().split())
       queries = list(map(int, f_in.readline().split()))
       if not validate_input(n, q, queries):
           f_out.write('Invalid input')
       else:
           result = get_bits(n, queries)
           f_out.write(result)


</syntaxhighlight>


Explicație[edit | edit source]

Funcția validate_input verifică dacă datele de intrare respectă restricțiile problemei. Dacă nu sunt respectate, se returnează False. Altfel, se returnează True.

Funcția get_bits primește numărul n și lista de întrebări queries. Transformă n în reprezentarea sa în baza 2 sub formă de șir de caractere și extrage biții specificați din listă. Rezultatul este returnat sub formă de șir de caractere.

Blocul main începe prin deschiderea fișierelor de intrare și de ieșire. Pe prima linie din fișierul de intrare se citesc valorile n și q, iar pe a doua linie se citesc întrebările. Se validează datele de intrare prin apelul funcției validate_input. Dacă datele nu sunt valide, se afișează în fișierul de ieșire mesajul "Invalid input". Altfel, se apelează funcția get_bits și se scrie rezultatul în fișierul de ieșire.