# E3aV-S05-INFO-ALGO - Algorithmique et structure de données
## EVAL
### Questions
https://hackmd.io/V5aMWRABRN6MUw6t5558Hg
### Réponses
https://docs.google.com/forms/d/e/1FAIpQLScy2Ia_oTBEW-giDYS34mi0zgMbl5aVvtcsyhcDqeoGAKMTvw/viewform
### Dépot projet
https://docs.google.com/forms/d/e/1FAIpQLScxXj9GF-ICvrkCEVWRxTsYrTF2L5QxxQKVmDyTEuUQ0dQf8w/viewform?usp=publish-editor
## Généralités
### Algorithmique et programmation structurée
### Séance 1 et 2
Cours introduction -> [cours 1](https://drive.google.com/file/d/1J6o984hpf4hU937SWKUwxUTfmaEmmMXc/view?usp=drive_link)
Cours structures avancées ->[cours 2](https://drive.google.com/file/d/13JUAuEGG2b6-NyfWN95PUjch2w3pQG5t/view?usp=drive_link)
Le document ci-dessus présente le contenu du cours structures de données avancées: Liste, Pile, File et Arbre.
La bible du python-> [ici](https://drive.google.com/file/d/0B9fj93mCrxamVXRGazBMMXEzS28/view?usp=drive_link&resourcekey=0-nXcNw7dniYcYjPZPecPShQ)
En English -> [ici](https://github.com/manish-old/ebooks-2/blob/master/O'Reilly%20-%20Learning%20Python%204th%20Edition.pdf)
Pour analyser vos codes -> pythontutor.com
## Tri à bulle
{%youtube h00xRb-L8Zs%}
Tri par selection
<iframe width="1535" height="835" src="https://www.youtube.com/embed/qpeeRU_K90k" title="Tri par sélection" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
Tri par insertion
<iframe width="1535" height="835" src="https://www.youtube.com/embed/pzxSlJVprkc" title="Tri par insertion" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
RECAP
https://github.com/MachineLearnia/Python-Machine-Learning/
### Seance 3
TP : -> [TP Algorithmes de base ](https://drive.google.com/file/d/1WvI3sXN1nBexem7atRsyae02iM2wd3Z9/view?usp=drive_link)
TP : -> [Pour les trop rapide -- (turtle+takuzu)](https://drive.google.com/file/d/1mojIr24v9cAouHOR5vQ3kdUbgpOPQl0F/view?usp=drive_link)
Code triangle imbriqué
```python
from turtle import *
width(5)
up()
goto(-100,-100)
down()
for i in range(3):
color("blue")
forward(256)
left(120)
for j in range(3):
color("red")
forward(128)
left(120)
for k in range(3):
color("green")
forward(64)
left(120)
# for i in range(3):
# color("orange")
# forward(32)
# left(120)
```
Code Takuzu
```python
# le titre suffit a comprendre ce que fait la fonction :-)
def initTakuzuCorrect () :
matrice = list ([[0, 1, 1, 0],
[1, 0, 0, 1],
[0, 0, 1, 1],
[1, 1, 0, 0]] )
return matrice
# le titre suffit a comprendre ce que fait la fonction :-)
def initTakuzuNonCorrect () :
matrice = list ([[0, 1, 1, 1],
[1, 0, 0, 1],
[0, 0, 1, 1],
[1, 1, 0, 0]] )
return matrice
matrice=initTakuzuCorrect ()
print (matrice)
```
TP : -> [Pour les plus fort -- (Pong)](https://drive.google.com/file/d/1sZ6Q4KkHF-lsLrg1zZs77236YGe1y6Q9/view?usp=drive_link)
```python
def effaceEcran ():
for i in range (1,100) :
print("\n")
# Initialise la grille de facon a ce qu'elle contienne ce qui se trouve
# a la figure de droite
def initGrille (grille, pos_balle_x, pos_balle_y) :
.........
# Affiche le rectangle d'etoiles et la balle (tout ceci en meme
# temps et non pas le rectangle puis la balle...)
def afficheGrille (grille) :
.........
# Calcule la nouvelle position de la balle en fonction de
# l'ancienne position de la balle (old_pos_balle_x, old_pos_balle_y)
# et du vecteur de deplacement (deplacement_x, deplacement_y).
# supprime l'ancienne position de la balle et place cette dernière
# a la nouvelle position
def modifiePositionBalle (grille, pos_balle_x, pos_balle_y, deplacement_x, deplacement_y) :
theo_pos_x=0
theo_pos_y=0;
# On efface l'ancienne balle
grille[pos_balle_x][pos_balle_y]=' '
print ("Position actuelle : (",str(pos_balle_x)," , ",str(pos_balle_y),")")
print ("Deplacement actuel : (",str(deplacement_x)," , ",str(deplacement_y),")")
# On calcule la future position theorique de la balle
theo_pos_x = pos_balle_x + deplacement_x
theo_pos_y = pos_balle_y + deplacement_y
# En fonction de la position theorique de la balle
# si elle tape sur la bordure,
# on modifie le vecteur de deplacement
if (grille[theo_pos_x][theo_pos_y]=='*') :
# Si on tape sur l'axe vertical
if (( theo_pos_x == 0 ) or ( theo_pos_x == 9 )) :
deplacement_x = - deplacement_x
# Si on tape sur l'axe horizontal
if (( theo_pos_y == 0 ) or ( theo_pos_y == 9 )) :
deplacement_y = - deplacement_y
# On calcule la nouvelle position de la balle
pos_balle_x = .........
pos_balle_y = .........
print ("Nouvelle position : (",str(pos_balle_x)," , ",str(pos_balle_y),")")
# On met la balle dans la grille a sa nouvelle position
grille[pos_balle_x][pos_balle_y]=.........
return grille, pos_balle_x, pos_balle_y, deplacement_x, deplacement_y
##################################
# programme principal :
##################################
grille= [[' ' for i in range(10)] for j in range(10)] # grille qui pourra contenir
# 3 sortes de caractères : '*' ou 'O' ou le caractere espace ' '
pos_balle_x=3 # position balle au depart
pos_balle_y=4
deplacement_x=1
deplacement_y=1; # vecteur de deplacement de la balle
initGrille (grille, pos_balle_x, pos_balle_y) ;
s='*'
while (s!='s') :
effaceEcran ()
afficheGrille(grille);
grille, pos_balle_x, pos_balle_y, deplacement_x, deplacement_y = modifiePositionBalle (grille, pos_balle_x, pos_balle_y, deplacement_x, deplacement_y)
s=input("Appuyez sur la touche entrée ou 's' pour sortir... ")
```
Ce qui donne

# Exercices 1
> [color=#d1a823]
:information_source:
> Exercice 1:
> Écrire une fonction qui supprime les doublons d'une liste.
> Exercice 2 :
> Écrire un programme qui affiche un petit calendrier de la semaine lorsqu'on lui fournit
> en argument la date du dimanche. Si on entre 29,4,18 (29 avril 2018), ce programme
> doit nous afficher Lundi 30 avril 2018, Mardi 1 mai 2018, ..., Dimanche 6 mai 2018.
> Exercice 3 :
> Écrire un programme qui renvoie une main de N cartes prises au hasard dans un jeu de
> 32 cartes.
> Par exemple, avec N=2, on devrait pouvoir obtenir [As de Trèfle, Dix de Pique].
| Critères de notation | |
| -------- | -------- |
| -> Document à rendre au format ipynb (notebook - jupyter) avec le nom des participants (max 3) | |
| -> Respect des consignes| |
| -> Code commenté, clair et concis | |
| -> Nom des variables compréhenibles et en lien avec la donnée traitée| |
| -> Présentation de plusieurs solutions possibles avec explication des différences.| |
# Exercices 2
> [color=#d1a823]
:information_source:
> Exercice 1:
> Finir l'exercice sur le takuzu
| Critères de notation | |
| -------- | -------- |
| -> Document à rendre au format ipynb (notebook - jupyter) | |
| -> Respect des consignes| |
| -> Code commenté, clair et concis | |
| -> Nom des variables compréhenibles et en lien avec la donnée traitée| |
| -> Présentation de plusieurs solutions possibles avec explication des différences.| |
# Les classes
[Classe python](/4dvs1NgWQVKUz-GE9MRLfw)
# Exercices 3
> [color=#d1a823]
:information_source:
> Exercice 1:
> Refaire l'exercice du pong en utilisant les classes
> Exercice 2:
> Rajouter 1 balle au jeu
> Exercice 3:
> Rajouter encore 1 balle au jeu
> Exercice 4:
> Comment traiter le cas de colision entre les balles
# Projet
----
> [color=#d1a823]
:information_source:
>[Mini projet Blokus](https://drive.google.com/file/d/1KObUlAKy7vzNDswVuHgBcblEGAhqZVeU/view?usp=drive_link)
[Règle du jeu](https://drive.google.com/file/d/1vLCwUUriw4-CUdqEZPY1Rx2VyhbebtqV/view?usp=drive_link)
[une these sur le sujet](https://teaching.bb-ai.net/Student-Projects/project-reports/Games/Sharon-Mathew-Blokus-project-report.pdf)
[Consigne de rendu (document à rendre)](https://hackmd.io/@YSaVczpYQySlUnehD8yxvw/BykA9KjVp)
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/139794342?badge=0&autopause=0&player_id=0&app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Blokus, la règle du jeu en 5 mn"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
Pour la gestion des couleurs
-----
```python
class colors:
reset = '\033[0m'
bold = '\033[01m'
disable = '\033[02m'
underline = '\033[04m'
reverse = '\033[07m'
strikethrough = '\033[09m'
invisible = '\033[08m'
class fg:
black = '\033[30m'
red = '\033[31m'
green = '\033[32m'
orange = '\033[33m'
blue = '\033[34m'
purple = '\033[35m'
cyan = '\033[36m'
lightgrey = '\033[37m'
darkgrey = '\033[90m'
lightred = '\033[91m'
lightgreen = '\033[92m'
yellow = '\033[93m'
lightblue = '\033[94m'
pink = '\033[95m'
lightcyan = '\033[96m'
class bg:
black = '\033[40m'
red = '\033[41m'
green = '\033[42m'
orange = '\033[43m'
blue = '\033[44m'
purple = '\033[45m'
cyan = '\033[46m'
lightgrey = '\033[47m'
#print(colors.bg.green, "SKk", colors.fg.red, "Amartya")
#print(colors.bg.lightgrey, "SKk", colors.fg.red, "Amartya")
print( colors.fg.red, "Amartya")
```
Client
------
```python
import asyncio
import json
grille_tetris = [[0] * 10 for _ in range(20)]
def placerPiece(posX,posY,pieces,grille):
bloc_L = [
[1, 0, 0],
[1, 1, 1]
]
x, y = posX, posY
for i in range(len(bloc_L)):
for j in range(len(bloc_L[0])):
grille[y + i][x + j] = bloc_L[i][j]
return grille
def afficheGrille () :
for ligne in grille_tetris:
ligne_formattee = ["#" if cellule == 1 else "." for cellule in ligne]
print("".join(ligne_formattee))
def convert(x):
if x=='A':return 10
elif x=='B':return 11
elif x=='C':return 12
elif x=='D':return 13
elif x=='E':return 14
elif x=='F':return 15
elif x=='G':return 16
elif x=='H':return 17
elif x=='I':return 18
elif x=='J':return 19
else : return int(x)
s='*'
piece='line'
async def send_receive_matrix(reader, writer):
round=1
while True:
s=input("Appuyez sur la touche entrée ou 's' pour sortir... ")
if round==1:
# Modifier la matrice (ajout d'une valeur)
#matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix = grille_tetris
else :
x=convert(s[0:1])
y=convert(s[2:3])
matrix=placerPiece(x,y,piece,matrix)
#matrix= matrix
matrix_json = json.dumps(matrix)
writer.write(matrix_json.encode())
print("Matrice envoyée au serveur")
for row in matrix:
print(row)
await writer.drain()
data = await reader.read(1024)
matrix_json = data.decode()
matrix = json.loads(matrix_json)
print("Matrice reçue du serveur :")
for row in matrix:
print(row)
round +=1
async def main():
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
await send_receive_matrix(reader, writer)
writer.close()
await writer.wait_closed()
asyncio.run(main())
```
Sever
------
```python
import asyncio
import json
grille_tetris = [[0] * 10 for _ in range(20)]
def placerPiece(posX,posY,pieces,grille):
bloc_L = [
[1, 0, 0],
[1, 1, 1]
]
x, y = posX, posY
for i in range(len(bloc_L)):
for j in range(len(bloc_L[0])):
grille[y + i][x + j] = bloc_L[i][j]
return grille
def afficheGrille () :
for ligne in grille_tetris:
ligne_formattee = ["#" if cellule == 1 else "." for cellule in ligne]
print("".join(ligne_formattee))
def convert(x):
if x=='A':return 10
elif x=='B':return 11
elif x=='C':return 12
elif x=='D':return 13
elif x=='E':return 14
elif x=='F':return 15
elif x=='G':return 16
elif x=='H':return 17
elif x=='I':return 18
elif x=='J':return 19
else : return int(x)
s='*'
piece='line'
async def handle_client(reader, writer):
round=1
while True:
data = await reader.read(1024)
if not data:
break
matrix_json = data.decode()
matrix = json.loads(matrix_json)
print("Matrice reçue du client :")
for row in matrix:
print(row)
s=input("Appuyez sur la touche entrée ou 's' pour sortir... ")
# Modifier la matrice (ajout d'une valeur)
x=convert(s[0:1])
y=convert(s[2:3])
matrix=placerPiece(x,y,piece,matrix)
#matrix[1][1] +=round
matrix_json = json.dumps(matrix)
writer.write(matrix_json.encode())
await writer.drain()
print("Matrice modifiée renvoyée au client")
for row in matrix:

print(row)
round +=1
writer.close()
async def main():
server = await asyncio.start_server(
handle_client, '127.0.0.1', 8888)
addr = server.sockets[0].getsockname()
print(f'Serveur en attente de connexions sur {addr}')
async with server:
await server.serve_forever()
asyncio.run(main())
```
