Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tc_info:tp1 [2018/09/13 10:17] – rsicre | tc_info:tp1 [2019/09/19 11:30] (Version actuelle) – edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ==== Environnement de travail ==== | ||
+ | |||
+ | * __Tutoriels__ : | ||
+ | * Unix : | ||
+ | * {{https:// | ||
+ | * [[public: | ||
+ | * Python : | ||
+ | * {{https:// | ||
+ | * [[public: | ||
+ | * Java : | ||
+ | * [[public: | ||
+ | * Coder mieux : | ||
+ | * {{https:// | ||
+ | |||
+ | * __Environnements de programmation__: | ||
+ | * {{https:// | ||
+ | * {{https:// | ||
+ | |||
+ | |||
+ | |||
+ | ====== A savoir ====== | ||
+ | |||
+ | * Si tu n'est pas à l'aise en Python: {{https:// | ||
+ | * Installer et configurer PyCharm: {{https:// | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | Donc si tu n'est pas à l'aise en Python: {{https:// | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====== TP ====== | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Pycharm (l' | ||
+ | |||
+ | |||
+ | Le but de ce TP est de vous dérouiller les méninges en algorithmie en essayant de résoudre le problème du [[https:// | ||
+ | |||
+ | ===== Lire un sudoku ===== | ||
+ | |||
+ | Pour nous, un sudoku sera une liste de 9*9 nombres allant de 1 à 9 constituée de la concaténation de chaque ligne : | ||
+ | <code python> | ||
+ | grille_1_complete = [5, 2, 9, 6, 7, 1, 8, 4, 3, | ||
+ | 3, 1, 8, 4, 9, 2, 6, 5, 7, | ||
+ | 6, 7, 4, 8, 5, 3, 2, 1, 9, | ||
+ | 7, 4, 6, 3, 2, 5, 1, 9, 8, | ||
+ | 2, 9, 3, 1, 8, 6, 4, 7, 5, | ||
+ | 1, 8, 5, 7, 4, 9, 3, 6, 2, | ||
+ | 4, 3, 2, 5, 6, 7, 9, 8, 1, | ||
+ | 9, 6, 7, 2, 1, 8, 5, 3, 4, | ||
+ | 8, 5, 1, 9, 3, 4, 7, 2, 6] | ||
+ | </ | ||
+ | |||
+ | ==== Un élément particulier ==== | ||
+ | On vous demande de commencer par écrire une fonction ('' | ||
+ | |||
+ | <code python> | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | ==== Accéder aux lignes, colonnes et sous-matrices ==== | ||
+ | |||
+ | Ecrivez 3 fonctions permettant de rendre une ligne, une colonne ou une sous-matrice particulière sous forme de liste. | ||
+ | Les commandes ci-après : | ||
+ | <code python> | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Afficheront : | ||
+ | <code python> | ||
+ | ligne 4 [2, 9, 3, 1, 8, 6, 4, 7, 5] | ||
+ | colonne 5 [1, 2, 3, 5, 6, 9, 7, 8, 4] | ||
+ | sous-matrice contenant 4, 5 [3, 2, 5, 1, 8, 6, 7, 4, 9] | ||
+ | </ | ||
+ | |||
+ | ===== Sudoku correct ? ===== | ||
+ | |||
+ | Utilisez les fonctions d' | ||
+ | |||
+ | Faites des tests avec des sudokus correct et des sudoku incorrect. Pour ma part : | ||
+ | <code python> | ||
+ | print(" | ||
+ | </ | ||
+ | répond : | ||
+ | <code python> | ||
+ | sudoku correct ? True | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Afficher un sudoku ===== | ||
+ | |||
+ | Finalement, affichons le sudoku complet. Laissez libre court à votre imagination. Pour ma part, la commande : | ||
+ | <code python> | ||
+ | affiche_sudoku(grille_1_complete) | ||
+ | </ | ||
+ | affiche : | ||
+ | <code python> | ||
+ | 529 671 843 | ||
+ | 318 492 657 | ||
+ | 674 853 219 | ||
+ | |||
+ | 746 325 198 | ||
+ | 293 186 475 | ||
+ | 185 749 362 | ||
+ | |||
+ | 432 567 981 | ||
+ | 967 218 534 | ||
+ | 851 934 726 | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Sudoku Incomplet ===== | ||
+ | |||
+ | On remplacera par des 0 les nombres inconnus. La variable ci-après est par exemple un sudoku incomplet de la grille précédente : | ||
+ | <code python> | ||
+ | grille_1 = [0, 0, 0, 0, 0, 0, 0, 4, 0, | ||
+ | 0, 0, 8, 4, 0, 2, 0, 5, 7, | ||
+ | 0, 0, 4, 8, 0, 3, 2, 1, 0, | ||
+ | 7, 4, 0, 0, 0, 5, 0, 9, 0, | ||
+ | 2, 0, 3, 1, 0, 6, 4, 0, 5, | ||
+ | 0, 8, 0, 7, 0, 0, 0, 6, 2, | ||
+ | 0, 3, 2, 5, 0, 7, 9, 0, 0, | ||
+ | 9, 6, 0, 2, 0, 8, 5, 0, 0, | ||
+ | 0, 5, 0, 0, 0, 0, 0, 0, 0] | ||
+ | </ | ||
+ | |||
+ | Ecrivez 3 méthodes permettant de rendre pour une ligne, une colonne ou une sous-matrice particulière un ensemble de valeurs manquantes. | ||
+ | |||
+ | Ainsi, les commandes : | ||
+ | <code python> | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Affichent chez moi : | ||
+ | <code python> | ||
+ | valeurs manquantes ligne 5 {1, 3, 4, 5, 9} | ||
+ | valeurs manquantes colonne 5 {1, 9, 4} | ||
+ | valeurs manquantes sous-matrice issue de 5, 5 {8, 9, 2, 3, 4} | ||
+ | </ | ||
+ | |||
+ | ==== Valeurs manquantes ==== | ||
+ | En déduire une fonction permettant de donner les valeurs possibles pour une case donnée (en ne prenant en compte que les valeurs manquantes). Par exemple : | ||
+ | <code python> | ||
+ | print(" | ||
+ | </ | ||
+ | Affiche : | ||
+ | <code python> | ||
+ | possible en 5, 5: {9, 4} | ||
+ | </ | ||
+ | |||
+ | ==== Complète ce qui est unique ==== | ||
+ | |||
+ | Il n'y a qu'une seule possibilité pour la case (3, 3), Laquelle ? Ecrivez une fonction qui remplit toutes les cases à une unique possibilité. Cette fonction doit rendre un sudoku que l'on espère complet, ou au pire qui ne contient que des valeurs incomplètes ayant plus d'un choix. | ||
+ | |||
+ | Chez moi : | ||
+ | <code python> | ||
+ | grille_1_complet_1_possible = rempli_sudoku_possible(grille_1) | ||
+ | affiche_sudoku(grille_1_complet_1_possible) | ||
+ | |||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | Affiche : | ||
+ | <code python> | ||
+ | 020 000 040 | ||
+ | 018 402 057 | ||
+ | 074 803 210 | ||
+ | |||
+ | 740 325 090 | ||
+ | 293 186 475 | ||
+ | 080 700 062 | ||
+ | |||
+ | 032 507 980 | ||
+ | 960 208 530 | ||
+ | 050 000 020 | ||
+ | |||
+ | valeurs manquantes (3, 2) {1, 6} | ||
+ | valeurs manquantes (3, 6) {8, 1} | ||
+ | valeurs manquantes (3, 8) {8, 1} | ||
+ | </ | ||
+ | |||
+ | Ce n'est donc pas fini, mais on a un peu avancé. | ||
+ | |||
+ | ===== Sudoku Incomplet v2===== | ||
+ | |||
+ | Améliorez votre remplisseur de sudoku. Je n'ai utilisé qu'une règle supplémentaire pour le résoudre complètement. En regardant la ligne 3 par exemple on voit qu'il y a 3 " | ||
+ | |||
+ | En ne rajoutant que ce test sur les lignes, le code suivant : | ||
+ | <code python> | ||
+ | soluce = rempli_sudoku_possible_v2(grille_1) | ||
+ | affiche_sudoku(soluce) | ||
+ | print(soluce == grille_1_complete) | ||
+ | </ | ||
+ | |||
+ | Affiche : | ||
+ | <code python> | ||
+ | 529 671 843 | ||
+ | 318 492 657 | ||
+ | 674 853 219 | ||
+ | |||
+ | 746 325 198 | ||
+ | 293 186 475 | ||
+ | 185 749 362 | ||
+ | |||
+ | 432 567 981 | ||
+ | 967 218 534 | ||
+ | 851 934 726 | ||
+ | |||
+ | True | ||
+ | </ | ||
+ | |||
+ | ===== Résolution complète ===== | ||
+ | |||
+ | Le code écrit précédemment ne permet que de résoudre des sudoku très simples. Pour résoudre tout les sudokus possibles, il faut mettre en place des techniques de [[https:// | ||