Compare commits

...

2 Commits

Author SHA1 Message Date
0dcccd2b74 updated test imports
All checks were successful
Python unit tests / unittests (push) Successful in 4s
2025-01-28 17:32:57 +01:00
35f194f649 completed README
Some checks failed
Python unit tests / unittests (push) Failing after 4s
2025-01-28 17:28:24 +01:00
10 changed files with 54 additions and 47 deletions

View File

@@ -12,24 +12,24 @@ Voici mes réponses pour l'examen 2025 d'_Algorithmes et Structures de données_
<table>
<tr>
<td><strong>But</strong></td>
<td>...</td>
<td>Compter le nombre de valeurs positives différentes ayant leur opposé dans une liste</td>
</tr>
<tr>
<td><strong>Input</strong></td>
<td>...</td>
<td>La liste des demi-touches (entiers relatifs non-nuls)</td>
</tr>
<tr>
<td><strong>Output</strong></td>
<td>...</td>
<td>Le nombre de touches distinctes dont les valeurs positives et négatives sont dans la liste</td>
</tr>
<tr>
<td><strong>Signature</strong></td>
<td>
```python
def function1(
*args
) -> Any:
def countKey(
pieces: list[int]
) -> int:
```
</td>
@@ -46,24 +46,26 @@ def function1(
<table>
<tr>
<td><strong>But</strong></td>
<td>...</td>
<td>Trouver le chemin le plus court entre deux points, en considérant que certaines routes ne sont praticables que de nuit/jour</td>
</tr>
<tr>
<td><strong>Input</strong></td>
<td>...</td>
<td>Nœud de départ (index), nœud d'arrivée (index) et liste des routes / arêtes (nœud 1, nœud 2, restriction)</td>
</tr>
<tr>
<td><strong>Output</strong></td>
<td>...</td>
<td>Liste des nœuds (index) à parcourir</td>
</tr>
<tr>
<td><strong>Signature</strong></td>
<td>
```python
def function2(
*args
) -> Any:
def findSafestPath(
start: int,
end: int,
intersections: list[tuple[int, int, int]]
) -> list[int]:
```
</td>
@@ -80,24 +82,25 @@ def function2(
<table>
<tr>
<td><strong>But</strong></td>
<td>...</td>
<td>Trouver dans un réseau de console un sous-graphe connexe de taille donnée</td>
</tr>
<tr>
<td><strong>Input</strong></td>
<td>...</td>
<td>Taille n du sous-graphe recherché, liste des connexions</td>
</tr>
<tr>
<td><strong>Output</strong></td>
<td>...</td>
<td>Liste de n consoles toutes interconnectées</td>
</tr>
<tr>
<td><strong>Signature</strong></td>
<td>
```python
def function3(
*args
) -> Any:
def findTightlyLinkedConsoles(
n: int,
consoles: list[tuple[int, int]]
) -> list[int]:
```
</td>
@@ -114,24 +117,26 @@ def function3(
<table>
<tr>
<td><strong>But</strong></td>
<td>...</td>
<td>Compter le nombre de séquences de N coups infligeant un total de H dégâts</td>
</tr>
<tr>
<td><strong>Input</strong></td>
<td>...</td>
<td>Nombre N de coups dans la séquence, nombre C de coups possibles (dégâts 1 à C inclus), total H de dégâts</td>
</tr>
<tr>
<td><strong>Output</strong></td>
<td>...</td>
<td>Nombre de séquences possibles</td>
</tr>
<tr>
<td><strong>Signature</strong></td>
<td>
```python
def function4(
*args
) -> Any:
def computeNbrOfDifferentSequences(
N: int,
C: int,
H: int
) -> int:
```
</td>
@@ -148,24 +153,26 @@ def function4(
<table>
<tr>
<td><strong>But</strong></td>
<td>...</td>
<td>Trouver les placements de pièces Minitris formant un rectangle plein</td>
</tr>
<tr>
<td><strong>Input</strong></td>
<td>...</td>
<td>Largeur de la grille, longueur de la grille, liste des pièces à poser</td>
</tr>
<tr>
<td><strong>Output</strong></td>
<td>...</td>
<td>Liste des positions des pièces</td>
</tr>
<tr>
<td><strong>Signature</strong></td>
<td>
```python
def function5(
*args
) -> Any:
def playMinitrisFastAndWell(
board_width: int,
board_height: int,
pieces: list[tuple[tuple[int,int], tuple[int,int]]]
) -> list[list[int, int]]:
```
</td>

View File

@@ -28,7 +28,7 @@ list = []
"""
def countKey(pieces: list[int])->int:
def countKey(pieces: list[int]) -> int:
pieces = sorted(pieces)
complete: int = 0

View File

@@ -12,7 +12,7 @@ point d'arrivée, tel que les routes marquées 1 ne soient parcourues que de jou
seulement de nuit (index impair). En plus des routes données, nous pouvons aussi
rester sur un même nœud pour une nuit.
Afin de bien gérer les différences d'états entre jour et nuit, nous pouvons intégrer le demi-jour
associé à chaque visite de nœud. Ainsi, une même intersection peut avoir deux nœud:
associé à chaque visite de nœud. Ainsi, une même intersection peut avoir deux nœuds :
un pour une visite de jour, et un de nuit.
Pour résoudre ce problème, comme nous ne pouvons pas établir d'heuristique mesurant
@@ -93,4 +93,4 @@ def findSafestPath(start: int, end: int, intersections: list[tuple[int, int, int
if __name__ == '__main__':
print(findSafestPath(0,2,[(0, 1, -1), (1, 2, 0)]) == [0, 0, 1, 2])
print(findSafestPath(0, 5, [(0,1,0), (0,2,1), (2,1,-1), (1,3,-1), (2,4,-1), (3,5,1), (3,4,0), (4,5,-1)]) == [0, 1, 3, 5])
print(findSafestPath(0, 5, [(0, 1, 0), (0, 2, 1), (2, 1, -1), (1, 3, -1), (2, 4, -1), (3, 5, 1), (3, 4, 0), (4, 5, -1)]) == [0, 1, 3, 5])

View File

@@ -6,7 +6,7 @@ Explications:
Comme indiqué dans la donnée de l'exercice, il s'agit ici de trouvé un sous-graphe
connexe dans un graphe quelconque de consoles interconnectées
Pour ce faire nous pouvons procéder ainsi:
Pour ce faire, nous pouvons procéder ainsi :
Étape 1 :
- Compter le nombre de voisins de chaque nœud (console)
- Éliminer ceux ayant moins de voisins que la taille de sous-graphe recherché
@@ -20,10 +20,10 @@ Pour ce faire nous pouvons procéder ainsi:
Étape 2 :
- Pour chaque nœud du graphe :
- Calculer l'ensemble des nœuds communs entre ses voisins (et lui-même),
et les voisins des ses voisins (et eux-mêmes)'
C'est-à-dire, si N1 et un nœuds et nb(N1) = {N2, N3, ...} est l'ensemble de ses voisins,
et les voisins de ses voisins (et eux-mêmes)'
C'est-à-dire, si N1 est un nœud et nb(N1) = {N2, N3, ...} est l'ensemble de ses voisins,
on cherche l'intersection de {N1} U nb(N1), {N2} U nb(N2), {N3} U nb(N3), etc.
- Si c'est ensemble contient au moins n éléments, il s'agit alors d'un sous-graphe connexe.
- Si cet ensemble contient au moins n éléments, il s'agit alors d'un sous-graphe connexe.
On peut ainsi en extraire les n premiers nœuds comme résultat
"""
@@ -71,6 +71,6 @@ def findTightlyLinkedConsoles(n: int, consoles: list[tuple[int, int]]) -> list[i
if __name__ == '__main__':
print(findTightlyLinkedConsoles(3,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3)]) == [1,2,3])
print(findTightlyLinkedConsoles(4,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3)]) == [])
print(findTightlyLinkedConsoles(4,[(0,1),(0,4),(2,1),(3,1),(4,2),(2,3),(1,4),(4,3)]) == [1,2,3,4])
print(findTightlyLinkedConsoles(3, [(0, 1), (0, 4), (2, 1), (3, 1), (4, 2), (2, 3)]) == [1, 2, 3])
print(findTightlyLinkedConsoles(4, [(0, 1), (0, 4), (2, 1), (3, 1), (4, 2), (2, 3)]) == [])
print(findTightlyLinkedConsoles(4, [(0, 1), (0, 4), (2, 1), (3, 1), (4, 2), (2, 3), (1, 4), (4, 3)]) == [1, 2, 3, 4])

View File

@@ -14,7 +14,7 @@ le calcul récursif puisque cela évite de calculer les états partagés (sous-b
identiques)
Bonus :
Nous cherchons la valeur N la plus petite telle que:
Nous cherchons la valeur N la plus petite telle que :
`computeNbrOfDifferentSequences(N, 5, 100) > 2^16`
"""
@@ -72,4 +72,4 @@ def bonus():
if __name__ == '__main__':
print(computeNbrOfDifferentSequences(1, 6, 3) == 1)
print(computeNbrOfDifferentSequences(2, 6, 7) == 6)
print(bonus())
#print(bonus())

View File

@@ -1,6 +1,6 @@
import unittest
from Ex1 import countKey
from src.Ex1 import countKey
class MyTestCase(unittest.TestCase):

View File

@@ -1,6 +1,6 @@
import unittest
from Ex2 import findSafestPath
from src.Ex2 import findSafestPath
class MyTestCase(unittest.TestCase):

View File

@@ -1,6 +1,6 @@
import unittest
from Ex3 import findTightlyLinkedConsoles
from src.Ex3 import findTightlyLinkedConsoles
class MyTestCase(unittest.TestCase):

View File

@@ -1,6 +1,6 @@
import unittest
from Ex4 import computeNbrOfDifferentSequences
from src.Ex4 import computeNbrOfDifferentSequences
class MyTestCase(unittest.TestCase):

View File

@@ -1,6 +1,6 @@
import unittest
from Ex5 import playMinitrisFastAndWell
from src.Ex5 import playMinitrisFastAndWell
class MyTestCase(unittest.TestCase):