Python — Partea 3: Exerciții simple și foarte simple

160 de exerciții pentru funcții, parametri și argumente, domeniul variabilelor, tupluri, mulțimi, dicționare, recursivitate și probleme de sinteză.

Structura paginii: fiecare capitol are 20 de exerciții. În prima parte apar toate enunțurile; în partea a doua apar rezolvările, iar înaintea fiecărei rezolvări este repetat enunțul complet.

1. Funcții

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def al_doilea_maxim(a): distincte = set(a) if len(distincte) < 2: raise ValueError("Nu există al doilea maxim distinct.") maxim = max(distincte) return max(x for x in distincte if x != maxim)
  2. 2. def suma_si_produs(a): suma_pare = 0 produs_impare = 1 exista_impar = False for x in a: if x % 2 == 0: suma_pare += x else: produs_impare *= x exista_impar = True return suma_pare, produs_impare if exista_impar else 0
  3. 3. def prefix_sufix(s): for lungime in range(len(s) - 1, 0, -1): if s[:lungime] == s[-lungime:]: return s[:lungime] return
  4. 4. def sume_dreapta(a): rezultat = [0] * len(a) suma = 0 for i in range(len(a) - 1, -1, -1): rezultat[i] = suma suma += a[i] return rezultat
  5. 5. def impartire_egala(a): total = sum(a) stanga = 0 for x in a[:-1]: stanga += x if stanga * 2 == total: return True return False
  6. 6. def diferenta_ordonata(a, b): b = set(b) return [x for x in a if x not in b]
  7. 7. def comprimare(a): if not a: return [] rezultat = [] curent = a[0] nr = 1 for x in a[1:]: if x == curent: nr += 1 else: rezultat.append((curent, nr)) curent, nr = x, 1 rezultat.append((curent, nr)) return rezultat
  8. 8. def crescatoare_maxima(a): if not a: return [] best = curent = [a[0]] for x in a[1:]: if x > curent[-1]: curent.append(x) else: curent = [x] if len(curent) > len(best): best = curent[:] return best
  9. 9. def nr_divizori(n): nr = 0 for d in range(1, int(n ** 0.5) + 1): if n % d == 0: nr += 2 if d * d != n else 1 return nr
  10. 10. def lungime_suma_zero(a): prima = {0: -1} suma = best = 0 for i, x in enumerate(a): suma += x if suma in prima: best = max(best, i - prima[suma]) else: prima[suma] = i return best
  11. 11. def interschimba(a, b): return b, a # Exemplu: x, y = interschimba(x, y)
  12. 12. def invers(n): semn = -1 if n < 0 else 1 n = abs(n) rezultat = 0 while n: rezultat = rezultat * 10 + n % 10 n //= 10 return semn * rezultat
  13. 13. def frecventa_maxima(a): f = {} for x in a: f[x] = f.get(x, 0) + 1 return min(f, key=lambda x: (-f[x], x))
  14. 14. def cuvinte_capete_egale(s): nr = 0 for cuvant in s.split(): if cuvant and cuvant[0].lower() == cuvant[-1].lower(): nr += 1 return nr
  15. 15. def urmator_palindrom(n): x = n + 1 while str(x) != str(x)[::-1]: x += 1 return x
  16. 16. def pozitii_minim(a): m = min(a) return [i for i, x in enumerate(a) if x == m]
  17. 17. def suma_diagonala(m): return sum(m[i][i] for i in range(min(len(m), len(m[0]))))
  18. 18. def negative_in_fata(a): return [x for x in a if x < 0] + [x for x in a if x >= 0]
  19. 19. def lungime_intersectie(a, b, c, d): st = max(a, c) dr = min(b, d) return max(0, dr - st)
  20. 20. def puncte_minime(intervale): intervale = sorted(intervale, key=lambda x: x[1]) puncte = [] for st, dr in intervale: if not puncte or puncte[-1] < st: puncte.append(dr) return puncte

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Scrie o funcție care primește o listă și returnează al doilea cel mai mare element distinct, fără să folosești sort().

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează al doilea cel mai mare element distinct, fără să folosești sort().

def al_doilea_maxim(a):
    distincte = set(a)
    if len(distincte) < 2:
        raise ValueError("Nu există al doilea maxim distinct.")
    maxim = max(distincte)
    return max(x for x in distincte if x != maxim)
foarte simplu

Exercițiul 2

Enunț:

Scrie o funcție care primește o listă de numere și returnează simultan suma numerelor pare și produsul numerelor impare, folosind o singură parcurgere.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă de numere și returnează simultan suma numerelor pare și produsul numerelor impare, folosind o singură parcurgere.

def suma_si_produs(a):
    suma_pare = 0
    produs_impare = 1
    exista_impar = False
    for x in a:
        if x % 2 == 0:
            suma_pare += x
        else:
            produs_impare *= x
            exista_impar = True
    return suma_pare, produs_impare if exista_impar else 0
foarte simplu

Exercițiul 3

Enunț:

Scrie o funcție care primește un șir și returnează cel mai lung prefix care este și sufix al șirului, fără a considera întregul șir.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un șir și returnează cel mai lung prefix care este și sufix al șirului, fără a considera întregul șir.

def prefix_sufix(s):
    for lungime in range(len(s) - 1, 0, -1):
        if s[:lungime] == s[-lungime:]:
            return s[:lungime]
    return 
foarte simplu

Exercițiul 4

Enunț:

Scrie o funcție care primește o listă și returnează o nouă listă în care fiecare element este înlocuit cu suma tuturor elementelor din dreapta sa.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează o nouă listă în care fiecare element este înlocuit cu suma tuturor elementelor din dreapta sa.

def sume_dreapta(a):
    rezultat = [0] * len(a)
    suma = 0
    for i in range(len(a) - 1, -1, -1):
        rezultat[i] = suma
        suma += a[i]
    return rezultat
Foarte foarte simplu

Exercițiul 5

Enunț:

Scrie o funcție care verifică dacă o listă poate fi împărțită în două segmente nevidе cu aceeași sumă.

Vezi rezolvarea
Enunț:

Scrie o funcție care verifică dacă o listă poate fi împărțită în două segmente nevidе cu aceeași sumă.

def impartire_egala(a):
    total = sum(a)
    stanga = 0
    for x in a[:-1]:
        stanga += x
        if stanga * 2 == total:
            return True
    return False
foarte simplu

Exercițiul 6

Enunț:

Scrie o funcție care primește două liste și returnează elementele care apar în prima listă, dar nu în a doua, păstrând ordinea primei liste și duplicatele.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește două liste și returnează elementele care apar în prima listă, dar nu în a doua, păstrând ordinea primei liste și duplicatele.

def diferenta_ordonata(a, b):
    b = set(b)
    return [x for x in a if x not in b]
foarte simplu

Exercițiul 7

Enunț:

Scrie o funcție care comprimă o listă în perechi (valoare, frecvență) pentru secvențe consecutive egale.

Vezi rezolvarea
Enunț:

Scrie o funcție care comprimă o listă în perechi (valoare, frecvență) pentru secvențe consecutive egale.

def comprimare(a):
    if not a:
        return []
    rezultat = []
    curent = a[0]
    nr = 1
    for x in a[1:]:
        if x == curent:
            nr += 1
        else:
            rezultat.append((curent, nr))
            curent, nr = x, 1
    rezultat.append((curent, nr))
    return rezultat
Foarte foarte simplu

Exercițiul 8

Enunț:

Scrie o funcție care primește o listă și returnează cea mai lungă subsecvență strict crescătoare consecutivă.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează cea mai lungă subsecvență strict crescătoare consecutivă.

def crescatoare_maxima(a):
    if not a:
        return []
    best = curent = [a[0]]
    for x in a[1:]:
        if x > curent[-1]:
            curent.append(x)
        else:
            curent = [x]
        if len(curent) > len(best):
            best = curent[:]
    return best
foarte simplu

Exercițiul 9

Enunț:

Scrie o funcție care primește un număr și returnează numărul de divizori ai săi.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un număr și returnează numărul de divizori ai săi.

def nr_divizori(n):
    nr = 0
    for d in range(1, int(n ** 0.5) + 1):
        if n % d == 0:
            nr += 2 if d * d != n else 1
    return nr
Foarte foarte simplu

Exercițiul 10

Enunț:

Scrie o funcție care primește o listă de numere și returnează lungimea celei mai lungi subsecvențe cu sumă 0.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă de numere și returnează lungimea celei mai lungi subsecvențe cu sumă 0.

def lungime_suma_zero(a):
    prima = {0: -1}
    suma = best = 0
    for i, x in enumerate(a):
        suma += x
        if suma in prima:
            best = max(best, i - prima[suma])
        else:
            prima[suma] = i
    return best
foarte simplu

Exercițiul 11

Enunț:

Scrie o funcție care interschimbă valorile a două variabile primite ca argumente și explică de ce rezultatul trebuie returnat.

Vezi rezolvarea
Enunț:

Scrie o funcție care interschimbă valorile a două variabile primite ca argumente și explică de ce rezultatul trebuie returnat.

def interschimba(a, b):
    return b, a
# Exemplu: x, y = interschimba(x, y)
foarte simplu

Exercițiul 12

Enunț:

Scrie o funcție care primește un număr și construiește numărul obținut prin inversarea cifrelor sale.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un număr și construiește numărul obținut prin inversarea cifrelor sale.

def invers(n):
    semn = -1 if n < 0 else 1
    n = abs(n)
    rezultat = 0
    while n:
        rezultat = rezultat * 10 + n % 10
        n //= 10
    return semn * rezultat
Foarte foarte simplu

Exercițiul 13

Enunț:

Scrie o funcție care primește o listă și returnează valoarea care apare cel mai des; la egalitate, returnează valoarea mai mică.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează valoarea care apare cel mai des; la egalitate, returnează valoarea mai mică.

def frecventa_maxima(a):
    f = {}
    for x in a:
        f[x] = f.get(x, 0) + 1
    return min(f, key=lambda x: (-f[x], x))
foarte simplu

Exercițiul 14

Enunț:

Scrie o funcție care primește un șir și returnează numărul de cuvinte care au aceeași primă și ultimă literă.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un șir și returnează numărul de cuvinte care au aceeași primă și ultimă literă.

def cuvinte_capete_egale(s):
    nr = 0
    for cuvant in s.split():
        if cuvant and cuvant[0].lower() == cuvant[-1].lower():
            nr += 1
    return nr
Foarte foarte simplu

Exercițiul 15

Enunț:

Scrie o funcție care primește un număr n și returnează cel mai mic număr mai mare decât n care este palindrom.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un număr n și returnează cel mai mic număr mai mare decât n care este palindrom.

