add exo monday

This commit is contained in:
2024-11-30 21:20:08 +01:00
parent 8f80a875bf
commit 338db4ab8c
13 changed files with 68 additions and 0 deletions

28
recursivite/TD1.py Normal file
View File

@@ -0,0 +1,28 @@
def factorielle(number: int):
if number == 0:
return 1
else:
return number * factorielle(number-1)
def modulo(a, b):
if b-a < 0:
return b
elif b == 0:
return b
else:
return modulo(a,b-a)
def somme(n):
if n == 0:
return n
else:
return(n+somme(n-1))
def init_quotient(a,b):
i = 0
return (quotient(a,b,i))
def quotient(a,b,i):
if b == 0 or b-a < 0:
return i
else:
return(quotient(a,b-a,i+1))
print(init_quotient(6,18))

View File

@@ -0,0 +1,29 @@
from sort_list import sort_list
def dichotomie(liste: list, element: any,bypass_sorting = False)->bool:
"""This function return return True if element is in liste False else
Args:
liste (list): the array to examinate
element (any): the element to find into liste
bypass_sorting (bool, optional):If True, skips sorting the list. Defaults to False.
Returns:
bool: True if present False else
"""
if liste == []:
return False
assert type(element) == type(liste[0]), "Wrong type between liste and element" # On estime que la liste contient un seul et unique type...
if bypass_sorting == False:
liste = sort_list(liste)
N, start, find,i = len(liste)-1, 0, False, 0
end = N
while (find != True) and (start <= end):
middle = (start + end)//2
if liste[middle] == element:
find = True
elif element > liste[middle]:
start = middle+1
else:
end = middle - 1
return find

View File

@@ -0,0 +1,17 @@
def sort_list(liste: list) -> list:
"""this function sort a liste
Args:
liste (list): the list to sort
Returns:
list: the list sorted
"""
for i in range(len(liste)):
min_index = i
for j in range(i + 1, len(liste)):
if liste[j] < liste[min_index]:
min_index = j
liste[i], liste[min_index] = liste[min_index], liste[i]
return liste

View File

