0164 - Half Sort 2

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă un vector cu n elemente numere întregi, n fiind număr par. Să se ordoneze crescător elementele situate pe poziții pare în vector și descrescător elementele situate pe poziții impare.

Date de intrare[edit | edit source]

Fişierul de intrare halfsort2in.txt conţine pe prima linie numărul n si pe a doua linie n numere întregi separate prin spaţii.

Date de ieşire[edit | edit source]

Fişierul de ieşire halfsort2out.txt va conţine pe prima linie cele n elemente ale vectorului, ordonate conform cerinței, separate printr-un spațiu.

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

  • 0 < n ≤ 100
  • valoarea absolută a numerelor de pe a doua linie a fişierului de intrare va fi mai mică decât 2^30
  • indicii elementelor vectorului sunt 1,2,...,n

Exemplul 1[edit | edit source]

halfsort2.in
6
8 9 9 4 5 7
halfsort2.out
Datele introduse corespund restricțiilor impuse.
9 4 8 7 5 9

Exemplul 2[edit | edit source]

halfsort2in.txt
5
1 2 3 4 2**30
halfsort2out.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0164 - Half Sort 2

def validare(numar_elemente, vector_intrare): # functia de validare a datelor de intrare

   if numar_elemente > 100 or numar_elemente < 0:
       raise ValueError
   for numar in vector_intrare:
       if abs(numar) >= 2 ** 30:  # fiecare numar trebuie sa fie mai mic decat 2^30
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def sorteaza_elemente(numar_elemente, vector_intrare): # functia de rezolvare

   # Creăm două liste, una pentru elementele de pe poziții pare și una pentru cele de pe poziții impare
   pare = sorted(vector_intrare[i] for i in range(numar_elemente) if i % 2 != 0)
   impar = sorted((vector_intrare[i] for i in range(numar_elemente) if i % 2 == 0), reverse=True)
   # Parcurgem vectorul și înlocuim fiecare element cu primul element din lista corespunzătoare
   for i in range(numar_elemente):
       if i % 2 == 0:
           vector_intrare[i] = impar.pop(0)
       else:
           vector_intrare[i] = pare.pop(0)
   # Întoarcem vectorul modificat
   return vector_intrare


if __name__ == '__main__':

   file_in = open("halfsort2in.txt", "r")  # declararea fisierelor
   file_out = open("halfsort2out.txt", "w")  # fisierul out trebuie declarat cu optiunea "w" (write)
   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       n = int(file_in.readline())  # citirea numarului de elemente
       vector = list(map(int, file_in.readline().split()))  # citirea vectorului
       validare(n, vector)  # apelul functiei de validare
       vector = sorteaza_elemente(n, vector)  # apelul functiei de rezolvare
       file_out.write(' '.join(map(str, vector)) + '\n')
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>