IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[Défi] Le Défi Delphi n°5 : Le Sudoku solver


Sujet :

Delphi

  1. #501
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Oui, mais là c'est NormalizeToMosts qui ne fonctionne pas correctement. Les fiches StayOnTop restent dessus alors que la fiche principale (normale) passe dessous. J'ai bidouillé quelque chose avec OnActivate/OnDeactivate, mais c'est pas encore suffisant. J'aurais peut être dû encore ajouté un SendToBack .
    Ou simplement faire tout sur la meme form comme tu disait !!

  2. #502
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Merci aux organisateurs et aux membres du jury
    A quand le prochain défi ?
    On vous laisse souffler un peu quand même

    Bravo à tous les participants et spécialement à Andnotor pour sa version décoiffante

    Ceci dit, je ne peux m'empêcher de laisser un petit message pour dimanche2003

    Visiblement tu n'as rien compris
    Ce défi est ouvert à tous ceux qui veulent développer un projet, défini dans un cahier des charges, histoire d'échanger sur un domaine aussi vaste que passionnant qu'est la programmation

    Ceux que ça n'intéresse pas n'ont qu'à passer leur chemin

    Ici ce sont des passionnés d'informatique qui se rencontrent pour se tirer la bourre amicalement

    Ce défi n'est d'aucun intérêt pour des joueurs de Sudoku
    Pas un seul ne se servirait de nos solvers pour résoudre ses grilles

    Ce que nous faisons ici ne sert à rien... d'autre qu'échanger des connaissances techniques et progresser, entre passionnés
    Choisir, c'est renoncer...

  3. #503
    Membre actif

    Inscrit en
    Août 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 13
    Points : 287
    Points
    287
    Par défaut
    En tous cas, breton gourmand, tu m'as parfaitement compris : le Sudoku primait pour moi sur l'informatique, d'où mes réactions.

    Je voudrais quand même faire remarquer que le site présente une mine de développements qui servent de réflexion aux nouvelles générations, ce qui crée certaines obligations... A ce titre, il me semblait intéressant que les passionnés qui animent ce site laissent en référence des sources exemptes de coquilles... Mais je n'insiste pas, je laisse à chacun la satisfaction d'un "travail" terminé et dans l'attente de la prochaine compétition à laquelle je participerai peut-être... car il n'y a rien de tel pour découvrir et progresser !

    Et encore une fois toutes mes félicitations au vainqueur.

  4. #504
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par dimanche2003
    Je voudrais quand même faire remarquer que le site présente une mine de développements qui servent de réflexion aux nouvelles générations, ce qui crée certaines obligations... A ce titre, il me semblait intéressant que les passionnés qui animent ce site laissent en référence des sources exemptes de coquilles...
    Décidément NON NON et NON
    Tu confonds la rubrique défi avec la rubrique sources
    Ce défi, par définition et dans son esprit, n'est pas là pour présenter des projets parfaits (des références ???) mais tout au contraire, de mettre en compétition des versions plus ou moins réussies, qui font d'ailleurs l'objet d'un classement et d'un jugement critique en fonction de leur... défauts respectifs !

    Tout lecteur qui a lu les règles du défi et les résultats publiés par le jury aura normalement compris ça !

    Citation Envoyé par dimanche 2003
    je laisse à chacun la satisfaction d'un "travail" terminé
    Personnellement, je n'ai jamais eu ce sentiment en rendant ma "copie", en tout cas jamais l'impression que mon travail méritait d'être présenté à des développeurs "en exemple", bien au contraire...

    Je me souviens avoir lu quelque part il y a bien longtemps : "Un programme, même terminé, n'est jamais définitif"

    Tout ceci dit, Je serai très heureux de te défier amicalement à la prochaine session
    Choisir, c'est renoncer...

  5. #505
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Citation Envoyé par dimanche2003 Voir le message
    Je voudrais quand même faire remarquer que le site présente une mine de développements qui servent de réflexion aux nouvelles générations, ce qui crée certaines obligations...
    Certes, mais cela n'a aucun rapport avec le défit.

    Ce qui serait envisageable c'est que des participants au défit proposent un article sur base de leur travail en complétant au besoin le code et les explications qui l'accompagnent pour en faire un tutoriel.
    Mais c'est une autre histoire...

  6. #506
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Guardian Voir le message
    Ce qui serait envisageable c'est que des participants au défit proposent un article sur base de leur travail en complétant au besoin le code et les explications qui l'accompagnent pour en faire un tutoriel.
    Mais c'est une autre histoire...
    Ouais, pourquoi pas ...


    Enfin bref, pour revenir un peu au sujet du défi, je vais parler sudoku
    Comme je ne pense pas me remettre a programmer le solveur, je laisse ici les idées que j'ai eu, et si quelqu'un se sent le courage et l'envie de coder, qu'il le code !

    Premierement, on peut remarquer qu'un sudoku peut être assimilé a une matrice à 3 dimensions de 9*9*9, contenant que des booleans, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TSudoku = array [Lignes,Colonnes,Candidats] of boolean      //(bien sur, pour optimiser, faudra changer ca ...)
    Ainsi, si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonSudoku[5,3,8]= false
    équivaut à : Le candidat 8 est interdit dans la ligne 5, colonne 3.


    Je noterai par la suite [x,..,y] la ligne des valeurs de [x,1,y] à [x,9,y]. Idem pour chaque dimension.
    De meme, je noterai [x,..,..] le plan de valeurs allant de [x,1,1] à [x,9,9].


    Résoudre un sudoku reviendra a ce que, sur chacune des 3 dimensions de la matrice, chaque "ligne" de boolean ne contienne qu'un seul true :
    Ainsi, par exemple, pour x et y allant de 1 à 9, on ait [x,y,..], [x,..,y], [..,x,y] qui ne contiennent chacune qu'un seul true.

    Donc, ajouter un V dans une ligne L et une colonne C revient a mettre à false tout les éléments qui sont présents sur les 3 dimensions de la case [L,C,V].
    Donc en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [L,C,..]:=False
    [L,..,V]:=False
    [..,C,V]:=False


    Nous pouvons ensuite différencier plusieurs types de méthodes logiques.

    Premièrement, celles qui ne travaillent que sur une ligne :
    - Candidat Unique (une case ne contient qu'un seul candidat)
    - Emplacement Unique (une ligne ou colonne ne contient qu'un seul candidat)

    Ensuite, celles qui travaillent sur un plan :
    - Candidats Doubles, Triples, ...
    - Paires, triplets, ... cachés
    - X-Wing, SwordFish ..

    Enfin, celles qui travaillent sur la grille entière. Ce dernier cas n'a pas d'améliorations à apporter.


    Candidat unique :
    Nous travaillons sur la dimension n°3 de la grille ([x,y,..]) : C'est à dire que l'on fixe le no de ligne et le no de colonne, et que l'on regarde si il n'y a qu'un candidat.

    Emplacement unique :
    Nous travaillons sur la dimension n°1 et 2 de la grille ([x,..,y] et [..,x,y]) : On regarde dans une ligne ou une colonne précise si un candidat est présent une seule fois.

    Méthode générale sur une ligne :
    Nous remarquons que ces techniques sont tres semblables. Le truc serait donc de creer une procedure qui, pour chaque "ligne" sur chaque dimensions de la matrice, compte le nombre de "true". Si il vaut 1, nous pouvons placer la valeur. (il y a 9*9*3 = 243 "lignes" de valeur à vérifier)


    Voila pour les méthodes sur une ligne.


    Faisons de même pour les méthodes s'appliquant sur un plan entier.

    Candidats Doubles, Triples, ... :
    Nous fixons soit une ligne, soit une colonne. Nous travaillons donc soit sur un plan [x,..,..], soit sur [..,x,..]. Nous généraliserons en appelant cette méthode de résolution CandidatsNièmes, ou N est le nombre de candidats a chercher. Si N=2, alors on cherche des candidats doubles.
    Par exemple, pour la colonne 3 : on regarde si on peut trouver N cases contenant chacune au maximum N candidats, et si on a en tout N candidats différents. (pour ceux qui aiment bien se creuser la tete : si on a moins de N candidats différents, la grille ne possede pas de solutions.) Nous pouvons supprimer les N candidats de toutes les autres cases.

    Exemple concret !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          |       |        |         |          |         |       |       |   
       8  |  2 3  |  2 3 9 |  1 2 6  |  1 2 3 7 | 1 3 6 7 |   4   |  2 9  |   5
          |       |        |         |          |         |       |       |   
              X        X                                              X
    Nous remarquons des candidats triples dans les cases marquées d'un "X". Pour notre algo, N=3. Nous trouvons 3 cases, qui contiennent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .23......
    .23.....9
    .2......9
    Toutes ces cases contiennent en tout 3 candidats différents : le 2, le 3 et le 9.

    Paires, triplets cachés :
    De meme, nous fixons soit une ligne, soit une colonne. Nous travaillons donc soit sur un plan [x,..,..], soit sur un plan [..,x,..]. On appelle la méthode Nièmes Cachés, N donne le nombre de candidats cachés.
    Reprennons la colonne 3 :
    on regarde si on peut trouver N cases contenant chacune au minimum N candidats, et si on a en tout N candidats communs.(de meme : si on a plus de N candidats communs, la grille ne possede pas de solutions.)
    Nous pouvons supprimer les autres candidats des cases concernées.

    Remarque importante : les Nièmes Cachés et les Candidats Niemes sont étroitements liés : sur un élement (ligne, colonne) de la grille, si on a 5 cases non trouvées, rechercher des candidats Nième revient à chercher des (5-N)ièmes cachés.
    Exemple :
    Dans l'exemple du dessus, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       8  |  2 3  |  2 3 9 |  1 2 6  |  1 2 3 7 |  1 3 6 7  |   4   |  2 9  |   5
    on a trouvé des candidats triples (N=3), et on a 6 cases vides. On doit donc pouvoir trouver un (6-3=3) triplet caché.
    En effet, dans les cases 4,5,6, nous avons bien un triplet caché de 1,6,7.

    Faisons un tableau récapitulatif sur ces deux méthodes, dans notre cas de la colonne 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ValeursTrouvées   = ...45..8.
    CandidatsNonFixés = 123..67.9
    CasesTrouvées     = 1.....7.9
    CasesVides        = .23456.8.
     
                    |  Cand. Triples  | Triplets Cachés |    Somme
    ------------------------------------------------------------------------
    Dans les cases  |    .23....8.    |    ...456...    | CasesVides
    Cand. concernés |    .23.....9    |    1....67..    | CandidantsNonFixés
    ------------------------------------------------------------------------
    On peut aussi dessiner le plan de booleans et on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Candidat
      ^
    9 |  X    X 
      |X        
      |    XX            Rouge = Déja placé
      |   X X            Bleu = Candidats Triples
      |        X         Vert = Triplet cachés
      |      X           Noir = A supprimer
      | XX XX   
      | XXXX  X 
    1 |   XXX   
      +--------->
       1       9    N° Case
    Nous remarquons de nombreuses choses, mais on va s'arreter la ...


    X-Wing, SwordFish :
    Nous fixons une valeur. Nous travaillons donc sur un plan [..,..,x]. Dans mon solveur, j'ai appelé ces méthodes "Etoile à N branche", ou N est le nombre de lignes ou colonnes. N=2 : X-Wing, N=3 : SwordFish, N=4 : JellyFish.
    On prends le 2 comme valeur. Le principe est donc de trouver N lignes dont chacune contient au maximum N fois la valeur 2, et que les 2 de toutes ces lignes soit sur N colonnes différentes (si on a moins de N colonnes différentes, la grille n'a pas de solution) Nous pouvons supprimer les 2 dans les N colonnes, qui ne sont pas dans les N lignes de départ.
    Un exemple de grille, les X sont les positions des "1" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    N° Ligne
      ^
    9 |XX     X 
      |    X    
      |X X   X  
      |   X     
      |X X      
      |        X
      |X X   X  
      |     X   
    1 |XX     X 
      +--------->
       1       9    N° Colonne
    Nous remarquons un SwordFish (N=3) sur les lignes 3,5,7. Nous remarquons aussi un X-Wing (N=2) sur les colonnes 2,9.
    En couleurs, ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    N° Ligne
      ^
    9 |XX     X 
      |    X             Rouge = valeurs placées
      |X X   X           Bleu = X-Wing sur les colonnes
      |   X              Vert = SwordFish sur les lignes
      |X X               Noir = Candidats à supprimer
      |        X
      |X X   X  
      |     X   
    1 |XX     X 
      +--------->
       1       9    N° Colonne
    Encore une fois, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SwordFish+XWing = NbLignesNonTrouvees

    Méthode générale sur un plan :
    On a une forte similitude avec les candidats Niemes, les Niemes cachés et les étoiles a N branches.
    Nous alons donc établir une méthode générale. Cette méthode prendra en argument un plan. Sur chaque plan, nous alons tout d'abord compter le nombre de valeurs fixes Nf, et le soustraire à 9 : on a N=9-Nf. Nous allons ensuite chercher dans les 2 sens, la configuration qui nous interresse, a savoir N lignes dont les "X" sont à N emplacements différents.




    Finalement, ces 2 méthodes générales permettent de faire le travail de nombreuses techniques de résolution. Maintenant, plusieurs problemes arrivent : Il faut trouver un moyen permettant d'isoler rapidement une ligne ou un plan de notre matrice pour pouvoir l'analyser. Un autre problème de taille : la représentation des "zones", "régions", "blocs" ...

    Enfin voila. Ceci sont toutes mes observations sur le sudoku. Si quelqu'un veut les coder, libre a lui. Il serait interressant de voir après optimisation jusqu'à quels temps on peut descendre !!

    A+

    Mick605

Discussions similaires

  1. Défi Migration de delphi 3 à delphi 8
    Par sitalebs dans le forum EDI
    Réponses: 8
    Dernier message: 03/01/2008, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo