0164 - Half Sort 2: Difference between revisions
Pagină nouă: == Cerinţa == 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 == Fişierul de intrare '''halfsort2.in''' conţine pe prima linie numărul '''n''' si pe a doua linie '''n''' numere întregi separate prin spaţii. == Date de ieşire == Fişierul de ieşire '''halfsort2.out''' va conţine pe prima linie cele '''n''' elemente ale vectorului, ordonate conform cerinței, separate... |
|||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
== Cerinţa == | == Cerinţa == | ||
Să se ordoneze crescător elementele situate pe poziții pare în vector și descrescător elementele situate pe poziții impare. | |||
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 == | == Date de intrare == | ||
Fişierul de intrare ''' | 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 == | == Date de ieşire == | ||
Fişierul de ieşire ''' | 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 == | == Restricții și precizări == | ||
* '''0 < n ≤ 100''' | * '''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''' | * 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''' | * indicii elementelor vectorului sunt '''1,2,...,n''' | ||
== | == Exemplul 1 == | ||
; halfsort2.in | ; halfsort2.in | ||
: 6 | : 6 | ||
: 8 9 9 4 5 7 | : 8 9 9 4 5 7 | ||
; halfsort2.out | ; halfsort2.out | ||
: Datele introduse corespund restricțiilor impuse. | |||
: 9 4 8 7 5 9 | : 9 4 8 7 5 9 | ||
== Exemplul 2 == | |||
; halfsort2in.txt | |||
: 5 | |||
: 1 2 3 4 2**30 | |||
; halfsort2out.txt | |||
: Datele introduse nu corespund restricțiilor impuse. | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def sorteaza_elemente( | # 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 | # Creăm două liste, una pentru elementele de pe poziții pare și una pentru cele de pe poziții impare | ||
pare = sorted( | pare = sorted(vector_intrare[i] for i in range(numar_elemente) if i % 2 != 0) | ||
impar = sorted(( | 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 | # Parcurgem vectorul și înlocuim fiecare element cu primul element din lista corespunzătoare | ||
for i in range( | for i in range(numar_elemente): | ||
if i % 2 == 0: | if i % 2 == 0: | ||
vector_intrare[i] = impar.pop(0) | |||
else: | else: | ||
vector_intrare[i] = pare.pop(0) | |||
# Întoarcem vectorul modificat | # Întoarcem vectorul modificat | ||
return vector | 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> | </syntaxhighlight> |
Latest revision as of 14:27, 9 December 2023
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>
- 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>