def urmator_palindrom(n):
    x = n + 1
    while str(x) != str(x)[::-1]:
        x += 1
    return x
foarte simplu

Exercițiul 16

Enunț:

Scrie o funcție care primește o listă și returnează toate pozițiile la care apare minimul.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează toate pozițiile la care apare minimul.

def pozitii_minim(a):
    m = min(a)
    return [i for i, x in enumerate(a) if x == m]
foarte simplu

Exercițiul 17

Enunț:

Scrie o funcție care primește o matrice reprezentată ca listă de liste și returnează suma elementelor de pe diagonala principală.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o matrice reprezentată ca listă de liste și returnează suma elementelor de pe diagonala principală.

def suma_diagonala(m):
    return sum(m[i][i] for i in range(min(len(m), len(m[0]))))
Foarte foarte simplu

Exercițiul 18

Enunț:

Scrie o funcție care primește o listă și mută toate valorile negative la început, fără să schimbe ordinea relativă a valorilor negative și pozitive.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și mută toate valorile negative la început, fără să schimbe ordinea relativă a valorilor negative și pozitive.

def negative_in_fata(a):
    return [x for x in a if x < 0] + [x for x in a if x >= 0]
foarte simplu

Exercițiul 19

Enunț:

Scrie o funcție care primește două intervale [a,b] și [c,d] și returnează lungimea intersecției lor.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește două intervale [a,b] și [c,d] și returnează lungimea intersecției lor.

def lungime_intersectie(a, b, c, d):
    st = max(a, c)
    dr = min(b, d)
    return max(0, dr - st)
Foarte foarte simplu

Exercițiul 20

Enunț:

Scrie o funcție care primește o listă de intervale și returnează numărul minim de puncte necesare pentru a acoperi toate intervalele.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă de intervale și returnează numărul minim de puncte necesare pentru a acoperi toate intervalele.

def puncte_minime(intervale):
    intervale = sorted(intervale, key=lambda x: x[1])
    puncte = []
    for st, dr in intervale:
        if not puncte or puncte[-1] < st:
            puncte.append(dr)
    return puncte

2. Parametri și argumente

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def peste_prag(a, prag=0): return sum(x > prag for x in a)
  2. 2. def medie(*numere): if not numere: return 0 return sum(numere) / len(numere)
  3. 3. def valori_la_indici(a, *indici): return [a[i] for i in indici]
  4. 4. def materia_maxima(**note): return max(note, key=note.get) if note else None
  5. 5. def calculeaza(a, b, operatia="+"): if operatia == "+": return a + b if operatia == "-": return a - b if operatia == "*": return a * b if operatia == "/": return a / b raise ValueError("Operație necunoscută")
  6. 6. def aplica(a, functie): return [functie(x) for x in a]
  7. 7. def maxim_dupa_f(a, f): if not a: return None return max(f(x) for x in a)
  8. 8. def blocuri(a, k): return [a[i:i+k] for i in range(0, len(a), k)]
  9. 9. def filtreaza(a, prag, invers=False): r = [x for x in a if x >= prag] return r[::-1] if invers else r
  10. 10. def coloana(m, j): if not m or j < 0 or j >= len(m[0]): raise IndexError("Coloană invalidă") return [linie[j] for linie in m]
  11. 11. def transforma_valori(d, f): return {cheie: f(valoare) for cheie, valoare in d.items()}
  12. 12. def egale(a, b, strict=True): return a == b if strict else set(a) == set(b)
  13. 13. def comune(*liste): if not liste: return set() rezultat = set(liste[0]) for a in liste[1:]: rezultat &= set(a) return rezultat
  14. 14. def timp(secunde, format_lung=False): h, rest = divmod(secunde, 3600) m, s = divmod(rest, 60) return f"{h} ore, {m} minute, {s} secunde" if format_lung else (h, m, s)
  15. 15. def suma_interval(a, start=0, stop=None): return sum(a[start:stop])
  16. 16. def mai_mare(a, b, compara): return a if compara(a, b) else b
  17. 17. def maxim(a, key=None): return max(a, key=key)
  18. 18. def reduce_simplu(f, initial, a): rezultat = initial for x in a: rezultat = f(rezultat, x) return rezultat
  19. 19. def divizibile_de_toti(a, *divizori): return [x for x in a if all(x % d == 0 for d in divizori)]
  20. 20. def configurare(**optiuni): return { "mod": optiuni.get("mod", "normal"), "limita": optiuni.get("limita", 100), "activ": optiuni.get("activ", True) }

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Scrie o funcție cu parametru implicit care primește o listă și un prag, iar pragul implicit este 0; returnează numărul valorilor mai mari decât pragul.

Vezi rezolvarea
Enunț:

Scrie o funcție cu parametru implicit care primește o listă și un prag, iar pragul implicit este 0; returnează numărul valorilor mai mari decât pragul.

def peste_prag(a, prag=0):
    return sum(x > prag for x in a)
foarte simplu

Exercițiul 2

Enunț:

Scrie o funcție care primește un număr variabil de argumente și returnează media lor, fără argumente speciale.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un număr variabil de argumente și returnează media lor, fără argumente speciale.

def medie(*numere):
    if not numere:
        return 0
    return sum(numere) / len(numere)
foarte simplu

Exercițiul 3

Enunț:

Scrie o funcție care primește o listă și mai mulți indici prin *args și returnează valorile aflate la acei indici.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și mai mulți indici prin *args și returnează valorile aflate la acei indici.

def valori_la_indici(a, *indici):
    return [a[i] for i in indici]
Foarte foarte simplu

Exercițiul 4

Enunț:

Scrie o funcție care primește prin **kwargs nume de materii și note și returnează materia cu cea mai mare notă.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește prin **kwargs nume de materii și note și returnează materia cu cea mai mare notă.

def materia_maxima(**note):
    return max(note, key=note.get) if note else None
foarte simplu

Exercițiul 5

Enunț:

Scrie o funcție care primește două numere și un parametru opțional operatia, cu valoarea implicită '+', și execută operația.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește două numere și un parametru opțional operatia, cu valoarea implicită '+', și execută operația.

def calculeaza(a, b, operatia="+"):
    if operatia == "+": return a + b
    if operatia == "-": return a - b
    if operatia == "*": return a * b
    if operatia == "/": return a / b
    raise ValueError("Operație necunoscută")
foarte simplu

Exercițiul 6

Enunț:

Scrie o funcție care primește o listă și o funcție ca argument și returnează rezultatele obținute aplicând funcția fiecărui element.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și o funcție ca argument și returnează rezultatele obținute aplicând funcția fiecărui element.

def aplica(a, functie):
    return [functie(x) for x in a]
Foarte foarte simplu

Exercițiul 7

Enunț:

Scrie o funcție care primește o funcție f și o listă de valori și returnează valoarea maximă dintre f(x) pentru toate x.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o funcție f și o listă de valori și returnează valoarea maximă dintre f(x) pentru toate x.

def maxim_dupa_f(a, f):
    if not a:
        return None
    return max(f(x) for x in a)
foarte simplu

Exercițiul 8

Enunț:

Scrie o funcție care primește o listă și un număr k și returnează lista împărțită în blocuri de cel mult k elemente.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și un număr k și returnează lista împărțită în blocuri de cel mult k elemente.

def blocuri(a, k):
    return [a[i:i+k] for i in range(0, len(a), k)]
foarte simplu

Exercițiul 9

Enunț:

Scrie o funcție cu parametru boolean invers care, dacă este True, inversează lista rezultatului.

Vezi rezolvarea
Enunț:

Scrie o funcție cu parametru boolean invers care, dacă este True, inversează lista rezultatului.

def filtreaza(a, prag, invers=False):
    r = [x for x in a if x >= prag]
    return r[::-1] if invers else r
Foarte foarte simplu

Exercițiul 10

Enunț:

Scrie o funcție care primește o matrice și un indice de coloană și returnează coloana respectivă, validând indicele.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o matrice și un indice de coloană și returnează coloana respectivă, validând indicele.

def coloana(m, j):
    if not m or j < 0 or j >= len(m[0]):
        raise IndexError("Coloană invalidă")
    return [linie[j] for linie in m]
foarte simplu

Exercițiul 11

Enunț:

Scrie o funcție care primește un dicționar și o funcție de transformare și returnează un nou dicționar cu valorile transformate.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un dicționar și o funcție de transformare și returnează un nou dicționar cu valorile transformate.

def transforma_valori(d, f):
    return {cheie: f(valoare) for cheie, valoare in d.items()}
foarte simplu

Exercițiul 12

Enunț:

Scrie o funcție care primește două liste și un parametru implicit strict=True; dacă este True verifică egalitatea element cu element, altfel verifică doar aceleași mulțimi.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește două liste și un parametru implicit strict=True; dacă este True verifică egalitatea element cu element, altfel verifică doar aceleași mulțimi.

def egale(a, b, strict=True):
    return a == b if strict else set(a) == set(b)
Foarte foarte simplu

Exercițiul 13

Enunț:

Scrie o funcție care primește *args de liste și returnează elementele comune tuturor listelor.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește *args de liste și returnează elementele comune tuturor listelor.

def comune(*liste):
    if not liste:
        return set()
    rezultat = set(liste[0])
    for a in liste[1:]:
        rezultat &= set(a)
    return rezultat
foarte simplu

Exercițiul 14

Enunț:

Scrie o funcție care primește un număr de secunde și parametri opționali pentru format și returnează timpul în ore, minute și secunde.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un număr de secunde și parametri opționali pentru format și returnează timpul în ore, minute și secunde.

def timp(secunde, format_lung=False):
    h, rest = divmod(secunde, 3600)
    m, s = divmod(rest, 60)
    return f"{h} ore, {m} minute, {s} secunde" if format_lung else (h, m, s)
foarte simplu

Exercițiul 15

Enunț:

Scrie o funcție care primește o listă, start și stop opționale și returnează suma porțiunii selectate.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă, start și stop opționale și returnează suma porțiunii selectate.

def suma_interval(a, start=0, stop=None):
    return sum(a[start:stop])
Foarte foarte simplu

Exercițiul 16

Enunț:

Scrie o funcție care primește o funcție de comparație și două valori și returnează valoarea considerată mai mare de funcția de comparație.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o funcție de comparație și două valori și returnează valoarea considerată mai mare de funcția de comparație.

def mai_mare(a, b, compara):
    return a if compara(a, b) else b
foarte simplu

Exercițiul 17

Enunț:

Scrie o funcție care primește o listă și un argument cheie key opțional; returnează elementul maxim conform cheii.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și un argument cheie key opțional; returnează elementul maxim conform cheii.

