# Exercice 1 def create(): return [] def is_empty(s): return len(s) == 0 def size(s): return len(s) def push(x, s): s.append(x) return s def pop(s): return s.pop() def peek(s): return s[-1] # Exercice 2 def check(s): pile = create() for c in s: # Pour chaque parenthèse ouvrante, on empile # Pour chaque parenthèse fermante, on dépile if c == '(': push(0, pile) if c == ')': # On véritfie la taille if size(pile) == 0: return False pop(pile) # À la fin, la pile doit être vide return size(pile) == 0 check('(())()(())') # True check('(())()(()') # False # Exercice 4 def multi_check(s): pile = create() for c in s: # Pour chaque ( ou [, on empile # Pour chaque ] ou ), on dépile en vérifiant le parenthésage if c == '[' or c == '(': push(c, pile) else: if size(pile) == 0: return False top = pop(pile) if (top == '(' and c == ']') or (top == '[' and c == ')'): return False # À la fin, la pile doit être vide return size(pile) == 0 multi_check('([]())') # True multi_check('([(]))') # False # Exos sur les listes def somme(l): return reduce(lambda acc, e: acc+e, l) def maximum(l): m = l[0] return reduce(lambda acc, e: max(acc, e), l) def fst(l): return map(lambda e: e[0], l) def permute(l): return map(lambda e: 0 if e == 1 else 1, l) def compte0(l): return reduce(lambda acc, e: acc + (1 if e == 0 else 0), l, 0) # Retourne la taille de la plus grande suite de v dans l # On utilise un triplet comme accumulateur pour stocker la valeur précédente, le conteur actuel et le maximum # <|°_°|> def pgs(v, l): def f((last, count, maxcount), e): if e == last == v: return (e, count+1, max(maxcount, count+1)) else: return (e, 1, max(maxcount, 1)) return reduce(f, l, (l[0], 0, 0))[2] # Version courte def prg(v, l): return reduce(lambda (last, count, maxcount), e: (e, count+1, max(maxcount, count+1)) if e == last == v else (e, 1, max(1, maxcount)), l, (l[0], 0, 0))[2] pgs(6, [3,3,3,4,4,5,6,2,2,2,2,2,0,0]) # 1 pgs(3, [3,3,3,4,4,5,6,2,2,2,2,2,0,0]) # 3 pgs(2, [3,3,3,4,4,5,6,2,2,2,2,2,0,0]) # 5