3871 - Xor Pyramid

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Considerăm o piramida xor unde fiecare valoare este egală cu xorul valorilor din stânga jos și dreapta jos. Dându-se cel mai de jos nivel, care este valoarea din vârf?

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul numar_valori, iar apoi numar_valori numere naturale. numar_valori este mărimea bazei piramidei iar numerele naturale sunt valorile de la bază în ordinea în care sunt date.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul rezultat_xor_piramida, reprezentând valoarea din vârful piramidei. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse." iar daca se indeplinesc se afiseaza "Datele de intrare nu corespund restricțiilor impuse."

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ numar_valori ⩽ 200000
  • cele numar_valori numere citite vor fi mai mici sau egale cu 1.000.000.000.

Exemplul 1[edit | edit source]

Intrare
8
2 10 5 12 9 5 1 5
Ieșire
Datele de intrare corespund restricțiilor impuse.
9


Exemplul 2[edit | edit source]

Intrare
5
2 10 5 12 1000000001
Ieșire
Datele de intrare nu corespund restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def calcul_xor_piramida(baza_piramida):

   valori_intermediare = baza_piramida.copy()
   while len(valori_intermediare) > 1:
       valori_noi = []
       for i in range(len(valori_intermediare) - 1):
           valori_noi.append(valori_intermediare[i] ^ valori_intermediare[i + 1])
       valori_intermediare = valori_noi
   return valori_intermediare[0]

if __name__ == "__main__":

   try:
       numar_valori = int(input())
       if not (1 <= numar_valori <= 200000):
           print("Datele de intrare nu corespund restricțiilor impuse.")
           exit()
       valori_baza_piramida = list(map(int, input().split()))
       if len(valori_baza_piramida) != numar_valori or any(val > 1000000000 for val in valori_baza_piramida):
           print("Datele de intrare nu corespund restricțiilor impuse.")
           exit()
       rezultat_xor_piramida = calcul_xor_piramida(valori_baza_piramida)
       print("Datele de intrare corespund restricțiilor impuse.")
       print(rezultat_xor_piramida)
   except ValueError:
       print("Datele de intrare nu corespund restricțiilor impuse.")

</syntaxhighlight>

Explicatie[edit | edit source]

Problema implică calcularea valorii din vârful unei piramide XOR, având ca bază un șir de numere. Operația XOR este aplicată iterativ pe liniile piramidei, astfel încât valoarea din vârf să fie rezultatul final. Soluția propusă constă într-o funcție (calcul_xor_piramida) care primește lista de valori de la baza piramidei și aplică operația XOR iterativ până când rămâne doar o singură valoare, care reprezintă valoarea din vârf. Programul citește mărimea bazei piramidei și valorile de la bază, efectuând verificări pentru a se asigura că datele de intrare respectă cerințele. Dacă există discrepanțe, se afișează un mesaj corespunzător.