def maxim(a, key=None):
    return max(a, key=key)
Foarte foarte simplu

Exercițiul 18

Enunț:

Scrie o funcție care primește o funcție f, o valoare inițială și o listă și aplică succesiv f pentru a obține rezultatul final.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o funcție f, o valoare inițială și o listă și aplică succesiv f pentru a obține rezultatul final.

def reduce_simplu(f, initial, a):
    rezultat = initial
    for x in a:
        rezultat = f(rezultat, x)
    return rezultat
foarte simplu

Exercițiul 19

Enunț:

Scrie o funcție care primește o listă de numere și un număr de divizori prin parametri și returnează numerele divizibile cu toți acei divizori.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă de numere și un număr de divizori prin parametri și returnează numerele divizibile cu toți acei divizori.

def divizibile_de_toti(a, *divizori):
    return [x for x in a if all(x % d == 0 for d in divizori)]
Foarte foarte simplu

Exercițiul 20

Enunț:

Scrie o funcție care primește un dicționar de configurare prin **kwargs și folosește valori implicite pentru lipsa unor opțiuni.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește un dicționar de configurare prin **kwargs și folosește valori implicite pentru lipsa unor opțiuni.

def configurare(**optiuni):
    return {
        "mod": optiuni.get("mod", "normal"),
        "limita": optiuni.get("limita", 100),
        "activ": optiuni.get("activ", True)
    }

3. Domeniul variabilelor

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def calculeaza(): x = 10 return x y = calculeaza() print(y)
  2. 2. valoare = 20 def afisare(): return valoare def dublare(): return valoare * 2 print(afisare(), dublare())
  3. 3. x = 100 def f(x): return x print(f(5)) print(x)
  4. 4. def puteri(n): patrat = n * n cub = patrat * n return patrat, cub
  5. 5. def suma_lista(a): s = 0 for x in a: s += x return s
  6. 6. def prima(a): rezultat = a * 3 return rezultat def a_doua(x): return x + 10 rezultat = a_doua(prima(7))
  7. 7. def test(): x = 42 return x x = test() print(x)
  8. 8. x = 50 def f(): x = 10 return x print(f()) print(x)
  9. 9. def dublu(x): y = 2 * x return y a = dublu(3) b = dublu(9) print(a, b)
  10. 10. def pret_final(pret, reducere, taxa): pret_reducere = pret * (1 - reducere) return pret_reducere * (1 + taxa)
  11. 11. def rezultat(a, b, c): intermediar = a * b return intermediar + c
  12. 12. def statistici(a): suma = sum(a) nr = len(a) return suma, suma / nr if nr else 0
  13. 13. s = 100 def f(a): s = sum(a) return s print(f([1, 2, 3])) print(s)
  14. 14. def dublare_nemutanta(a): rezultat = [] for x in a: rezultat.append(2 * x) return rezultat
  15. 15. def f(x): return x + 2 def g(x): return x * 3 def h(x): return x - 1 rezultat = h(g(f(5)))
  16. 16. def calculeaza(x): rezultat = x * x return rezultat
  17. 17. def genereaza(): secret_local = 123 return secret_local valoare_globala = genereaza()
  18. 18. def exista(a, x): for element in a: if element == x: return True return False
  19. 19. def frecvente(a): f = {} for x in a: f[x] = f.get(x, 0) + 1 return f def cea_mai_frecventa(a): f = frecvente(a) return max(f, key=f.get)
  20. 20. def statistici_complete(a): s = sum(a) minim = min(a) maxim = max(a) return s, minim, maxim

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Scrie o funcție care demonstrează că o variabilă locală nu poate fi folosită în exterior și repară programul folosind return.

Vezi rezolvarea
Enunț:

Scrie o funcție care demonstrează că o variabilă locală nu poate fi folosită în exterior și repară programul folosind return.

def calculeaza():
    x = 10
    return x
y = calculeaza()
print(y)
foarte simplu

Exercițiul 2

Enunț:

Scrie un program în care o variabilă globală este citită de două funcții, fără ca funcțiile să o modifice.

Vezi rezolvarea
Enunț:

Scrie un program în care o variabilă globală este citită de două funcții, fără ca funcțiile să o modifice.

valoare = 20
def afisare():
    return valoare
def dublare():
    return valoare * 2
print(afisare(), dublare())
Foarte foarte simplu

Exercițiul 3

Enunț:

Demonstrează prin cod diferența dintre un parametru local și o variabilă globală cu același nume.

Vezi rezolvarea
Enunț:

Demonstrează prin cod diferența dintre un parametru local și o variabilă globală cu același nume.

x = 100
def f(x):
    return x
print(f(5))
print(x)
foarte simplu

Exercițiul 4

Enunț:

Scrie o funcție care primește o valoare și folosește doar variabile locale pentru a calcula pătratul și cubul.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o valoare și folosește doar variabile locale pentru a calcula pătratul și cubul.

def puteri(n):
    patrat = n * n
    cub = patrat * n
    return patrat, cub
foarte simplu

Exercițiul 5

Enunț:

Construiește o funcție care nu modifică nicio variabilă globală și returnează suma unei liste.

Vezi rezolvarea
Enunț:

Construiește o funcție care nu modifică nicio variabilă globală și returnează suma unei liste.

def suma_lista(a):
    s = 0
    for x in a:
        s += x
    return s
Foarte foarte simplu

Exercițiul 6

Enunț:

Scrie un program în care o funcție calculează un rezultat local, iar o a doua funcție primește rezultatul prin parametru.

Vezi rezolvarea
Enunț:

Scrie un program în care o funcție calculează un rezultat local, iar o a doua funcție primește rezultatul prin parametru.

def prima(a):
    rezultat = a * 3
    return rezultat
def a_doua(x):
    return x + 10
rezultat = a_doua(prima(7))
foarte simplu

Exercițiul 7

Enunț:

Identifică și corectează eroarea de domeniu dintr-un program care încearcă să afișeze o variabilă creată într-o funcție.

Vezi rezolvarea
Enunț:

Identifică și corectează eroarea de domeniu dintr-un program care încearcă să afișeze o variabilă creată într-o funcție.

def test():
    x = 42
    return x
x = test()
print(x)
foarte simplu

Exercițiul 8

Enunț:

Scrie o funcție care folosește o variabilă locală cu același nume ca una globală, fără să modifice globalul.

Vezi rezolvarea
Enunț:

Scrie o funcție care folosește o variabilă locală cu același nume ca una globală, fără să modifice globalul.

x = 50
def f():
    x = 10
    return x
print(f())
print(x)
Foarte foarte simplu

Exercițiul 9

Enunț:

Construiește două apeluri independente ale unei funcții și arată că variabilele locale ale apelurilor nu se confundă.

Vezi rezolvarea
Enunț:

Construiește două apeluri independente ale unei funcții și arată că variabilele locale ale apelurilor nu se confundă.

def dublu(x):
    y = 2 * x
    return y
a = dublu(3)
b = dublu(9)
print(a, b)
foarte simplu

Exercițiul 10

Enunț:

Scrie o funcție care primește toate datele necesare prin parametri și nu folosește deloc variabile globale.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește toate datele necesare prin parametri și nu folosește deloc variabile globale.

def pret_final(pret, reducere, taxa):
    pret_reducere = pret * (1 - reducere)
    return pret_reducere * (1 + taxa)
Foarte foarte simplu

Exercițiul 11

Enunț:

Refactorizează un calcul dependent de trei variabile globale într-o funcție pură cu trei parametri.

Vezi rezolvarea
Enunț:

Refactorizează un calcul dependent de trei variabile globale într-o funcție pură cu trei parametri.

def rezultat(a, b, c):
    intermediar = a * b
    return intermediar + c
foarte simplu

Exercițiul 12

Enunț:

Scrie o funcție care returnează două rezultate calculate din variabile locale.

Vezi rezolvarea
Enunț:

Scrie o funcție care returnează două rezultate calculate din variabile locale.

def statistici(a):
    suma = sum(a)
    nr = len(a)
    return suma, suma / nr if nr else 0
foarte simplu

Exercițiul 13

Enunț:

Creează o funcție cu o variabilă locală numită s și arată că o variabilă globală s rămâne neschimbată.

Vezi rezolvarea
Enunț:

Creează o funcție cu o variabilă locală numită s și arată că o variabilă globală s rămâne neschimbată.

s = 100
def f(a):
    s = sum(a)
    return s
print(f([1, 2, 3]))
print(s)
Foarte foarte simplu

Exercițiul 14

Enunț:

Scrie o funcție care primește o listă și returnează o nouă listă, fără să modifice lista primită.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează o nouă listă, fără să modifice lista primită.

def dublare_nemutanta(a):
    rezultat = []
    for x in a:
        rezultat.append(2 * x)
    return rezultat
foarte simplu

Exercițiul 15

Enunț:

Construiește un lanț de trei funcții în care fiecare primește rezultatul celei precedente prin parametru.

Vezi rezolvarea
Enunț:

Construiește un lanț de trei funcții în care fiecare primește rezultatul celei precedente prin parametru.

def f(x): return x + 2
def g(x): return x * 3
def h(x): return x - 1
rezultat = h(g(f(5)))
Foarte foarte simplu

Exercițiul 16

Enunț:

Scrie o funcție care are o variabilă locală cu același nume ca parametrul și explică de ce nu este permisă redefinirea în aceeași listă de parametri; folosește în schimb alt nume.

Vezi rezolvarea
Enunț:

Scrie o funcție care are o variabilă locală cu același nume ca parametrul și explică de ce nu este permisă redefinirea în aceeași listă de parametri; folosește în schimb alt nume.

def calculeaza(x):
    rezultat = x * x
    return rezultat
foarte simplu

Exercițiul 17

Enunț:

Scrie un program care returnează o valoare locală și o atribuie unei variabile globale în afara funcției.

Vezi rezolvarea
Enunț:

Scrie un program care returnează o valoare locală și o atribuie unei variabile globale în afara funcției.

def genereaza():
    secret_local = 123
    return secret_local
valoare_globala = genereaza()
foarte simplu

Exercițiul 18

Enunț:

Scrie o funcție care verifică dacă o valoare există într-o listă și returnează True/False, fără print().

Vezi rezolvarea
Enunț:

Scrie o funcție care verifică dacă o valoare există într-o listă și returnează True/False, fără print().

def exista(a, x):
    for element in a:
        if element == x:
            return True
    return False
Foarte foarte simplu

Exercițiul 19

Enunț:

Separă într-o funcție pură calculul frecvențelor și într-o a doua funcție alegerea valorii celei mai frecvente.

Vezi rezolvarea
Enunț:

