0533 - Aliniere: Difference between revisions
Pagină nouă: == Cerinţa == La ora de educație fizică participă n elevi, numerotați de la '''1''' la '''n''', băieți și fete, pentru fiecare dintre ei cunoscându-se înălțimea, exprimată în centimetri. Profesorul le cere să se alinieze, mai întâi băieții, în ordine descrescătoare a înălțimii, apoi fetele, de asemenea în ordine descrescătoare. Afișați numerele de ordine ale elevilor în ordinea dorită de profesor. Dacă doi băieți (sau fete) au aceeași înăl... |
|||
Line 23: | Line 23: | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def | |||
def validare(numar, elev): # functia de validare a datelor de intrare | |||
def elevi_ordonati( | if len(elev) != numar: | ||
raise ValueError | |||
if numar > 100: | |||
raise ValueError | |||
for gender, height in elev: | |||
if gender not in ['B', 'F'] or not isinstance(height, int) or height < 1 or height > 200: | |||
raise ValueError | |||
print("Datele de intrare corespund restrictiilor impuse") | |||
def elevi_ordonati(numar, elev): # functia de rezolvare | |||
# Separăm elevii în două liste: băieți și fete | # Separăm elevii în două liste: băieți și fete | ||
baieti = [] | baieti = [] | ||
fete = [] | fete = [] | ||
for | for nr in range(numar): | ||
sexul, height = elev[nr] | |||
if | if sexul == "B": | ||
baieti.append(( | baieti.append((nr + 1, height)) | ||
else: | else: | ||
fete.append(( | fete.append((nr + 1, height)) | ||
# Sortăm listele în ordine descrescătoare a înălțimii | # Sortăm listele în ordine descrescătoare a înălțimii | ||
Line 43: | Line 56: | ||
# Concatenăm listele băieților și fetelor | # Concatenăm listele băieților și fetelor | ||
eleviordonati = baieti + fete | |||
return [elev[0] for elev in eleviordonati] | |||
if __name__ == '__main__': | |||
# din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam | |||
try: | |||
n = int(input("Introduceți numărul n: ")) | |||
elevi = [] | |||
for i in range(n): | |||
sex, inaltime = input().split() | |||
elevi.append((sex, int(inaltime))) | |||
validare(n, elevi) # apelul functiei de validare | |||
result = elevi_ordonati(n, elevi) # apelul functiei de rezolvare | |||
print(" ".join(map(str, result))) | |||
except ValueError: | |||
print("Datele de intrare nu corespund restrictiilor impuse") | |||
except IndexError: | |||
print("Datele de intrare nu corespund restrictiilor impuse") | |||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 07:37, 12 November 2023
Cerinţa
La ora de educație fizică participă n elevi, numerotați de la 1 la n, băieți și fete, pentru fiecare dintre ei cunoscându-se înălțimea, exprimată în centimetri. Profesorul le cere să se alinieze, mai întâi băieții, în ordine descrescătoare a înălțimii, apoi fetele, de asemenea în ordine descrescătoare.
Afișați numerele de ordine ale elevilor în ordinea dorită de profesor. Dacă doi băieți (sau fete) au aceeași înălțime, se va afișa mai întâi elevul cu numărul de ordine mai mic.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n caracteristicile celor n elevi, astfel: o literă (B sau F), care definește sexul elevului, și înălțimea acestuia, un număr natural nenul.
Date de ieşire
Programul va afișa pe ecran numerele de ordine ale elevilor în ordinea dorită de profesor, separate prin exact un spațiu.
Restricții și precizări
- 1 ⩽ n ⩽ 100
- înălțimile elevilor vor fi mai mici decât 200
Exemplu
- Intrare
- 5
- B 176
- F 160
- F 165
- B 180
- B 179
- Ieșire
- 4 5 1 3 2
Rezolvare
<syntaxhighlight lang="python" line>
def validare(numar, elev): # functia de validare a datelor de intrare
if len(elev) != numar: raise ValueError
if numar > 100: raise ValueError
for gender, height in elev: if gender not in ['B', 'F'] or not isinstance(height, int) or height < 1 or height > 200: raise ValueError
print("Datele de intrare corespund restrictiilor impuse")
def elevi_ordonati(numar, elev): # functia de rezolvare
# Separăm elevii în două liste: băieți și fete baieti = [] fete = []
for nr in range(numar): sexul, height = elev[nr] if sexul == "B": baieti.append((nr + 1, height)) else: fete.append((nr + 1, height))
# Sortăm listele în ordine descrescătoare a înălțimii baieti.sort(key=lambda x: (-x[1], x[0])) fete.sort(key=lambda x: (-x[1], x[0]))
# Concatenăm listele băieților și fetelor eleviordonati = baieti + fete
return [elev[0] for elev in eleviordonati]
if __name__ == '__main__':
# din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam try: n = int(input("Introduceți numărul n: ")) elevi = []
for i in range(n): sex, inaltime = input().split() elevi.append((sex, int(inaltime)))
validare(n, elevi) # apelul functiei de validare result = elevi_ordonati(n, elevi) # apelul functiei de rezolvare print(" ".join(map(str, result)))
except ValueError: print("Datele de intrare nu corespund restrictiilor impuse") except IndexError: print("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>