PRÉSENTATION DE SUDOKUSC Comment réaliser un programme capable de compléter n'importe quelle grille de Sudoku ? - L'algorithme utilisé (la méthode) - Son.

Slides:



Advertisements
Présentations similaires
Le point sur l’incubateur
Advertisements

Copyright © 2006 – ESUP-Portail ESUP-Days, Paris, 22 juin 2006 Le cycle de vie des projets Ou comment contribuer au projet ESUP-Portail.
Argc et argv Utilisation des paramètres de la ligne de commande.
Places of worship. Qu’est-ce que c’est? –C’est une mosquée. C’est le mosquée de Washington,D.C. Les muselmans vont au mosquée le vendredi.
Developpement Process « Coding party !! » Tony Carnal Altran.
Le débogage Semaine 12 Version A15. Plan de leçon - Débogage  Commentaire javadoc  Définition  Fonctionnement  Point d’arrêt  Exécution  Contrôler.
Outils logiciel pour la programmation en C. 2 Automatiser la compilation : make make est un utilitaire présent dans toute les distribution de linux >
Qu'est-ce qu'un Logiciel Libre ?. Un logiciel libre est un logiciel tel que toute personne qui en possède une copie a le droit de l'utiliser, de l'étudier,
Qu'est ce que le logiciel libre ?. Qu'est-ce qu'un logiciel ? ● C'est une application informatique qui répond à un besoin : traitement de texte, navigateur.
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
SPIP Un logiciel libre pour la gestion d'un site web d'informations SPIP.
CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
CINI – Li115 1 Semaine 3 Boucles (suite), tirages aléatoires, bibliothèque graphique ● Imbrication d'instructions if et for ● Boucles for imbriquées ●
CINI – Li115 1 Semaine 6 Les fonctions ● Pourquoi écrire des fonctions ? ● Définition de fonctions ● Fonction main ● Appels de fonctions ● Portée des variables.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Types et opérations fondamentales ● Tests ● Boucles ● Pointeurs, références.
Libre, OpenSource kézako ? Thomas Petazzoni Mercredi 28 Mars.
Algorithmique ‘’ Un algorithme est une suite finie et non-ambiguë d’instructions permettant de donner la réponse à un problème. ‘’ Niveau de difficulté.
Semaine 01 La programmation créative Introduction.
UE2 - M22 Licence acoustique
Tableaux en C Mardi 2/05.
Interfaçage entre Maple et du code externe
L’ordinateur et ses composants
JAVA.
Exercice 8 : Déterminez l’algorithme permettant à votre calculatrice de donner les racines de n’importe quel polynôme de degré 2.
Introduction au Langage Pascal
Cours de programmation en langage C (Norme ANSI)
Langage C Structure d'un programme Types Lire Ecrire Tester
« Un langage de programmation est une convention pour donner des ordres à un ordinateur. Ce n’est pas censé être obscur, bizarre et plein de pièges subtils.
Eléments d’Informatique Cours11 – Allocation dynamique, listes chaînées Catherine Recanati.
Allocation dynamique de mémoire
Opérateurs Toute donnée informatique est stockée en mémoire sous la forme d'une combinaison de bits (mot machine). Les opérateurs bits permettent de modifier.
Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne
Résolution de grilles Slither Link
Techniques de décomposition
Semaine #1 INF130 par Frédérick Henri.
Javadoc et débogueur Semaine 03 Version A17.
AO (Architecture des ordinateurs)
AO (Architecture des ordinateurs)
pensez à nettoyer vos scripts !
Principes de programmation (suite)
Installer linux sur VMware
de toute série statistique
Semaine 11 Les pointeurs (suite)
Arguments de la ligne de commande
Un Algorithme , c'est Quoi ?
Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne
HTML & css.
Algorithmique & Langage C IUT GEII S1 Notes de cours (deuxième partie)
De l’ordinateur au processus : rôle d’un système
Cours 8 5. Appels de fonctions Le matériel Concepts de pile
Programmation en C++ C++ de base
1 RECURSIVITE PRESENTATION Ch. PAUL ALGORITHMIQUE Présentation de la récursivité.
Plus de 4000 langages....
L’ordinateur Exposé par Marin
Eléments de base du langage C
Exercice : le jeu. Vous devez concevoir l’algorithme permettant de jouer avec votre calculatrice : elle détermine au hasard un nombre caché entier entre.
02- Evaluation Access 2003 Cette évaluation comporte des QCM (1 seule réponse) et des Zones à déterminer dans des copies d’écran.
Le Java premiers pas.
Test 2.
Exercice : Soient les fonctions définies sur N ( ensemble des entiers naturels donc positifs ) par : f(x) = - 2x + 6 ; g(x) = x + 1 ; k(x) = la plus.
Le programme informatique L’algorithme Le codage
CSI 3505 Algorithmes Voraces
Flowchart Itération Cours 04.
Cours 8 5. Appels de fonctions Le matériel Concepts de pile
Chapter 11: Récursivité Java Software Solutions Second Edition
Python Nicolas THIBAULT
Eléments de base du langage C
Enchantonslecole.fr.
PROGRAMMATION SOUS R. PRESENTE PAR : ACHETTOU ISMAIL LAARICH TARIQ ENCADRE PAR : Pr. EXPOSÉ SUR LA PROGRAMMATION SUR R 2.
Transcription de la présentation:

PRÉSENTATION DE SUDOKUSC Comment réaliser un programme capable de compléter n'importe quelle grille de Sudoku ? - L'algorithme utilisé (la méthode) - Son implémentation dans un programme (la programmation) - Le résultat final (le programme) Copyright (c) 2006 AMARILLI Antoine. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

Choix d'une méthode Quels critères permettent de choisir la méthode de résolution à utiliser ? - Simplicité (répétition d'une procédure simple) - Rigueur (l'ordinateur ne travaille pas au feeling) - Exhaustivité (pouvoir résoudre toutes les grilles) - Rapidité (aussi optimisé que possible) Image de Splintax sur Wikimedia Commons, licence GNU GFDL

L'algorithme de sudokusc (1) Un algorithme récursif Trouver la première case vide Grille résolue ? Afficher la solution NON OUI Fin Début : résoudre une grille Trouver les solutions valides pour cette case (celles qui n'apparaissent pas dans la même ligne, dans la même colonne ou dans le même carré Pour chaque solution possible: Compléter avec cette solution

L'algorithme de sudokusc (2) Exploration de l'arbre A=1 B=3 Pas de solution pour C ! On revient encore sur nos pas... A=2 B=1 Pas de solution pour C ! On revient sur nos pas... B=3 C=1 Terminé ! La grille est complétée. Ici, on a été malchanceux : la solution était tout en bas de l'arbre (on aurait pu tomber dessus dès le début !)

La programmation C'est quoi ? #define G(n) int n(int t, int q, int d) #define X(p,t,s) (p>=t&&p<(t+s)&&(p-(t)&1023)<(s&1023)) #define U(m) *((signed char *)(m)) #define F if(!--q){ #define I(s) (int)main-(int)s #define P(s,c,k) for(h=0; h>>14==0; h+=129)Y(16*c+h/1024+Y(V+36))&128>>(h&7)?U(s+(h&15367))=k:k G (B) { Z; F D = E (Y (V), C = E (Y (V), Y (t + 4) + 3, 4, 0), 2, 0); Y (t + 12) = Y (t + 20) = i; Y (t + 24) = 1; Y (t + 28) = t; Y (t + 16) = ; Y (t + 28) = d = E (Y (V), s = D * , 1, 0); for (p = 0; j < s; j++, p++) U (d + j) = i == D | j < p ? p--, 0 : (n = U (C i++)) < ' ' ? p |= n * , 0 : n; } - On rédige l'algorithme dans un langage de programmation - L'ordinateur traduit ce code en des instructions qu'il peut comprendre et exécuter

Les langages de programmation Quel langage choisir ? INTERPRÉTÉ OU COMPILÉ ? HAUT NIVEAU OU BAS NIVEAU ? Langue de l'homme Langue de l'ordinateur Microsoft Visual Basic Java Python BASIC C++ C Assembleur À la plume d'oie... - plus concis (en apparence) - plus naturel - plus indépendant de la machine - moins rapide - moins rigoureux - moins de possibilités - plus de possibilités - plus rigoureux - plus rapide - moins concis (toutefois...) - moins naturel - moins indépendant de la machine CODE EXÉCUTABLE (compilé) BYTECODE (interprété) CODE (interprété) compilateur CODE BYTECODE exécution interpréteur EXÉCUTABLEexécution La compilation doit être refaite si l'on change de machine, mais l'interprétation peut ralentir l'exécution. compilation (une fois) exécution (à chaque fois)

Le langage C C quoi ? - Bas niveau - Compilé - Très rapide - Très rigoureux mais permissif (attention !) - Normalisé ANSI et ISO - Vieux ! (1972, normalisé en 89 et a évolué depuis) - Peu de concepts mis en oeuvre - Quelques « extensions » (C++, etc.) - Portable (si l'on fait attention à ce que l'on fait) - Déjà très utilisé -...et en plus, je souhaitais l'apprendre... C

Les pointeurs Un concept inventé par le langage C. Mais qu'est-ce-que c'est ? La mémoire vive d'un ordinateur est un ensemble d'adresses contenant chacune une valeur. Dans un programme, on utilise des variables pour stocker des données (par exemple, une grille de Sudoku est un tableau de 81 variables). Un pointeur est une variable contenant une adresse (ex : à l'adresse , il y a l'adresse ). Pour optimiser sudokusc, on utilise les pointeurs. Par exemple, au lieu de stocker plein de grilles différentes alors que l'on parcourt l'arbre et que l'on essaie de résoudre (ce qui prend beaucoup de place dans la mémoire), on stocke une seule fois la grille et l'on donne aux différents appels du programme (à chaque essai) un pointeur vers la grille, plutôt qu'une copie de la grille.

Le programme Quel résultat au final ? - Environ 280 lignes mots caractères (court !) - Environ 2000 caractères pour la version courte, à gauche (pas de commentaires ni d'espacement) - A résolu tous les Sudoku testés - Temps de résolution : environ 1-2 millisecondes sur ma machine (!!) - Interface terminal, peu conviviale - Peut résoudre les Sudoku de dimension n - Logiciel libre sous GPL #include #define DIM 3 int fill(int grid[DIM*DIM][DIM*DIM], int[2], int[DIM*DIM+1]); int firstempty(int[DIM*DIM][DIM*DIM], int[DIM*DIM*DIM*DIM][2], int *); int solve(int[DIM*DIM][DIM*DIM], int[DIM*DIM*DIM*DIM][2], int); int solution(int[DIM*DIM][DIM*DIM]); int main(int argc, char *argv[]) { int grid[DIM*DIM][DIM*DIM]; int empty[DIM*DIM*DIM*DIM][2]; int empties = 0; printf("Please enter the grid you wish to solve \n"); printf("Separate each digit by enter \n"); printf("Enter 0 for empty squares \n"); int i, j, ret; for(i=0;i =0;i--) { for(j=(DIM*DIM)-1;j>=0;j--) { if (!grid[i][j]) { empty[*empties][0] = i; empty[*empties][1] = j; (*empties)++; } } } return 0; } int solve(int grid[DIM*DIM][DIM*DIM], int empty[DIM*DIM*DIM*DIM][2], int empties) { int i, ret; int fills[DIM*DIM+1] = {0}; empties--; fill(grid, (int *) empty[empties], (int *) &fills); for(i=1;i<DIM*DIM+1;i++) { if (!fills[i]) { grid[empty[empties][0]][empty[empties][1]] = i; if (!empties) { solution(grid); } else { solve(grid, empty, (int) empties); } } } grid[empty[empties][0]][empty[empties][1]] = 0; return 0; } int solution(int grid[DIM*DIM][DIM*DIM]) { int i, j, k; for(i=0;i<DIM*DIM;i++) { for (k=0;k<DIM*DIM;k++) { printf("+-"); } printf("+\n"); for(j=0;j<DIM*DIM;j++) { printf("|%d",grid[i][j]); } printf("|\n"); } for(k=0;k<DIM*DIM;k++) { printf("+-"); } printf("+\n\n"); return 0; } int fill(int grid[DIM*DIM][DIM*DIM], int cell[2], int ret[DIM*DIM+1]) { int k = 0; for(k=0;k<DIM*DIM;k++) { ret[grid[cell[0]][k]] = 1; ret[grid[k][cell[1]]] = 1; ret[grid[(cell[0]/DIM)*DIM+k/DIM][(cell[1]/DIM)*DIM+k%DIM]] = 1; } return 0; }

Mais pourquoi il a fait ça ? C'est vrai, ça sert à quoi, son truc ? - Pour apprendre le C - Pour voir si j'en étais capable - Au cas où ça n'existait pas encore... - Pour m'occuper - Pour m'amuser, aussi (sisi, ça m'amuse) - Pour ricaner quand je vois quelqu'un en difficulté devant un Sudoku - Pour réfléchir un peu - Pour résoudre le cas général - Au cas où ça viendrait un jour à servir à quelque chose - Pour le bien de notre civilisation - Inutile donc indispensable ! -... Image de David Vignoni, licence GNU LGPL Il vaut mieux pomper même s'il ne se passe rien que risquer qu'il se passe quelque chose de pire en ne pompant pas – Devise Shadok