Separă într-o funcție pură calculul frecvențelor și într-o a doua funcție alegerea valorii celei mai frecvente.

def frecvente(a):
    f = {}
    for x in a:
        f[x] = f.get(x, 0) + 1
    return f
def cea_mai_frecventa(a):
    f = frecvente(a)
    return max(f, key=f.get)
foarte simplu

Exercițiul 20

Enunț:

Scrie o funcție care primește o listă și returnează suma, minimul și maximul, folosind doar variabile locale.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează suma, minimul și maximul, folosind doar variabile locale.

def statistici_complete(a):
    s = sum(a)
    minim = min(a)
    maxim = max(a)
    return s, minim, maxim

4. Tupluri

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def pozitii_pare(t): return tuple(t[::2])
  2. 2. def inversare(t): a, b, c = t return c, b, a
  3. 3. def elev_maxim(t): return max(t, key=lambda pereche: pereche[1])[0]
  4. 4. def frecvente_tuplu(t): f = {} for x in t: f[x] = f.get(x, 0) + 1 return tuple(f.items())
  5. 5. def este_palindrom(t): return t == t[::-1]
  6. 6. def distanta_manhattan(p): x, y = p return abs(x) + abs(y)
  7. 7. def concateneaza(lista): rezultat = () for t in lista: rezultat += t return rezultat
  8. 8. def elimina(t, valoare): return tuple(x for x in t if x != valoare)
  9. 9. def interval_maxim(t): return max(t, key=lambda x: x[1] - x[0])
  10. 10. def distincte(t): vazute = set() r = [] for x in t: if x not in vazute: vazute.add(x) r.append(x) return tuple(r)
  11. 11. def suma_elemente(a, b): return tuple(x + y for x, y in zip(a, b))
  12. 12. def transpusa(m): return tuple(zip(*m))
  13. 13. def cel_mai_lung(t): return max(t, key=len) if t else
  14. 14. def data_valida(t): an, luna, zi = t return an > 0 and 1 <= luna <= 12 and 1 <= zi <= 31
  15. 15. def prefix_crescator(t): if not t: return () r = [t[0]] for x in t[1:]: if x > r[-1]: r.append(x) else: break return tuple(r)
  16. 16. def interschimba(a, b): a, b = b, a return a, b
  17. 17. def grupeaza(t): d = {} for cheie, valoare in t: d.setdefault(cheie, []).append(valoare) return d
  18. 18. def patrate_pozitive(t): return tuple(x * x for x in t if x > 0)
  19. 19. def prima_peste_medie(t): if not t: return -1 media = sum(t) / len(t) for i, x in enumerate(t): if x > media: return i return -1
  20. 20. def diagonala(m): if not m or any(len(linie) != len(m) for linie in m): return () return tuple(m[i][i] for i in range(len(m)))

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Primește un tuplu de numere și returnează tuplul format din valorile de pe pozițiile pare.

Vezi rezolvarea
Enunț:

Primește un tuplu de numere și returnează tuplul format din valorile de pe pozițiile pare.

def pozitii_pare(t):
    return tuple(t[::2])
foarte simplu

Exercițiul 2

Enunț:

Despachetează un tuplu de trei valori și construiește un nou tuplu cu valorile în ordine inversă.

Vezi rezolvarea
Enunț:

Despachetează un tuplu de trei valori și construiește un nou tuplu cu valorile în ordine inversă.

def inversare(t):
    a, b, c = t
    return c, b, a
Foarte foarte simplu

Exercițiul 3

Enunț:

Primește un tuplu de perechi (nume, notă) și returnează numele elevului cu nota maximă.

Vezi rezolvarea
Enunț:

Primește un tuplu de perechi (nume, notă) și returnează numele elevului cu nota maximă.

def elev_maxim(t):
    return max(t, key=lambda pereche: pereche[1])[0]
foarte simplu

Exercițiul 4

Enunț:

Numără de câte ori apare fiecare valoare într-un tuplu și returnează rezultatul ca tuplu de perechi.

Vezi rezolvarea
Enunț:

Numără de câte ori apare fiecare valoare într-un tuplu și returnează rezultatul ca tuplu de perechi.

def frecvente_tuplu(t):
    f = {}
    for x in t:
        f[x] = f.get(x, 0) + 1
    return tuple(f.items())
foarte simplu

Exercițiul 5

Enunț:

Primește un tuplu și verifică dacă este palindrom.

Vezi rezolvarea
Enunț:

Primește un tuplu și verifică dacă este palindrom.

def este_palindrom(t):
    return t == t[::-1]
Foarte foarte simplu

Exercițiul 6

Enunț:

Primește un tuplu de coordonate (x, y) și returnează distanța Manhattan față de origine.

Vezi rezolvarea
Enunț:

Primește un tuplu de coordonate (x, y) și returnează distanța Manhattan față de origine.

def distanta_manhattan(p):
    x, y = p
    return abs(x) + abs(y)
foarte simplu

Exercițiul 7

Enunț:

Concatenează o listă de tupluri într-un singur tuplu.

Vezi rezolvarea
Enunț:

Concatenează o listă de tupluri într-un singur tuplu.

def concateneaza(lista):
    rezultat = ()
    for t in lista:
        rezultat += t
    return rezultat
foarte simplu

Exercițiul 8

Enunț:

Primește un tuplu și elimină toate aparițiile unei valori, păstrând restul ordinii.

Vezi rezolvarea
Enunț:

Primește un tuplu și elimină toate aparițiile unei valori, păstrând restul ordinii.

def elimina(t, valoare):
    return tuple(x for x in t if x != valoare)
Foarte foarte simplu

Exercițiul 9

Enunț:

Primește un tuplu de intervale și returnează intervalul cu lungimea maximă.

Vezi rezolvarea
Enunț:

Primește un tuplu de intervale și returnează intervalul cu lungimea maximă.

def interval_maxim(t):
    return max(t, key=lambda x: x[1] - x[0])
foarte simplu

Exercițiul 10

Enunț:

Construiește dintr-un tuplu de numere un tuplu cu doar valorile distincte, în ordinea primei apariții.

Vezi rezolvarea
Enunț:

Construiește dintr-un tuplu de numere un tuplu cu doar valorile distincte, în ordinea primei apariții.

def distincte(t):
    vazute = set()
    r = []
    for x in t:
        if x not in vazute:
            vazute.add(x)
            r.append(x)
    return tuple(r)
foarte simplu

Exercițiul 11

Enunț:

Primește două tupluri de aceeași lungime și returnează tuplul sumelor element cu element.

Vezi rezolvarea
Enunț:

Primește două tupluri de aceeași lungime și returnează tuplul sumelor element cu element.

def suma_elemente(a, b):
    return tuple(x + y for x, y in zip(a, b))
Foarte foarte simplu

Exercițiul 12

Enunț:

Transpune o matrice reprezentată ca tuplu de tupluri.

Vezi rezolvarea
Enunț:

Transpune o matrice reprezentată ca tuplu de tupluri.

def transpusa(m):
    return tuple(zip(*m))
foarte simplu

Exercițiul 13

Enunț:

Primește un tuplu de cuvinte și returnează cuvântul cel mai lung; la egalitate, primul.

Vezi rezolvarea
Enunț:

Primește un tuplu de cuvinte și returnează cuvântul cel mai lung; la egalitate, primul.

def cel_mai_lung(t):
    return max(t, key=len) if t else 
foarte simplu

Exercițiul 14

Enunț:

Descompune un tuplu (an, lună, zi) și verifică dacă formează o dată simplificată cu valori pozitive.

Vezi rezolvarea
Enunț:

Descompune un tuplu (an, lună, zi) și verifică dacă formează o dată simplificată cu valori pozitive.

def data_valida(t):
    an, luna, zi = t
    return an > 0 and 1 <= luna <= 12 and 1 <= zi <= 31
Foarte foarte simplu

Exercițiul 15

Enunț:

Primește un tuplu de numere și returnează cel mai lung prefix strict crescător.

Vezi rezolvarea
Enunț:

Primește un tuplu de numere și returnează cel mai lung prefix strict crescător.

def prefix_crescator(t):
    if not t:
        return ()
    r = [t[0]]
    for x in t[1:]:
        if x > r[-1]:
            r.append(x)
        else:
            break
    return tuple(r)
foarte simplu

Exercițiul 16

Enunț:

Interchimbă două tupluri folosind despachetarea Python.

Vezi rezolvarea
Enunț:

Interchimbă două tupluri folosind despachetarea Python.

def interschimba(a, b):
    a, b = b, a
    return a, b
Foarte foarte simplu

Exercițiul 17

Enunț:

Primește un tuplu de perechi și grupează valorile după prima componentă, folosind un dicționar.

Vezi rezolvarea
Enunț:

Primește un tuplu de perechi și grupează valorile după prima componentă, folosind un dicționar.

def grupeaza(t):
    d = {}
    for cheie, valoare in t:
        d.setdefault(cheie, []).append(valoare)
    return d
foarte simplu

Exercițiul 18

Enunț:

Primește un tuplu și returnează un tuplu cu valorile pătrate ale elementelor pozitive.

Vezi rezolvarea
Enunț:

Primește un tuplu și returnează un tuplu cu valorile pătrate ale elementelor pozitive.

def patrate_pozitive(t):
    return tuple(x * x for x in t if x > 0)
foarte simplu

Exercițiul 19

Enunț:

Primește un tuplu de numere și returnează poziția primei valori care depășește media.

Vezi rezolvarea
Enunț:

Primește un tuplu de numere și returnează poziția primei valori care depășește media.

def prima_peste_medie(t):
    if not t:
        return -1
    media = sum(t) / len(t)
    for i, x in enumerate(t):
        if x > media:
            return i
    return -1
Foarte foarte simplu

Exercițiul 20

Enunț:

Primește un tuplu de tupluri și returnează toate elementele de pe diagonala principală, dacă matricea este pătrată.

Vezi rezolvarea
Enunț:

Primește un tuplu de tupluri și returnează toate elementele de pe diagonala principală, dacă matricea este pătrată.

def diagonala(m):
    if not m or any(len(linie) != len(m) for linie in m):
        return ()
    return tuple(m[i][i] for i in range(len(m)))

