# 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
Comments