2560 - Bits: Difference between revisions

From Bitnami MediaWiki
Line 10: Line 10:


==Date de intrare==
==Date de intrare==
 
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse."
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.
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. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."


==Date de ieșire==
==Date de ieșire==

Revision as of 17:51, 7 May 2023

Enunț

Se dă un număr natural N.

Cerință

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



Date de intrare

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele de intrare corespund restricțiilor impuse." 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. În caz contrar, se va afișa pe ecran: "Datele de intrare nu corespund restricțiilor impuse."

Date de ieșire

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.


Restricții și precizări

  • 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

bits.in
12 4
2 0 3 20


bits.out
1010

Explicatie

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

Rezolvare ver. 1

<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>


Explicatie

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.