5. Mulțimi

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def comune(a, b): return set(a) & set(b)
  2. 2. def repetate(a): f = {} for x in a: f[x] = f.get(x, 0) + 1 return {x for x, nr in f.items() if nr >= 2}
  3. 3. def exact_doua(a, b, c): return ((a & b) | (a & c) | (b & c)) - (a & b & c)
  4. 4. def submultime_stricta(a, b): return a < b
  5. 5. def diferenta(a, b): return a - b
  6. 6. def litere_comune(cuvinte): if not cuvinte: return set() r = set(cuvinte[0].lower()) for c in cuvinte[1:]: r &= set(c.lower()) return r
  7. 7. def aceleasi_valori(a, b): return set(a) == set(b)
  8. 8. def perechi_suma(s, k): r = set() for x in s: y = k - x if y in s and x != y: r.add(tuple(sorted((x, y)))) return r
  9. 9. def intersectie_totala(lista): if not lista: return set() r = set(lista[0]) for s in lista[1:]: r &= s return r
  10. 10. def numar_distincte(a): return len(set(a))
  11. 11. def disjuncte(a, b): return a.isdisjoint(b)
  12. 12. def reuniune_fara_comune(a, b): return a ^ b
  13. 13. def litere_distincte(cuvinte): return {c for c in cuvinte if len(set(c.lower())) == len(c) }
  14. 14. def sume_doua(s): return {x + y for x in s for y in s if x != y}
  15. 15. def comune_jumatati(a): m = len(a) // 2 return set(a[:m]) & set(a[m:])
  16. 16. def contine_multipli(s): return (any(x % 3 == 0 for x in s) and any(x % 5 == 0 for x in s) and any(x % 7 == 0 for x in s))
  17. 17. def in_cel_putin_doua(a, b, c): A, B, C = map(set, (a, b, c)) return (A & B) | (A & C) | (B & C)
  18. 18. def unice(a): f = {} for x in a: f[x] = f.get(x, 0) + 1 return {x for x in f if f[x] == 1}
  19. 19. def diferenta_maxima(s): if len(s) < 2: return 0 return max(s) - min(s)
  20. 20. def operatii(a, b): return a & b, a | b, a - b
  21. 21. def toate_clasele(a): resturi = {x % 3 for x in a} return resturi == {0, 1, 2}

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Primește două liste și returnează mulțimea elementelor comune.

Vezi rezolvarea
Enunț:

Primește două liste și returnează mulțimea elementelor comune.

def comune(a, b):
    return set(a) & set(b)
foarte simplu

Exercițiul 2

Enunț:

Primește o listă și returnează valorile distincte care apar de cel puțin două ori.

Vezi rezolvarea
Enunț:

Primește o listă și returnează valorile distincte care apar de cel puțin două ori.

def repetate(a):
    f = {}
    for x in a:
        f[x] = f.get(x, 0) + 1
    return {x for x, nr in f.items() if nr >= 2}
Foarte foarte simplu

Exercițiul 3

Enunț:

Primește trei mulțimi și returnează elementele care apar în exact două dintre ele.

Vezi rezolvarea
Enunț:

Primește trei mulțimi și returnează elementele care apar în exact două dintre ele.

def exact_doua(a, b, c):
    return ((a & b) | (a & c) | (b & c)) - (a & b & c)
foarte simplu

Exercițiul 4

Enunț:

Verifică dacă o mulțime este submulțime strictă a alteia.

Vezi rezolvarea
Enunț:

Verifică dacă o mulțime este submulțime strictă a alteia.

def submultime_stricta(a, b):
    return a < b
foarte simplu

Exercițiul 5

Enunț:

Primește două mulțimi și returnează elementele din prima care nu apar în a doua.

Vezi rezolvarea
Enunț:

Primește două mulțimi și returnează elementele din prima care nu apar în a doua.

def diferenta(a, b):
    return a - b
Foarte foarte simplu

Exercițiul 6

Enunț:

Primește o listă de cuvinte și returnează mulțimea literelor care apar în toate cuvintele.

Vezi rezolvarea
Enunț:

Primește o listă de cuvinte și returnează mulțimea literelor care apar în toate cuvintele.

def litere_comune(cuvinte):
    if not cuvinte:
        return set()
    r = set(cuvinte[0].lower())
    for c in cuvinte[1:]:
        r &= set(c.lower())
    return r
foarte simplu

Exercițiul 7

Enunț:

Verifică dacă două liste conțin exact aceleași valori distincte, indiferent de ordine și duplicate.

Vezi rezolvarea
Enunț:

Verifică dacă două liste conțin exact aceleași valori distincte, indiferent de ordine și duplicate.

def aceleasi_valori(a, b):
    return set(a) == set(b)
foarte simplu

Exercițiul 8

Enunț:

Primește o mulțime de numere și returnează toate perechile distincte a căror sumă este k.

Vezi rezolvarea
Enunț:

Primește o mulțime de numere și returnează toate perechile distincte a căror sumă este k.

def perechi_suma(s, k):
    r = set()
    for x in s:
        y = k - x
        if y in s and x != y:
            r.add(tuple(sorted((x, y))))
    return r
Foarte foarte simplu

Exercițiul 9

Enunț:

Primește o listă de mulțimi și calculează intersecția tuturor.

Vezi rezolvarea
Enunț:

Primește o listă de mulțimi și calculează intersecția tuturor.

def intersectie_totala(lista):
    if not lista:
        return set()
    r = set(lista[0])
    for s in lista[1:]:
        r &= s
    return r
foarte simplu

Exercițiul 10

Enunț:

Primește o listă de numere și returnează numărul de valori distincte.

Vezi rezolvarea
Enunț:

Primește o listă de numere și returnează numărul de valori distincte.

def numar_distincte(a):
    return len(set(a))
foarte simplu

Exercițiul 11

Enunț:

Verifică dacă două mulțimi sunt disjuncte.

Vezi rezolvarea
Enunț:

Verifică dacă două mulțimi sunt disjuncte.

def disjuncte(a, b):
    return a.isdisjoint(b)
Foarte foarte simplu

Exercițiul 12

Enunț:

Primește două mulțimi și returnează reuniunea lor, dar fără valorile care apar în ambele.

Vezi rezolvarea
Enunț:

Primește două mulțimi și returnează reuniunea lor, dar fără valorile care apar în ambele.

def reuniune_fara_comune(a, b):
    return a ^ b
foarte simplu

Exercițiul 13

Enunț:

Primește o listă de cuvinte și returnează cuvintele care au toate literele distincte.

Vezi rezolvarea
Enunț:

Primește o listă de cuvinte și returnează cuvintele care au toate literele distincte.

def litere_distincte(cuvinte):
    return {c for c in cuvinte if len(set(c.lower())) == len(c) }
Foarte foarte simplu

Exercițiul 14

Enunț:

Primește o mulțime de numere și construiește mulțimea tuturor sumelor x+y pentru x și y distincte.

Vezi rezolvarea
Enunț:

Primește o mulțime de numere și construiește mulțimea tuturor sumelor x+y pentru x și y distincte.

def sume_doua(s):
    return {x + y for x in s for y in s if x != y}
foarte simplu

Exercițiul 15

Enunț:

Primește o listă și găsește elementele care apar atât în prima jumătate, cât și în a doua jumătate.

Vezi rezolvarea
Enunț:

Primește o listă și găsește elementele care apar atât în prima jumătate, cât și în a doua jumătate.

def comune_jumatati(a):
    m = len(a) // 2
    return set(a[:m]) & set(a[m:])
foarte simplu

Exercițiul 16

Enunț:

Verifică dacă o mulțime de numere conține cel puțin un multiplu de 3, 5 și 7.

Vezi rezolvarea
Enunț:

Verifică dacă o mulțime de numere conține cel puțin un multiplu de 3, 5 și 7.

def contine_multipli(s):
    return (any(x % 3 == 0 for x in s)
            and any(x % 5 == 0 for x in s)
            and any(x % 7 == 0 for x in s))
Foarte foarte simplu

Exercițiul 17

Enunț:

Primește trei liste și returnează valorile care apar în cel puțin două liste, fără duplicate.

Vezi rezolvarea
Enunț:

Primește trei liste și returnează valorile care apar în cel puțin două liste, fără duplicate.

def in_cel_putin_doua(a, b, c):
    A, B, C = map(set, (a, b, c))
    return (A & B) | (A & C) | (B & C)
foarte simplu

Exercițiul 18

Enunț:

Primește o listă de numere și returnează mulțimea valorilor care nu sunt duplicate.

Vezi rezolvarea
Enunț:

Primește o listă de numere și returnează mulțimea valorilor care nu sunt duplicate.

def unice(a):
    f = {}
    for x in a:
        f[x] = f.get(x, 0) + 1
    return {x for x in f if f[x] == 1}
Foarte foarte simplu

Exercițiul 19

Enunț:

Primește o mulțime de numere și găsește cea mai mare diferență posibilă dintre două elemente distincte.

Vezi rezolvarea
Enunț:

Primește o mulțime de numere și găsește cea mai mare diferență posibilă dintre două elemente distincte.

def diferenta_maxima(s):
    if len(s) < 2:
        return 0
    return max(s) - min(s)
foarte simplu

Exercițiul 20

Enunț:

Primește două mulțimi și returnează un tuplu cu (intersecție, reuniune, diferența A-B).

Vezi rezolvarea
Enunț:

Primește două mulțimi și returnează un tuplu cu (intersecție, reuniune, diferența A-B).

def operatii(a, b):
    return a & b, a | b, a - b
Foarte foarte simplu

Exercițiul 21

Enunț:

Primește o listă de numere și determină dacă toate valorile din listă pot fi împărțite în clase distincte după restul la 3.

Vezi rezolvarea
Enunț:

Primește o listă de numere și determină dacă toate valorile din listă pot fi împărțite în clase distincte după restul la 3.

def toate_clasele(a):
    resturi = {x % 3 for x in a}
    return resturi == {0, 1, 2}