@@ -0,0 +1,56 @@
from main import dichotomie
def tester():
liste1 = [1,2,3,4,5,6,7,8,9,10]
liste2 = liste1[:-1]
liste3 = [7,4,1,8,5,2,9,6,3,0]
liste3_2 = [7,7,7,7,7,7,7,8]
liste4 = []
liste5 = [1]
liste6 = [1.0,2.0,3.1,4.2,8.6,8.3]
liste7 = [-1,-2,-2,-3,-4]
liste8 = list("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
liste9 = [i for i in range(1,100000)]
assert dichotomie(liste1, 5) == True, "Test échoué : 5 devrait être dans liste1"
assert dichotomie(liste1, 11) == False, "Test échoué : 11 ne devrait pas être dans liste1"
# Tests pour liste2
assert dichotomie(liste2, 9) == True, "Test échoué : 9 devrait être dans liste2"
assert dichotomie(liste2, 10) == False, "Test échoué : 10 ne devrait pas être dans liste2"
# Tests pour liste3
assert dichotomie(liste3, 8) == True, "Test échoué : 8 devrait être dans liste3"
assert dichotomie(liste3, 11) == False, "Test échoué : 11 ne devrait pas être dans liste3"
# Tests pour liste3_2
assert dichotomie(liste3_2, 7) == True, "Test échoué : 7 devrait être dans liste3_2"
assert dichotomie(liste3_2, 10) == False, "Test échoué : 10 ne devrait pas être dans liste3_2"
# Tests pour liste4
assert dichotomie(liste4, 1) == False, "Test échoué : Liste vide, 1 ne devrait pas être dans liste4"
assert dichotomie(liste4, 0) == False, "Test échoué : Liste vide, 0 ne devrait pas être dans liste4"
# Tests pour liste5
assert dichotomie(liste5, 1) == True, "Test échoué : 1 devrait être dans liste5"
assert dichotomie(liste5, 2) == False, "Test échoué : 2 ne devrait pas être dans liste5"
# Tests pour liste6
assert dichotomie(liste6, 3.1) == True, "Test échoué : 3.1 devrait être dans liste6"
assert dichotomie(liste6, 5.5) == False, "Test échoué : 5.5 ne devrait pas être dans liste6"
# Tests pour liste7
assert dichotomie(liste7, -3) == True, "Test échoué : -3 devrait être dans liste7"
assert dichotomie(liste7, 0) == False, "Test échoué : 0 ne devrait pas être dans liste7"
# Tests pour liste8
assert dichotomie(liste8, "L") == True, "Test échoué : 'L' devrait être dans liste8"
assert dichotomie(liste8, "Z") == False, "Test échoué : 'Z' ne devrait pas être dans liste8"
# Tests pour liste9
assert dichotomie(liste9, 99999, True) == True, "Test échoué : 99999 devrait être dans liste9" # bypass = True because sorting_list is very slow
assert dichotomie(liste9, 0,True) == False, "Test échoué : 5 ne devrait pas être dans liste9"# bypass = True because sorting_list is very slow
print("Tous les tests ont réussi !")
if __name__ == '__main__':
tester()

View File

@@ -0,0 +1,28 @@
from typing import Any
def est_triee(liste: list)->bool:
if len(liste) <= 1:
return True
index = 0
while (index < len(liste) - 1) and (liste[index]<=liste[index + 1]):
index+=1
return index>= len(liste) - 1
def search(liste:list, element:Any):
assert est_triee(liste), "Pas de recherche sur une liste non triee"
def aux(liste, element):
if len(liste) == 0:
return True
else:
pivot = liste[len(liste)//2]
if pivot == element:
return True
if element < pivot:
return aux(liste[len(liste)//2], element)
return aux(liste[len(liste)//3 + 1:], element)
return aux(liste,element)
print(search([1,2,3],2))

View File

@@ -0,0 +1,37 @@
from sort_list import sort_list
from typing import Any
def dichotomie(liste: list[Any], element: Any, start: int = 0, end: int = None, bypass_sorting: bool = False) -> int:
"""Performs a dichotomy search to determine if an element exists in a list or not.
Args:
liste (list[Any]): The list in which to search for the element.
element (Any): The element to search for.
start (int, optional): The starting index of the sublist to search. Defaults to 0.
end (int, optional): The ending index of the sublist to search. Defaults to None.
bypass_sorting (bool, optional): If True, skips sorting the list. Defaults to False.
Returns:
int: retourne l'indexe de l'element si il est trouver
"""
if not liste:
return -1
assert isinstance(element, type(liste[0])), "Wrong type between liste and element"
if not bypass_sorting:
liste = sort_list(liste)
if end is None:
end = len(liste) - 1
if start > end:
return -1
middle = (start + end) // 2
if liste[middle] == element:
return middle
elif element < liste[middle]:
return dichotomie(liste, element, start, middle - 1, bypass_sorting=True) # bypass_sorting because it's already done
else:
return dichotomie(liste, element, middle + 1, end, bypass_sorting=True) # bypass_sorting because it's already done

View File

@@ -0,0 +1,17 @@
def sort_list(liste: list) -> list:
"""this function sort a liste
Args:
liste (list): the list to sort
Returns:
list: the list sorted
"""
for i in range(len(liste)):
min_index = i
for j in range(i + 1, len(liste)):
if liste[j] < liste[min_index]:
min_index = j
liste[i], liste[min_index] = liste[min_index], liste[i]
return liste

View File

@@ -0,0 +1,80 @@
from main import dichotomie
def tester():
liste1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
liste2 = liste1[:-1]
liste3 = [7, 4, 1, 8, 5, 2, 9, 6, 3, 0]
liste3_2 = [7, 7, 7, 7, 7, 7, 7, 8]
liste4 = []
liste5 = [1]
liste6 = [1.0, 2.0, 3.1, 4.2, 8.6, 8.3]
liste7 = [-1, -2, -2, -3, -4]
liste8 = list("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
liste9 = [i for i in range(1, 100000)]
# Tests pour liste1
assert dichotomie(liste1, 5) == 4, "Test échoué : 5 devrait être à l'index 4 dans liste1"
print("Test n°1 réussi")
assert dichotomie(liste1, 11) == -1, "Test échoué : 11 ne devrait pas être dans liste1"
print("Test n°2 réussi")
# Tests pour liste2
assert dichotomie(liste2, 9) == 8, "Test échoué : 9 devrait être à l'index 8 dans liste2"
print("Test n°3 réussi")
assert dichotomie(liste2, 10) == -1, "Test échoué : 10 ne devrait pas être dans liste2"
print("Test n°4 réussi")
'''
# Tests pour liste3 (tri nécessaire)
assert dichotomie(liste3, 8) == 7, "Test échoué : 8 devrait être à l'index 7 après tri dans liste3"
print("Test n°5 réussi")
assert dichotomie(liste3, 11) == -1, "Test échoué : 11 ne devrait pas être dans liste3"
print("Test n°6 réussi")
'''
# Tests pour liste3_2
assert dichotomie(liste3_2, 7) == 3, "Test échoué : 7 devrait être dans liste3_2"
print("Test n°7 réussi")
assert dichotomie(liste3_2, 10) == -1, "Test échoué : 10 ne devrait pas être dans liste3_2"
print("Test n°8 réussi")
# Tests pour liste4
print(dichotomie(liste4,1))
assert dichotomie(liste4, 1) == -1, "Test échoué : Liste vide, 1 ne devrait pas être dans liste4"
print("Test n°9 réussi")
assert dichotomie(liste4, 0) == -1, "Test échoué : Liste vide, 0 ne devrait pas être dans liste4"
print("Test n°10 réussi")
# Tests pour liste5
assert dichotomie(liste5, 1) == 0, "Test échoué : 1 devrait être à l'index 0 dans liste5"
print("Test n°11 réussi")
assert dichotomie(liste5, 2) == -1, "Test échoué : 2 ne devrait pas être dans liste5"
print("Test n°12 réussi")
# Tests pour liste6
assert dichotomie(liste6, 3.1) == 2, "Test échoué : 3.1 devrait être à l'index 2 dans liste6"
print("Test n°13 réussi")
assert dichotomie(liste6, 5.5) == -1, "Test échoué : 5.5 ne devrait pas être dans liste6"
print("Test n°14 réussi")
# Tests pour liste7 (tri nécessaire)
assert dichotomie(liste7, -3) == 1, "Test échoué : -3 devrait être à l'index 1 après tri dans liste7"
print("Test n°15 réussi")
assert dichotomie(liste7, 0) == -1, "Test échoué : 0 ne devrait pas être dans liste7"
print("Test n°16 réussi")
# Tests pour liste8
assert dichotomie(liste8, "A") == 0, "Test échoué : 'L' devrait être à l'index 0 dans liste8"
print("Test n°17 réussi")
assert dichotomie(liste8, "Z") == -1, "Test échoué : 'Z' ne devrait pas être dans liste8"
print("Test n°18 réussi")
# Tests pour liste9 (tri déjà fait)
assert dichotomie(liste9, 99999, bypass_sorting=True) == 99998, "Test échoué : 99999 devrait être à l'index 99998 dans liste9"
print("Test n°19 réussi")
assert dichotomie(liste9, 0, bypass_sorting=True) == -1, "Test échoué : 0 ne devrait pas être dans liste9"
print("Test n°20 réussi")
print("Tous les tests ont réussi !")
if __name__ == '__main__':
tester()

View File

@@ -0,0 +1,38 @@
from sort_list import sort_list
from typing import Any
def dichotomie(liste: list[Any], element: Any, start: int = 0, end: int = None, bypass_sorting: bool = False) -> bool:
"""Performs a dichotomy search to determine if an element exists in a list or not.
Args:
liste (list[Any]): The list in which to search for the element.
element (Any): The element to search for.
start (int, optional): The starting index of the sublist to search. Defaults to 0.
end (int, optional): The ending index of the sublist to search. Defaults to None.
bypass_sorting (bool, optional): If True, skips sorting the list. Defaults to False.
Returns:
bool: True if the element is found, False otherwise.
"""
if not liste:
return False
assert isinstance(element, type(liste[0])), "Wrong type between liste and element"
if not bypass_sorting:
liste = sort_list(liste)
if end is None:
end = len(liste) - 1
if start > end:
return False
middle = (start + end) // 2
if liste[middle] == element:
return True
elif element < liste[middle]:
return dichotomie(liste, element, start, middle - 1, bypass_sorting=True) # bypass_sorting because it's already done
else:
return dichotomie(liste, element, middle + 1, end, bypass_sorting=True) # bypass_sorting because it's already done

View File

@@ -0,0 +1,17 @@
def sort_list(liste: list) -> list:
"""this function sort a liste
Args:
liste (list): the list to sort
Returns:
list: the list sorted
"""
for i in range(len(liste)):
min_index = i
for j in range(i + 1, len(liste)):
if liste[j] < liste[min_index]:
min_index = j
liste[i], liste[min_index] = liste[min_index], liste[i]
return liste

View File

@@ -0,0 +1,78 @@
from main import dichotomie
def tester():
liste1 = [1,2,3,4,5,6,7,8,9,10]
liste2 = liste1[:-1]
liste3 = [7,4,1,8,5,2,9,6,3,0]
liste3_2 = [7,7,7,7,7,7,7,8]
liste4 = []
liste5 = [1]
liste6 = [1.0,2.0,3.1,4.2,8.6,8.3]
liste7 = [-1,-2,-2,-3,-4]
liste8 = list("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
liste9 = [i for i in range(1,100000)]
# Tests pour liste1
assert dichotomie(liste1, 5) == True, "Test échoué : 5 devrait être dans liste1"
print("Test n°1 done")
assert dichotomie(liste1, 11) == False, "Test échoué : 11 ne devrait pas être dans liste1"
print("Test n°2 done")
# Tests pour liste2
assert dichotomie(liste2, 9) == True, "Test échoué : 9 devrait être dans liste2"
print("Test n°3 done")
assert dichotomie(liste2, 10) == False, "Test échoué : 10 ne devrait pas être dans liste2"
print("Test n°4 done")
# Tests pour liste3
assert dichotomie(liste3, 8) == True, "Test échoué : 8 devrait être dans liste3"
print("Test n°5 done")
assert dichotomie(liste3, 11) == False, "Test échoué : 11 ne devrait pas être dans liste3"
print("Test n°6 done")
# Tests pour liste3_2
assert dichotomie(liste3_2, 7) == True, "Test échoué : 7 devrait être dans liste3_2"
print("Test n°7 done")
assert dichotomie(liste3_2, 10) == False, "Test échoué : 10 ne devrait pas être dans liste3_2"
print("Test n°8 done")
# Tests pour liste4
assert dichotomie(liste4, 1) == False, "Test échoué : Liste vide, 1 ne devrait pas être dans liste4"
print("Test n°9 done")
assert dichotomie(liste4, 0) == False, "Test échoué : Liste vide, 0 ne devrait pas être dans liste4"
print("Test n°10 done")
# Tests pour liste5
assert dichotomie(liste5, 1) == True, "Test échoué : 1 devrait être dans liste5"
print("Test n°11 done")
assert dichotomie(liste5, 2) == False, "Test échoué : 2 ne devrait pas être dans liste5"
print("Test n°12 done")
# Tests pour liste6
assert dichotomie(liste6, 3.1) == True, "Test échoué : 3.1 devrait être dans liste6"
print("Test n°13 done")
assert dichotomie(liste6, 5.5) == False, "Test échoué : 5.5 ne devrait pas être dans liste6"
print("Test n°14 done")
# Tests pour liste7
assert dichotomie(liste7, -3) == True, "Test échoué : -3 devrait être dans liste7"
print("Test n°15 done")
assert dichotomie(liste7, 0) == False, "Test échoué : 0 ne devrait pas être dans liste7"
print("Test n°16 done")
# Tests pour liste8
assert dichotomie(liste8, "L") == True, "Test échoué : 'L' devrait être dans liste8"
print("Test n°17 done")
assert dichotomie(liste8, "Z") == False, "Test échoué : 'Z' ne devrait pas être dans liste8"
print("Test n°18 done")
# Tests pour liste9
assert dichotomie(liste9, 99999, bypass_sorting=True) == True, "Test échoué : 99999 devrait être dans liste9"
print("Test n°19 done")
assert dichotomie(liste9, 0, bypass_sorting=True) == False, "Test échoué : 0 ne devrait pas être dans liste9"
print("Test n°20 done")
print("Tous les tests ont reussi !")
if __name__ == '__main__':
tester()

View File

@@ -0,0 +1,12 @@
def is_palindrom(word)->bool:
word = list(word)
if len(word) < 2:
return True
if word[0] == word[-1]:
word.pop(0)
word.pop(-1)
return is_palindrom(word)
else:
return False
print(is_palindrom("do geese see god".replace(' ', '')))

View File

@@ -0,0 +1,68 @@
### D'après WIKIPEDIA
def racine_raphson(number: float, precision: float) -> float:
assert number > 0, "La racine du nombre n'est pas réelle."
y = (number / 3)+ 1
diff = precision + 1
while diff > precision:
y_next = (y + number / y) / 2.0
diff = abs(y_next - y)
y = y_next
return y
if __name__ == "__main__":
print(racine_raphson(36, 0.000000000000001)**2 == 36)
def dichotomie(liste: list[any], element: any, start: int = 0, end: int = None, bypass_sorting: bool = False) -> int:
"""Recherche la partie entière de la racine carrée d'un nombre en utilisant une recherche dichotomique.
Args:
liste (list[any]): Liste de nombres simulée pour la recherche.
element (any): Le nombre dont on cherche la racine carrée entière.
start (int, optional): Index de départ. Defaults to 0.
end (int, optional): Index de fin. Defaults to None.
bypass_sorting (bool, optional): Ignoré dans cette version.
Returns:
int: La partie entière de la racine carrée.
"""
if end is None:
end = len(liste) - 1
if start > end:
return end # Retourne la partie entière trouvée.
middle = (start + end) // 2
squared = middle * middle
if squared == element:
return middle
elif squared < element:
return dichotomie(liste, element, middle + 1, end, bypass_sorting=True)
else:
return dichotomie(liste, element, start, middle - 1, bypass_sorting=True)
def racine_dich(number: int) -> int:
"""
Calcul de la partie entière de la racine carrée d'un nombre entier.
Args:
number (int): Nombre dont on cherche la racine carrée.
Returns:
int: La partie entière de la racine carrée.
"""
assert number >= 0, "Le nombre doit être positif ou nul."
liste = [i for i in range(number // 2 + 2)] # Simule une "liste" pour la dichotomie
return dichotomie(liste, number)
if __name__ == "__main__":
print(racine_dich(36)) # Retourne 6
print(racine_dich(20)) # Retourne 4
print(racine_dich(0)) # Retourne 0
print(racine_dich(1)) # Retourne 1