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

Contribuez Pascal Discussion :

Lire au moyen des expressions régulières toutes les chaînes EPD/FEN d'un fichier


Sujet :

Contribuez Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut Lire au moyen des expressions régulières toutes les chaînes EPD/FEN d'un fichier
    Bonjour !

    J'étais très content d'avoir écrit cette petite unité, alors je la partage avec vous.

    Imaginez que vous vous voulez charger une liste de chaînes à partir d'un fichier contenant des chaînes au format FEN (représentant un moment dans une partie d'échecs).

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n7/3p1p2/NpkNp1p1/1p2P3/3Q4/6B1/b7/4K3 w - - 0 1
    K6Q/1p6/pPq4P/P2p2P1/4pP1N/7k/n5R1/1n2BB2 w - - 0 1
    8/8/8/3p4/1N1P2Kp/Bkp5/5Q2/4N3 w - - 0 1

    Maintenant imaginez que le fichier se présente comme ceci.

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FEN[121] = "n7/3p1p2/NpkNp1p1/1p2P3/3Q4/6B1/b7/4K3 w - - 0 1 "; // Sam Loyd (1856) 4-move mate [Qg1] - (5)
    FEN[122] = "K6Q/1p6/pPq4P/P2p2P1/4pP1N/7k/n5R1/1n2BB2 w - - 0 1 "; // Sam Loyd (1867) 4-move mate [BxP] - (11)
    FEN[123] = "8/8/8/3p4/1N1P2Kp/Bkp5/5Q2/4N3 w - - 0 1 "; // Sam Loyd (1867) 4-move mate [Qf8] - (13)

    Là les expressions régulières sont vos amies.

    Le fichier utilisé par le programme de démonstration est téléchargeable sur cette page.

    Le programme charge 150 000 chaînes en moins de deux secondes.

    Toutefois, j'ai observé, en 32 bits (sous Windows, je ne sais plus quelle version du compilateur) que le programme ne s'arrêtait plus... Il faudrait signaler le bug...

    Il faudrait que j'écrive une autre version de l'unité avec la redoutable bibliothèque FLRE pour voir la différence.

    En espérant que ce code puisse vous être utile, même si vous ne vous intéressez pas aux échecs. Il peut être adapté à un autre besoin.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Il faudrait que j'écrive une autre version de l'unité avec la redoutable bibliothèque FLRE pour voir la différence.
    Voilà. Moins d'une seconde avec FLRE !

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [roland@localhost gui]$ make timetest
    ./loadfen1timetest
    Time elapsed 00:00:01:585
    Found 155078 FEN strings
    ./loadfen2timetest
    Time elapsed 00:00:00:956
    Found 155078 FEN strings
    [roland@localhost gui]$

    Une seconde pour détecter 150 000 chaînes, toutes différentes (1). Et encore dans cette seconde il y a le remplissage de la liste ! On pourrait se passer de la liste et conserver les données directement dans la variable de type TFLREMultiStrings.

    (1) La fonction est même capable de reconnaître certaines chaînes mal formées. Elle les corrige et les ajoute dans la liste.
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Petite amélioration, consistant à créer une classe dérivée de TStringList, avec la méthode LoadFromFile surchargée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    unit FenStringList;
     
    (* Loads all EPD/FEN strings contained in a file. *)
     
    interface
     
    uses
      SysUtils, Classes, RegExpr;
     
    type
      TFenStringList = class(TStringList)
        procedure LoadFromFile(const FileName: string); override;
      end;
     
    implementation
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. Trouver une expression régulière pour les valeurs des noeuds XML
    Par Motin dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 05/10/2011, 18h51
  2. Réponses: 2
    Dernier message: 19/02/2010, 17h37
  3. Réponses: 0
    Dernier message: 24/11/2009, 10h20
  4. Réponses: 1
    Dernier message: 04/05/2009, 09h31
  5. Réponses: 4
    Dernier message: 25/07/2006, 18h37

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