6. Dicționare

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def frecvente(a): d = {} for x in a: d[x] = d.get(x, 0) + 1 return d
  2. 2. def nota_maxima(note): return max(note, key=note.get)
  3. 3. def inverseaza(d): r = {} for k, v in d.items(): r.setdefault(v, []).append(k) return r
  4. 4. def uneste(a, b): r = a.copy() for k, v in b.items(): r[k] = r.get(k, 0) + v return r
  5. 5. def peste_medie(d): if not d: return [] media = sum(d.values()) / len(d) return [k for k, v in d.items() if v > media]
  6. 6. def frecvente_litere(s): d = {} for c in s.lower(): if c.isalpha(): d[c] = d.get(c, 0) + 1 return d
  7. 7. def grupeaza_lungime(cuvinte): d = {} for c in cuvinte: d.setdefault(len(c), []).append(c) return d
  8. 8. def cheie_suma_maxima(d): return max(d, key=lambda k: sum(d[k]))
  9. 9. def fara_negative(d): return {k: v for k, v in d.items() if v >= 0}
  10. 10. def frecvente_cuvinte(text): d = {} for cuvant in text.lower().split(): d[cuvant] = d.get(cuvant, 0) + 1 return d
  11. 11. def medii(elevi): return {nume: sum(note) / len(note) for nume, note in elevi.items() if note}
  12. 12. def top_k(d, k): return sorted(d, key=d.get, reverse=True)[:k]
  13. 13. def frecvente_chei(perechi): d = {} for k, _ in perechi: d[k] = d.get(k, 0) + 1 return d
  14. 14. def aceleasi_chei(a, b): return set(a) == set(b)
  15. 15. def combina_liste(a, b): r = {k: v[:] for k, v in a.items()} for k, v in b.items(): r.setdefault(k, []).extend(v) return r
  16. 16. def patrate(a): return {x: x * x for x in set(a)}
  17. 17. def solduri(tranzactii): d = {} for persoana, suma, tip in tranzactii: d[persoana] = d.get(persoana, 0) d[persoana] += suma if tip == "incasare" else -suma return d
  18. 18. def chei_maxime(d): if not d: return [] m = max(d.values()) return [k for k, v in d.items() if v == m]
  19. 19. def dupa_initiala(cuvinte): d = {} for c in cuvinte: if c: d.setdefault(c[0].lower(), []).append(c) return d
  20. 20. def nr_muchii(graf): return sum(len(vecini) for vecini in graf.values()) // 2

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Construiește dicționarul de frecvențe pentru o listă de numere.

Vezi rezolvarea
Enunț:

Construiește dicționarul de frecvențe pentru o listă de numere.

def frecvente(a):
    d = {}
    for x in a:
        d[x] = d.get(x, 0) + 1
    return d
foarte simplu

Exercițiul 2

Enunț:

Primește un dicționar de note și returnează cheia cu nota maximă.

Vezi rezolvarea
Enunț:

Primește un dicționar de note și returnează cheia cu nota maximă.

def nota_maxima(note):
    return max(note, key=note.get)
Foarte foarte simplu

Exercițiul 3

Enunț:

Inversează un dicționar astfel încât valorile să devină chei; dacă o valoare se repetă, cheia originală este adăugată într-o listă.

Vezi rezolvarea
Enunț:

Inversează un dicționar astfel încât valorile să devină chei; dacă o valoare se repetă, cheia originală este adăugată într-o listă.

def inverseaza(d):
    r = {}
    for k, v in d.items():
        r.setdefault(v, []).append(k)
    return r
foarte simplu

Exercițiul 4

Enunț:

Unește două dicționare; dacă o cheie există în ambele, adună valorile.

Vezi rezolvarea
Enunț:

Unește două dicționare; dacă o cheie există în ambele, adună valorile.

def uneste(a, b):
    r = a.copy()
    for k, v in b.items():
        r[k] = r.get(k, 0) + v
    return r
foarte simplu

Exercițiul 5

Enunț:

Primește un dicționar și returnează cheile ale căror valori sunt peste medie.

Vezi rezolvarea
Enunț:

Primește un dicționar și returnează cheile ale căror valori sunt peste medie.

def peste_medie(d):
    if not d:
        return []
    media = sum(d.values()) / len(d)
    return [k for k, v in d.items() if v > media]
Foarte foarte simplu

Exercițiul 6

Enunț:

Construiește frecvențele literelor dintr-un text, ignorând spațiile și diferența dintre litere mari și mici.

Vezi rezolvarea
Enunț:

Construiește frecvențele literelor dintr-un text, ignorând spațiile și diferența dintre litere mari și mici.

def frecvente_litere(s):
    d = {}
    for c in s.lower():
        if c.isalpha():
            d[c] = d.get(c, 0) + 1
    return d
foarte simplu

Exercițiul 7

Enunț:

Grupează o listă de cuvinte după lungime într-un dicționar.

Vezi rezolvarea
Enunț:

Grupează o listă de cuvinte după lungime într-un dicționar.

def grupeaza_lungime(cuvinte):
    d = {}
    for c in cuvinte:
        d.setdefault(len(c), []).append(c)
    return d
Foarte foarte simplu

Exercițiul 8

Enunț:

Primește un dicționar cu liste de valori și returnează cheia a cărei listă are cea mai mare sumă.

Vezi rezolvarea
Enunț:

Primește un dicționar cu liste de valori și returnează cheia a cărei listă are cea mai mare sumă.

def cheie_suma_maxima(d):
    return max(d, key=lambda k: sum(d[k]))
foarte simplu

Exercițiul 9

Enunț:

Elimină dintr-un dicționar toate perechile cu valoare negativă.

Vezi rezolvarea
Enunț:

Elimină dintr-un dicționar toate perechile cu valoare negativă.

def fara_negative(d):
    return {k: v for k, v in d.items() if v >= 0}
foarte simplu

Exercițiul 10

Enunț:

Numără frecvența cuvintelor dintr-un text.

Vezi rezolvarea
Enunț:

Numără frecvența cuvintelor dintr-un text.

def frecvente_cuvinte(text):
    d = {}
    for cuvant in text.lower().split():
        d[cuvant] = d.get(cuvant, 0) + 1
    return d
Foarte foarte simplu

Exercițiul 11

Enunț:

Primește un dicționar de elevi și liste de note și calculează media fiecărui elev.

Vezi rezolvarea
Enunț:

Primește un dicționar de elevi și liste de note și calculează media fiecărui elev.

def medii(elevi):
    return {nume: sum(note) / len(note) for nume, note in elevi.items() if note}
foarte simplu

Exercițiul 12

Enunț:

Returnează primele k chei după valoarea lor descrescătoare.

Vezi rezolvarea
Enunț:

Returnează primele k chei după valoarea lor descrescătoare.

def top_k(d, k):
    return sorted(d, key=d.get, reverse=True)[:k]
Foarte foarte simplu

Exercițiul 13

Enunț:

Construiește un dicționar de frecvențe pentru perechi (cheie, valoare), numărând de câte ori apare fiecare cheie.

Vezi rezolvarea
Enunț:

Construiește un dicționar de frecvențe pentru perechi (cheie, valoare), numărând de câte ori apare fiecare cheie.

def frecvente_chei(perechi):
    d = {}
    for k, _ in perechi:
        d[k] = d.get(k, 0) + 1
    return d
foarte simplu

Exercițiul 14

Enunț:

Verifică dacă două dicționare au aceleași chei, indiferent de valori.

Vezi rezolvarea
Enunț:

Verifică dacă două dicționare au aceleași chei, indiferent de valori.

def aceleasi_chei(a, b):
    return set(a) == set(b)
Foarte foarte simplu

Exercițiul 15

Enunț:

Combină două dicționare de liste astfel încât pentru cheile comune listele să fie concatenate.

Vezi rezolvarea
Enunț:

Combină două dicționare de liste astfel încât pentru cheile comune listele să fie concatenate.

def combina_liste(a, b):
    r = {k: v[:] for k, v in a.items()}
    for k, v in b.items():
        r.setdefault(k, []).extend(v)
    return r
foarte simplu

Exercițiul 16

Enunț:

Construiește un dicționar care mapează fiecare număr la pătratul său, pentru numerele distincte dintr-o listă.

Vezi rezolvarea
Enunț:

Construiește un dicționar care mapează fiecare număr la pătratul său, pentru numerele distincte dintr-o listă.

def patrate(a):
    return {x: x * x for x in set(a)}
Foarte foarte simplu

Exercițiul 17

Enunț:

Primește un dicționar de tranzacții și calculează soldul fiecărei persoane, adunând încasările și scăzând plățile.

Vezi rezolvarea
Enunț:

Primește un dicționar de tranzacții și calculează soldul fiecărei persoane, adunând încasările și scăzând plățile.

def solduri(tranzactii):
    d = {}
    for persoana, suma, tip in tranzactii:
        d[persoana] = d.get(persoana, 0)
        d[persoana] += suma if tip == "incasare" else -suma
    return d
foarte simplu

Exercițiul 18

Enunț:

Returnează toate cheile cu aceeași valoare maximă.

Vezi rezolvarea
Enunț:

Returnează toate cheile cu aceeași valoare maximă.

def chei_maxime(d):
    if not d:
        return []
    m = max(d.values())
    return [k for k, v in d.items() if v == m]
foarte simplu

Exercițiul 19

Enunț:

Construiește un dicționar care mapează fiecare primă literă la lista cuvintelor care încep cu acea literă.

Vezi rezolvarea
Enunț:

Construiește un dicționar care mapează fiecare primă literă la lista cuvintelor care încep cu acea literă.

def dupa_initiala(cuvinte):
    d = {}
    for c in cuvinte:
        if c:
            d.setdefault(c[0].lower(), []).append(c)
    return d
Foarte foarte simplu

Exercițiul 20

Enunț:

Primește un dicționar de graf reprezentat prin vecinătăți și returnează numărul de muchii distincte pentru un graf neorientat.

Vezi rezolvarea
Enunț:

Primește un dicționar de graf reprezentat prin vecinătăți și returnează numărul de muchii distincte pentru un graf neorientat.

def nr_muchii(graf):
    return sum(len(vecini) for vecini in graf.values()) // 2

7. Recursivitate

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def factorial(n): if n == 0: return 1 return n * factorial(n - 1)
  2. 2. def suma(n): if n == 0: return 0 return n + suma(n - 1)
  3. 3. def numar_cifre(n): if n < 10: return 1 return 1 + numar_cifre(n // 10)
  4. 4. def suma_cifre(n): if n == 0: return 0 return n % 10 + suma_cifre(n // 10)
  5. 5. def palindrom(s): if len(s) <= 1: return True return s[0] == s[-1] and palindrom(s[1:-1])
  6. 6. def cmmdc(a, b): if b == 0: return a return cmmdc(b, a % b)
  7. 7. def putere(a, n): if n == 0: return 1 return a * putere(a, n - 1)
  8. 8. def fibonacci(n): if n <= 1: return n return fibonacci(n - 1) + fibonacci(n - 2)
  9. 9. def numara_pare(a, i=0): if i == len(a): return 0 return (a[i] % 2 == 0) + numara_pare(a, i + 1)
  10. 10. def maxim(a, i=0): if i == len(a) - 1: return a[i] return max(a[i], maxim(a, i + 1))
  11. 11. def suma_lista(a, i=0): if i == len(a): return 0 return a[i] + suma_lista(a, i + 1)
  12. 12. def aparitii(a, x, i=0): if i == len(a): return 0 return (a[i] == x) + aparitii(a, x, i + 1)
  13. 13. def elimina(a, x): if not a: return [] rest = elimina(a[1:], x) return rest if a[0] == x else [a[0]] + rest
  14. 14. def invers(s): if len(s) <= 1: return s return invers(s[1:]) + s[0]
  15. 15. def aparitii_cifra(n, c): if n == 0: return 0 return (n % 10 == c) + aparitii_cifra(n // 10, c)
  16. 16. def toate_pozitive(a, i=0): if i == len(a): return True return a[i] > 0 and toate_pozitive(a, i + 1)
  17. 17. def suma_impare(n): if n <= 0: return 0 return (n if n % 2 else 0) + suma_impare(n - 1)
  18. 18. def prima_pozitie(a, x, i=0): if i == len(a): return -1 if a[i] == x: return i return prima_pozitie(a, x, i + 1)
  19. 19. def trepte(n): if n <= 1: return 1 return trepte(n - 1) + trepte(n - 2)
  20. 20. def binare(n, prefix=""): if n == 0: return [prefix] return binare(n - 1, prefix + "0") + binare(n - 1, prefix + "1")

Rezolvări

foarte simplu

Exercițiul 1

Enunț:

Scrie recursiv o funcție care calculează factorialul lui n.

Vezi rezolvarea
Enunț:

Scrie recursiv o funcție care calculează factorialul lui n.

def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)
foarte simplu

Exercițiul 2

Enunț:

Scrie recursiv suma numerelor de la 1 la n.

Vezi rezolvarea
Enunț:

Scrie recursiv suma numerelor de la 1 la n.

def suma(n):
    if n == 0:
        return 0
    return n + suma(n - 1)
foarte simplu

Exercițiul 3

Enunț:

Scrie recursiv numărul de cifre ale unui număr natural.

Vezi rezolvarea
Enunț:

Scrie recursiv numărul de cifre ale unui număr natural.

def numar_cifre(n):
    if n < 10:
        return 1
    return 1 + numar_cifre(n // 10)
foarte simplu

Exercițiul 4

Enunț:

Scrie recursiv suma cifrelor unui număr natural.

Vezi rezolvarea
Enunț:

Scrie recursiv suma cifrelor unui număr natural.

def suma_cifre(n):
    if n == 0:
        return 0
    return n % 10 + suma_cifre(n // 10)
Foarte foarte simplu

Exercițiul 5

Enunț:

Scrie recursiv verificarea dacă un șir este palindrom.

Vezi rezolvarea
Enunț:

Scrie recursiv verificarea dacă un șir este palindrom.

def palindrom(s):
    if len(s) <= 1:
        return True
    return s[0] == s[-1] and palindrom(s[1:-1])
foarte simplu

Exercițiul 6

Enunț:

Calculează recursiv cel mai mare divizor comun al două numere.

Vezi rezolvarea
Enunț:

Calculează recursiv cel mai mare divizor comun al două numere.

def cmmdc(a, b):
    if b == 0:
        return a
    return cmmdc(b, a % b)
Foarte foarte simplu

Exercițiul 7

Enunț:

Calculează recursiv puterea a^n pentru n natural.

Vezi rezolvarea
Enunț:

Calculează recursiv puterea a^n pentru n natural.

def putere(a, n):
    if n == 0:
        return 1
    return a * putere(a, n - 1)
foarte simplu

Exercițiul 8

Enunț:

Calculează recursiv al n-lea termen Fibonacci, cu F(0)=0 și F(1)=1.

Vezi rezolvarea
Enunț:

Calculează recursiv al n-lea termen Fibonacci, cu F(0)=0 și F(1)=1.

def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
Foarte foarte simplu

Exercițiul 9

Enunț:

Numără recursiv câte elemente dintr-o listă sunt pare.

Vezi rezolvarea
Enunț:

Numără recursiv câte elemente dintr-o listă sunt pare.

def numara_pare(a, i=0):
    if i == len(a):
        return 0
    return (a[i] % 2 == 0) + numara_pare(a, i + 1)
foarte simplu

Exercițiul 10

Enunț:

Găsește recursiv maximul unei liste.

Vezi rezolvarea
Enunț:

Găsește recursiv maximul unei liste.

def maxim(a, i=0):
    if i == len(a) - 1:
        return a[i]
    return max(a[i], maxim(a, i + 1))
Foarte foarte simplu

Exercițiul 11

Enunț:

Calculează recursiv suma elementelor unei liste fără sum().

Vezi rezolvarea
Enunț:

Calculează recursiv suma elementelor unei liste fără sum().

def suma_lista(a, i=0):
    if i == len(a):
        return 0
    return a[i] + suma_lista(a, i + 1)
foarte simplu

Exercițiul 12

Enunț:

Numără recursiv de câte ori apare o valoare într-o listă.

Vezi rezolvarea
Enunț:

Numără recursiv de câte ori apare o valoare într-o listă.

def aparitii(a, x, i=0):
    if i == len(a):
        return 0
    return (a[i] == x) + aparitii(a, x, i + 1)
Foarte foarte simplu

Exercițiul 13

Enunț:

Elimină recursiv toate aparițiile unei valori dintr-o listă și returnează o listă nouă.

Vezi rezolvarea
Enunț:

Elimină recursiv toate aparițiile unei valori dintr-o listă și returnează o listă nouă.

def elimina(a, x):
    if not a:
        return []
    rest = elimina(a[1:], x)
    return rest if a[0] == x else [a[0]] + rest
foarte simplu

Exercițiul 14

Enunț:

Construiește recursiv inversul unui șir.

Vezi rezolvarea
Enunț:

Construiește recursiv inversul unui șir.

def invers(s):
    if len(s) <= 1:
        return s
    return invers(s[1:]) + s[0]
Foarte foarte simplu

Exercițiul 15

Enunț:

Calculează recursiv numărul de apariții ale cifrei c într-un număr.

Vezi rezolvarea
Enunț:

Calculează recursiv numărul de apariții ale cifrei c într-un număr.

def aparitii_cifra(n, c):
    if n == 0:
        return 0
    return (n % 10 == c) + aparitii_cifra(n // 10, c)
foarte simplu

Exercițiul 16

Enunț:

Determină recursiv dacă toate elementele unei liste sunt pozitive.

Vezi rezolvarea
Enunț:

Determină recursiv dacă toate elementele unei liste sunt pozitive.

def toate_pozitive(a, i=0):
    if i == len(a):
        return True
    return a[i] > 0 and toate_pozitive(a, i + 1)
Foarte foarte simplu

Exercițiul 17

Enunț:

Calculează recursiv suma numerelor impare dintre 1 și n.

Vezi rezolvarea
Enunț:

Calculează recursiv suma numerelor impare dintre 1 și n.

def suma_impare(n):
    if n <= 0:
        return 0
    return (n if n % 2 else 0) + suma_impare(n - 1)
foarte simplu

Exercițiul 18

Enunț:

Găsește recursiv prima poziție a unei valori într-o listă; returnează -1 dacă nu există.

Vezi rezolvarea
Enunț:

Găsește recursiv prima poziție a unei valori într-o listă; returnează -1 dacă nu există.

def prima_pozitie(a, x, i=0):
    if i == len(a):
        return -1
    if a[i] == x:
        return i
    return prima_pozitie(a, x, i + 1)
Foarte foarte simplu

Exercițiul 19

Enunț:

Calculează recursiv numărul de moduri de a urca n trepte dacă poți urca 1 sau 2 trepte.

Vezi rezolvarea
Enunț:

Calculează recursiv numărul de moduri de a urca n trepte dacă poți urca 1 sau 2 trepte.

def trepte(n):
    if n <= 1:
        return 1
    return trepte(n - 1) + trepte(n - 2)
Foarte foarte simplu

Exercițiul 20

Enunț:

Generează recursiv toate șirurile binare de lungime n.

Vezi rezolvarea
Enunț:

Generează recursiv toate șirurile binare de lungime n.

def binare(n, prefix=""):
    if n == 0:
        return [prefix]
    return binare(n - 1, prefix + "0") + binare(n - 1, prefix + "1")

8. Probleme de sinteză

20 de exerciții foarte simplu și foarte foarte simplu. Mai întâi sunt afișate toate enunțurile, apoi rezolvările. Pentru fiecare rezolvare, enunțul complet este repetat înaintea codului.

Enunțuri

  1. 1. def analiza(a): return { "suma": sum(a), "minim": min(a), "maxim": max(a), "distincte": len(set(a)) }
  2. 2. def ordonare_frecventa(a): f = {} for x in a: f[x] = f.get(x, 0) + 1 return sorted(f, key=lambda x: (-f[x], x))
  3. 3. def exact_doua_litere(s): f = {} for c in s.lower(): if c.isalpha(): f[c] = f.get(c, 0) + 1 return {c for c, nr in f.items() if nr == 2}
  4. 4. def medie_note(perechi): note = dict(perechi) return sum(note.values()) / len(note) if note else 0
  5. 5. def compara(a, b): A, B = set(a), set(b) return A & B, A ^ B, A | B
  6. 6. def suma_cifre(n): if n == 0: return 0 return n % 10 + suma_cifre(n // 10) def divizibil_9(n): return suma_cifre(abs(n)) % 9 == 0
  7. 7. def frecvente_tuplu(t): d = {} for x in t: d[x] = d.get(x, 0) + 1 return d
  8. 8. def top_trei(cuvinte): distincte = set(cuvinte) return tuple((c, len(c)) for c in sorted(distincte, key=lambda x: (-len(x), x))[:3])
  9. 9. def diagonala_si_frecvente(m): t = tuple(m[i][i] for i in range(min(len(m), len(m[0])))) f = {} for x in t: f[x] = f.get(x, 0) + 1 return set(t), f
  10. 10. def crescatoare(a, i=1): if i == len(a): return True return a[i-1] < a[i] and crescatoare(a, i + 1)
  11. 11. def pozitii(a): d = {} for i, x in enumerate(a): if x not in d: d[x] = [i, i] else: d[x][1] = i return {x: tuple(p) for x, p in d.items()}
  12. 12. def statistica_comuna(a, b): c = set(a) & set(b) return sum(c), len(c)
  13. 13. def grupeaza_litere(cuvinte): d = {} for c in cuvinte: cheie = tuple(sorted(set(c.lower()))) d.setdefault(cheie, []).append(c) return d
  14. 14. def statistici_cifre(n): def cifre(x): if x < 10: return 1, x nr, s = cifre(x // 10) return nr + 1, s + x % 10 return cifre(abs(n))
  15. 15. def categorii(a): return { "pare": {x for x in a if x % 2 == 0}, "impare": {x for x in a if x % 2 != 0}, "negative": {x for x in a if x < 0} }
  16. 16. def agregare(perechi): d = {} for k, v in perechi: d[k] = d.get(k, 0) + v return d
  17. 17. def cifre_tuplu(n): if n < 10: return (n,) return cifre_tuplu(n // 10) + (n % 10,)
  18. 18. def analiza_lista(a): f = {} for x in a: f[x] = f.get(x, 0) + 1 distincte = set(a) duplicate = {x for x in distincte if f[x] > 1} return distincte, duplicate, f
  19. 19. def cheie_medie_maxima(d): medii = {k: sum(v) / len(v) for k, v in d.items() if v} return min(medii, key=lambda k: (-medii[k], k))
  20. 20. def moduri(n): if n == 0: return 1 if n < 0: return 0 return moduri(n - 1) + moduri(n - 2) + moduri(n - 5)

Rezolvări

Foarte foarte simplu

Exercițiul 1

Enunț:

Scrie o funcție care primește o listă și returnează un dicționar cu suma, minimul, maximul și numărul valorilor distincte.

Vezi rezolvarea
Enunț:

Scrie o funcție care primește o listă și returnează un dicționar cu suma, minimul, maximul și numărul valorilor distincte.

def analiza(a):
    return {
        "suma": sum(a),
        "minim": min(a),
        "maxim": max(a),
        "distincte": len(set(a))
    }
Foarte foarte simplu

Exercițiul 2

Enunț:

Primește o listă de numere și returnează valorile ordonate după frecvență descrescătoare, apoi după valoare crescătoare.

Vezi rezolvarea
Enunț:

Primește o listă de numere și returnează valorile ordonate după frecvență descrescătoare, apoi după valoare crescătoare.

def ordonare_frecventa(a):
    f = {}
    for x in a:
        f[x] = f.get(x, 0) + 1
    return sorted(f, key=lambda x: (-f[x], x))
Foarte foarte simplu

Exercițiul 3

Enunț:

Primește un șir și construiește un dicționar cu frecvența literelor, apoi returnează mulțimea literelor care apar de exact două ori.

Vezi rezolvarea
Enunț:

Primește un șir și construiește un dicționar cu frecvența literelor, apoi returnează mulțimea literelor care apar de exact două ori.

def exact_doua_litere(s):
    f = {}
    for c in s.lower():
        if c.isalpha():
            f[c] = f.get(c, 0) + 1
    return {c for c, nr in f.items() if nr == 2}
Foarte foarte simplu

Exercițiul 4

Enunț:

Primește o listă de perechi (nume, notă), construiește un dicționar de note și returnează media notelor.

Vezi rezolvarea
Enunț:

Primește o listă de perechi (nume, notă), construiește un dicționar de note și returnează media notelor.

def medie_note(perechi):
    note = dict(perechi)
    return sum(note.values()) / len(note) if note else 0
Foarte foarte simplu

Exercițiul 5

Enunț:

Primește două liste și determină elementele comune, distincte și elementele exclusive, folosind mulțimi.

Vezi rezolvarea
Enunț:

Primește două liste și determină elementele comune, distincte și elementele exclusive, folosind mulțimi.

def compara(a, b):
    A, B = set(a), set(b)
    return A & B, A ^ B, A | B
Foarte foarte simplu

Exercițiul 6

Enunț:

Scrie o funcție care folosește recursivitate pentru a calcula suma cifrelor și apoi folosește rezultatul pentru a verifica dacă numărul este divizibil cu 9.

Vezi rezolvarea
Enunț:

Scrie o funcție care folosește recursivitate pentru a calcula suma cifrelor și apoi folosește rezultatul pentru a verifica dacă numărul este divizibil cu 9.

def suma_cifre(n):
    if n == 0:
        return 0
    return n % 10 + suma_cifre(n // 10)
def divizibil_9(n):
    return suma_cifre(abs(n)) % 9 == 0
Foarte foarte simplu

Exercițiul 7

Enunț:

Primește un tuplu de numere și returnează un dicționar cu frecvențele valorilor distincte.

Vezi rezolvarea
Enunț:

Primește un tuplu de numere și returnează un dicționar cu frecvențele valorilor distincte.

def frecvente_tuplu(t):
    d = {}
    for x in t:
        d[x] = d.get(x, 0) + 1
    return d
Foarte foarte simplu

Exercițiul 8

Enunț:

Primește o listă de cuvinte și returnează un tuplu cu (cuvânt, lungime) pentru cele mai lungi trei cuvinte distincte.

Vezi rezolvarea
Enunț:

Primește o listă de cuvinte și returnează un tuplu cu (cuvânt, lungime) pentru cele mai lungi trei cuvinte distincte.

def top_trei(cuvinte):
    distincte = set(cuvinte)
    return tuple((c, len(c)) for c in sorted(distincte, key=lambda x: (-len(x), x))[:3])
Foarte foarte simplu

Exercițiul 9

Enunț:

Primește o matrice și returnează mulțimea valorilor de pe diagonala principală și dicționarul frecvențelor lor.

Vezi rezolvarea
Enunț:

Primește o matrice și returnează mulțimea valorilor de pe diagonala principală și dicționarul frecvențelor lor.

def diagonala_si_frecvente(m):
    t = tuple(m[i][i] for i in range(min(len(m), len(m[0]))))
    f = {}
    for x in t:
        f[x] = f.get(x, 0) + 1
    return set(t), f
Foarte foarte simplu

Exercițiul 10

Enunț:

Scrie o funcție recursivă care verifică dacă o listă este strict crescătoare.

Vezi rezolvarea
Enunț:

Scrie o funcție recursivă care verifică dacă o listă este strict crescătoare.

def crescatoare(a, i=1):
    if i == len(a):
        return True
    return a[i-1] < a[i] and crescatoare(a, i + 1)
Foarte foarte simplu

Exercițiul 11

Enunț:

Primește o listă și construiește un dicționar care pentru fiecare valoare păstrează tuplul (prima poziție, ultima poziție).

Vezi rezolvarea
Enunț:

Primește o listă și construiește un dicționar care pentru fiecare valoare păstrează tuplul (prima poziție, ultima poziție).

def pozitii(a):
    d = {}
    for i, x in enumerate(a):
        if x not in d:
            d[x] = [i, i]
        else:
            d[x][1] = i
    return {x: tuple(p) for x, p in d.items()}
Foarte foarte simplu

Exercițiul 12

Enunț:

Primește două liste de numere și returnează un tuplu cu suma elementelor comune distincte și numărul lor.

Vezi rezolvarea
Enunț:

Primește două liste de numere și returnează un tuplu cu suma elementelor comune distincte și numărul lor.

def statistica_comuna(a, b):
    c = set(a) & set(b)
    return sum(c), len(c)
Foarte foarte simplu

Exercițiul 13

Enunț:

Primește o listă de cuvinte și grupează-le într-un dicționar după mulțimea literelor lor distincte, reprezentată ca tuplu sortat.

Vezi rezolvarea
Enunț:

Primește o listă de cuvinte și grupează-le într-un dicționar după mulțimea literelor lor distincte, reprezentată ca tuplu sortat.

def grupeaza_litere(cuvinte):
    d = {}
    for c in cuvinte:
        cheie = tuple(sorted(set(c.lower())))
        d.setdefault(cheie, []).append(c)
    return d
Foarte foarte simplu

Exercițiul 14

Enunț:

Calculează recursiv numărul de cifre și folosește-l pentru a returna un tuplu (număr_cifre, sumă_cifre).

Vezi rezolvarea
Enunț:

Calculează recursiv numărul de cifre și folosește-l pentru a returna un tuplu (număr_cifre, sumă_cifre).

def statistici_cifre(n):
    def cifre(x):
        if x < 10:
            return 1, x
        nr, s = cifre(x // 10)
        return nr + 1, s + x % 10
    return cifre(abs(n))
Foarte foarte simplu

Exercițiul 15

Enunț:

Primește o listă de numere și returnează un dicționar care separă valorile în cheile 'pare', 'impare' și 'negative'.

Vezi rezolvarea
Enunț:

Primește o listă de numere și returnează un dicționar care separă valorile în cheile 'pare', 'impare' și 'negative'.

def categorii(a):
    return {
        "pare": {x for x in a if x % 2 == 0},
        "impare": {x for x in a if x % 2 != 0},
        "negative": {x for x in a if x < 0}
    }
Foarte foarte simplu

Exercițiul 16

Enunț:

Primește o listă de tupluri (cheie, valoare) și construiește un dicționar în care fiecare cheie are suma valorilor asociate.

Vezi rezolvarea
Enunț:

Primește o listă de tupluri (cheie, valoare) și construiește un dicționar în care fiecare cheie are suma valorilor asociate.

def agregare(perechi):
    d = {}
    for k, v in perechi:
        d[k] = d.get(k, 0) + v
    return d
Foarte foarte simplu

Exercițiul 17

Enunț:

Scrie o funcție recursivă care transformă un număr în tuplul cifrelor sale, de la prima la ultima.

Vezi rezolvarea
Enunț:

Scrie o funcție recursivă care transformă un număr în tuplul cifrelor sale, de la prima la ultima.

def cifre_tuplu(n):
    if n < 10:
        return (n,)
    return cifre_tuplu(n // 10) + (n % 10,)
Foarte foarte simplu

Exercițiul 18

Enunț:

Primește o listă și returnează un tuplu (distincte, duplicate, frecvențe), folosind mulțimi și dicționare.

Vezi rezolvarea
Enunț:

Primește o listă și returnează un tuplu (distincte, duplicate, frecvențe), folosind mulțimi și dicționare.

def analiza_lista(a):
    f = {}
    for x in a:
        f[x] = f.get(x, 0) + 1
    distincte = set(a)
    duplicate = {x for x in distincte if f[x] > 1}
    return distincte, duplicate, f
Foarte foarte simplu

Exercițiul 19

Enunț:

Primește un dicționar de liste de numere și returnează cheia cu cea mai mare medie, iar la egalitate cheia mai mică lexicografic.

Vezi rezolvarea
Enunț:

Primește un dicționar de liste de numere și returnează cheia cu cea mai mare medie, iar la egalitate cheia mai mică lexicografic.

def cheie_medie_maxima(d):
    medii = {k: sum(v) / len(v) for k, v in d.items() if v}
    return min(medii, key=lambda k: (-medii[k], k))
Foarte foarte simplu

Exercițiul 20

Enunț:

Rezolvă recursiv problema: câte moduri există de a obține suma n folosind monedele 1, 2 și 5, considerând ordinea importantă.

Vezi rezolvarea
Enunț:

Rezolvă recursiv problema: câte moduri există de a obține suma n folosind monedele 1, 2 și 5, considerând ordinea importantă.

def moduri(n):
    if n == 0:
        return 1
    if n < 0:
        return 0
    return moduri(n - 1) + moduri(n - 2) + moduri(n - 5)