Kitsune 2.0 : jeu de lettres et de chiffres

Posté par (page perso) . Modéré par Nÿco.
Tags :
0
12
juin
2007
Éducation
Kitsune est un logiciel libre destiné à résoudre les problèmes de chiffres du jeu télévisé "Des chiffres et des lettres". Etant donné un compte, il calcule toutes les façons de le résoudre, ou, à défaut, d'obtenir la meilleure approximation. Kitsune permet donc au téléspectateur de pallier aux (rares) défaillances de l'animateur de l'émission, mais également au candidat potentiel de s'entraîner sur des tirages aléatoires.

La version 2.0 apporte la possibilité de rentrer sa solution, ce qui permet de jouer dans des conditions approchant celles des candidats de l'émission. Si le joueur a rentré la solution du problème (ou la meilleure approximation), le chronomètre s'arrête et toutes les solutions sont affichées.

Kitsune a été programmé avec Qt4. Il est distribué sous licence GPL, et disponible sous Linux, Mac et Windows. Il est possible de jouer avec un plus petit nombre de plaques et des comptes plus petits, pour rendre le jeu plus facile. Cette fonctionnalité est intéressante pour le joueur débutant, mais aussi pour les enseignants de l'école primaire ou du collège qui voudraient entraîner leurs élèves au calcul mental. Ils peuvent alors soit leur faire utiliser le programme (après l'avoir paramétré comme désiré), soit préparer une série de comptes de la difficulté voulue.

Autre fonctionnalité : Kitsune essaye de simplifier du mieux possible les "solutions équivalentes". Par exemple, il n'est pas utile d'afficher 8x100 et 100x8, donc une seule de ces deux opérations sera affichée.

Enfin, le programme a accessoirement permis d'obtenir un certain nombre de statistiques essentielles telles que :
  • Un problème choisi aléatoirement a 93.7% de chances d'avoir une solution exacte, c'est-à-dire que dans un peu moins d'un cas sur 15, seule une approximation est possible.

  • 18,2 % des tirages de 6 plaques permettent de résoudre tous les comptes entre 100 et 999. C'est le cas par exemple de 1;2;3;4;5;100.

  • 100 % de l'utilisatrice japonaise interrogée trouve la mascotte « kawaï » ; un meilleur score serait envisageable en dessinant au renard des yeux énormes et remplis de multiples reflets.




Aller plus loin

  • # Bon entraînement

    Posté par . Évalué à 3.

    Voilà un bon entraînement pour ma faculté de calcul mental qui a tendance à se ramollir !

    Beau travail.
    • [^] # Re: Bon entraînement

      Posté par . Évalué à 3.

      Le mec qui présente l'émission n'en a clairement pas besoin, il est vraiment balaise !!
  • # Une version texte en C "pur"

    Posté par . Évalué à 2.

    Voila un bout de code pondu par un pote et qui doit bien avoir 20/25 ans... (le code, pas lui :-) A l'époque, on arrivait tout juste à rester sous les 45 secondes... Avec les machines actuelles c'est évidemment instantané ! Bon, allez, on va dire que c'est du Gpl 2+ :-)
    /* contebon.c */
    #include "math.h"
    /* #include "process.h" */
    #include "stdio.h"
    #include "string.h"
    
    unsigned _stklen = 60000U ;
    
    #define MAXNB 6
    
    typedef struct {
      long val;
      char text[80];
      } elt_rech;
    
    long obj,best_delta;
    
    int cherche(elt_rech jeu[])
    {
    int i;
    for(i=0;jeu[i].val;i++)
      {
      int j;
      if(labs(jeu[i].val-obj)<best_delta)
        {
        best_delta=labs(jeu[i].val-obj);
        printf("%s=%ld\n",jeu[i].text,jeu[i].val);
        if(jeu[i].val==obj)return(1);
        }
      for(j=i+1;jeu[j].val;j++)
        {
        elt_rech jeulocal[MAXNB+1];
        long big,small;
        char tbig[80],tsmall[80];
        int k,nbout=1;
        for(k=0;jeu[k].val;k++)
          if(k!=i&&k!=j)
            {
            jeulocal[nbout].val=jeu[k].val;
            strcpy(jeulocal[nbout].text,jeu[k].text);
            nbout++;
    	}
        jeulocal[nbout].val=0;
        if(jeu[i].val>jeu[j].val)
          {
          big=jeu[i].val;
          small=jeu[j].val;
          strcpy(tbig,jeu[i].text);
          strcpy(tsmall,jeu[j].text);
          }
        else
          {
          big=jeu[j].val;
          small=jeu[i].val;
          strcpy(tbig,jeu[j].text);
          strcpy(tsmall,jeu[i].text);
          }
        jeulocal[0].val=big+small;
        sprintf(jeulocal[0].text,"(%s+%s)",tbig,tsmall);
        if(cherche(jeulocal))return(1);
        if(big!=small)
          {
          jeulocal[0].val=big-small;
          sprintf(jeulocal[0].text,"(%s-%s)",tbig,tsmall);
          if(cherche(jeulocal))return(1);
          }
        jeulocal[0].val=big*small;
        sprintf(jeulocal[0].text,"%sx%s",tbig,tsmall);
        if(cherche(jeulocal))return(1);
        if(!(big%small))
          {
          jeulocal[0].val=big/small;
          sprintf(jeulocal[0].text,"(%s/%s)",tbig,tsmall);
          if(cherche(jeulocal))return(1);
          }
        }
      }
    return(0);
    }
    
    int main()
    {
    short nbnb,i;
    elt_rech jeu[MAXNB+1];
    printf("Combien de nombres ");
    scanf("%d",&nbnb);
    if(nbnb>MAXNB)
      {
      printf("Pas plus que 6.\n");
      exit(0);
      }
    for(i=0;i<nbnb;i++)
      {
      printf("Nombre %d ",i+1);
      scanf("%ld",&jeu[i].val);
      sprintf(jeu[i].text,"%ld",jeu[i].val);
      }
    jeu[nbnb].val=0;
    printf("Tri des valeurs ....");
    for(i=0;i<nbnb;i++)
      {
      int j;
      for(j=i+1;j<nbnb;j++)if(jeu[i].val<jeu[j].val)
        {
        elt_rech swap;
        swap=jeu[i];
        jeu[i]=jeu[j];
        jeu[j]=swap;
        }
      }
    for(i=0;i<nbnb;i++)printf(" %ld",jeu[i].val);
    printf("\nObjectif ");
    scanf("%ld",&obj);
    best_delta=labs(obj-jeu[0].val);
    if(cherche(jeu))printf("Solution exacte trouvee\n");
    else printf("Solution approchee trouvee\n");
    }
    
    • [^] # Re: Une version texte en C "pur"

      Posté par . Évalué à 1.

      À mes tous débuts en C, j'étais tombé sur un programme un peu plus court - mais beaucoup plus compliqué à comprendre! Le voici:
      #define GAP(a,b)        (((a)>(b))?((a)-(b)):((b)-(a)))
      #define SPRINTOP(a,b,k,res) \
      ({strcpy(str_tmp,str_result);\
      sprintf(str_result,"%3d %c %3d = %d\n%s",(((a)>(b))?(a):(b)),s[k],(((a)>(b))?(b):(a)),res,str_tmp);})
      
      #define NBCH    6
      
      int best_tot = 0, best_gap = 999;
      char str_result[255],str_tmp[255];
      
      int plus (int *a, int b)  { return (*a += b);        }
      int moins(int *a, int b)  { return (*a = GAP(*a,b)); }
      int multi(int *a, int b)  { return (*a *= b );       }
      int divis(int *a, int b)  {
              if (*a < b) { *a^=b; b^=*a; *a^=b; }
              if ( !(*a%b) ) return (*a /= b );
              return 0;
      }
      
      #define NBOP    4
      int (*f[])(int *,int) = { plus , moins , multi, divis };
      char s[] = "+-*/";
      
      int lcb(int *tab, int nb, int tot)
      {
      int i,j,k,t[NBCH];
        for ( i=0 ; i<nb-1 ; i++ )
          for ( j=i+1 ; j<nb ; j++)
             for ( k=0; k<NBOP; k++) {
                 memcpy(t,tab,sizeof(int)*NBCH);
                 if ( (*f[k])(&t[i],t[j]) ) {
                    if ( t[i] == tot ) return SPRINTOP(tab[i],tab[j],k,t[i]);
                    if ( GAP(t[i],tot) < best_gap) {
                      best_tot = t[i] ;
                      best_gap = GAP(best_tot,tot);
                    }
                    t[j]=t[nb-1];
                    if (lcb(t,nb-1,tot)) return SPRINTOP(tab[i],tab[j],k,t[i]);
                 }
             }
        return 0;
      }
      
      int main(void)
      {
      int t[NBCH], i, tot;
          *str_result = 0x00;
          for ( i=0; i<NBCH ; scanf("%d",(printf("nombre %d : ",i+1),&t[i++]))) ;
          printf("total : ");
          scanf("%d",&tot);
          if ( ! lcb(t,NBCH,tot) ) lcb(t,NBCH,best_tot);
          else printf("Le compte est bon : \n");
          return ! printf(str_result);
      }
      
      Usage extensif des (deux) macros, presque obfusqué, avec un algorithme d'une complexité apparemment plus élevée. Je ne connais pas l'auteur, donc je ne peux pas donner de licence par contre...
      • [^] # En Prolog

        Posté par . Évalué à 3.

        /*
        mettre par ex
        cptbon([2,3,25,7,1,3],347).
        */

        cptbon(L,X):-
        cptf(L,L2),
        dans(L2,X),
        cptfa(L,L2).
        dans([X|_],X).
        dans([_|L],X):-
        dans(L,X).
        cptfa(L,L).
        cptfa(L1,L2):-
        cpt(L1,L3),
        cptfa(L3,L2),
        write(L3),nl.
        cptf(L,L).
        cptf(L1,L2):-
        cpt(L1,L3),
        cptf(L3,L2).
        cpt([X|Q1],[X|Q2]):-
        cpt(Q1,Q2).
        cpt([X|Q1],Q2):-
        cpt2(X,Q1,Q2).
        cpt2(X,[A|Q1],[A|Q2]):-
        cpt2(X,Q1,Q2).
        cpt2(X,[Y|Q1],[Z|Q1]):-
        Z is X+Y;
        X>Y, Z is X-Y;
        X<Y, Z is Y-X;
        Z is X*Y;
        X>Y,0 is X mod Y, Z is X/Y;
        X<Y,0 is Y mod X, Z is Y/X.
        • [^] # Re: Toutes, vraiment toutes ?

          Posté par (page perso) . Évalué à 2.

          Je n'ai pas le niveau pour comprendre ni le code en Prolog, ni en C.
          Mais j'avais une petite question ... (qui est bonne aussi pour le code en C++ de kitsune (et pas katsumi ;)
          Peut-on être sûr d'avoir toutes les solutions ?
          N'y a-t-il pas des solutions non analysées ?

          Sinon, je le redis ici, mais c'est vraiment un beau projet, simple, mais qui est agréable. Ça fait déjà 3/4 d'h qu'il tourne chez moi :( et http://pour_mon_bac.saimal.fr/ )
          • [^] # Re: Toutes, vraiment toutes ?

            Posté par (page perso) . Évalué à 3.

            De par sa nature, Prolog trouve toutes les solutions (sauf si on force ...) à une subtilité près : prolog ne sait pas inférer sur les calculs de sa calculatrice. Il faut soit définir les nombres de façon fonctionnelle, soit utiliser un langage (comme chips) qui sache inférer sur sa calculatrice.

            Adhérer à l'April, ça vous tente ?

            • [^] # Re: Toutes, vraiment toutes ?

              Posté par (page perso) . Évalué à 2.

              soit utiliser un langage (comme chips) qui sache inférer sur sa calculatrice.


              Tu veux parler de CLIPS ? Si c'est bien ça, je doute qu'il soit très adapté à ce type de problème où on part de la solution.

              En effet, CLIPS, contrairement à Prolog, fait du chaînage avant : on part des faits (les nombres) et on construit de nouveaux faits dès qu'une règle peut s'appliquer (ici, les opération arithmétiques élémentaires). On génère alors tous les nombres possibles à partir de ceux proposés. On vérifie alors à la fin si le nombre voulu se trouve dedans. Dans ce cas, ça pourrait peut être aller vu qu'il n'y a pas tant de nombres que ça, mais ça explose vite.

              Avec Prolog (qui fait du chaînage arrière), on part du but (le nombre en question à trouver), et on regarde si un enchaînement de règle permet d'y arriver à partir des faits (les nombres de départ).

              Bon, je ne sais pas si j'ai été très clair, et peut être que "chips" existe et que je suis complètement à côté de la plaque (en même temps, faites donc une recherche sur "chips" dans google :-)
              • [^] # Re: Toutes, vraiment toutes ?

                Posté par (page perso) . Évalué à 2.

                Oui, Clips ... (désolé mon cerveau n'est pas ECC ...)
                Je ne l'ai jamais utilisé ... et vu ce que tu me dis, je pense que le prof qui m'en a parlé non plus ;-) Il nous avait expliqué que clips était comme prolog, mais avec une calculatrice qui "marche".

                C'est marrant le chainage avant ... en mini projet d'IA, j'avais essayé de réaliser un moteur de chainage avant en prolog ... ça n'a jamais abouti (pas le temps).

                Adhérer à l'April, ça vous tente ?

                • [^] # Re: Toutes, vraiment toutes ?

                  Posté par (page perso) . Évalué à 3.

                  Pour préciser un peu, CLIPS est un outil pour faire des systèmes experts développé par la NASA (en C) à l'époque où les systèmes experts étaient faits en LISP, étaient très lents et très chers. Comme ils sont sympa, ils l'ont versé dans le domaine public.
              • [^] # Re: Toutes, vraiment toutes ?

                Posté par . Évalué à 2.

                Il y a des Prolog avec contraintes (p.ex. ECLIPSe (attention à la casse)) qui ajoutent la gestion de contraintes et des possibilités arithmétiques au Prolog.
                • [^] # Re: Toutes, vraiment toutes ?

                  Posté par (page perso) . Évalué à 2.

                  GNU Prolog aussi permet d'utiliser les contraintes :-)

                  Sinon, il y a aussi Sictus Prolog qui s'interface très bien avec Java (mais qui coûte très cher).
          • [^] # Re: Toutes, vraiment toutes ?

            Posté par (page perso) . Évalué à 1.

            Pour Kitsune, il est fabriqué de façon à te renvoyer toutes les solutions. Néanmoins, pour éviter de parasiter l'affichage avec trop de solutions, il évite d'afficher des "solutions équivalentes", c'est expliqué sur cette page : http://kitsune.tuxfamily.org/wiki/doku.php?id=solutions_equi(...)
  • # Paquet debian

    Posté par (page perso) . Évalué à 1.

    C'est sympa, il y a un paquet debian, malheureusement seulement pour l'architecture i386.

    J'ai téléchargé les sources; malheureusement elles ne contiennent pas le packaging qui permettrait de refaire facilement un paquet pour une autre architecture (amd64 dans mon cas)

    Voilà, une petite requête pas méchante; et bravo pour le boulot.
    • [^] # Re: Paquet debian

      Posté par (page perso) . Évalué à 1.

      Je ne vois pas exactement ce qui te manque pour faire un paquet sur cette architecture. Tu peux nous contacter à l'adresse indiquée tout en bas du site de Kitsune, on pourra peut-être t'aider.
  • # Merci !

    Posté par . Évalué à 2.

    ça méritait bien une petit billet sur la mise à jour:
    http://ticeblog.ycombe.net/index.php/2007/06/12/93-kitsune-2(...)

    Bon, après avoir testé je peux confirmer: les neurones s'avachissent avec l'âge.

    Dis, M'sieur, tu peux me faire le même avec la possibilité d'enregistrer une série de tirage à l'avance ? C'est pour faire des séries progressives.
    • [^] # Re: Merci !

      Posté par (page perso) . Évalué à 1.

      Dis, M'sieur, tu peux me faire le même avec la possibilité d'enregistrer une série de tirage à l'avance ? C'est pour faire des séries progressives.
      On l'attendait, celle-là. Tu arrives trop tard, c'est déjà sur la wishlist. Peut-être pour la 2.1 ou la 2.2.
  • # Pallier.

    Posté par (page perso) . Évalué à 2.

    Il faut bien que quelqu'un fasse la remarque, et je me dévoue volontiers : le verbe pallier est un verbe transitif.

    Autrement dit, on peut pallier quelque chose, mais pas pallier à quelque chose.
    • [^] # Re: Pallier.

      Posté par . Évalué à 2.

      Sérieux?
      Donc je l'ai toujours mal utilisé ce mot...

      Non que je veuille me trouver une excuse mais il me semble que tout le monde, ou presque, l'utilise mal. Ne serait-ce donc pas là une évolution de la langue? ne pourrait-on pas considérer que le "pallier à" est correct dorénavant vu qu'il est tant utilisé et que tout le monde le comprend?
      • [^] # Re: Pallier.

        Posté par (page perso) . Évalué à 4.

        Eh, non, il faut pallier la méconnaissance du français ;-)
        • [^] # Re: Pallier.

          Posté par . Évalué à 1.

          Bon ben tant qu'on y est avec les lieux communs.

          "eh non" et "et non"
          Lequel est le bon? Le deuxième me semble plus beau à l'oreille et à l'oeil.
          • [^] # Re: Pallier.

            Posté par (page perso) . Évalué à 1.

            Ah (et non HA !) ? Moi c'est le premier qui me semble le plus beau à l'oeil et à l'oreille :)
            • [^] # Re: Pallier.

              Posté par (page perso) . Évalué à 2.

              "eh non" et "et non"
              Lequel est le bon? Le deuxième me semble plus beau à l'oreille et à l'oeil.


              Eh non ! (sans accent sur le 'E' !)

              Moi c'est le premier qui me semble le plus beau à l'oeil et à l'oreille :)


              Eh oui ! (pas d'accent non plus)

              Un extrait du Trésor informatisé de la langue française [http://atilf.atilf.fr/tlf.htm]

              eh : le locuteur infirme le point de vue de l'interlocuteur ou notifie l'inadéquation de son comportement.


              Des exemples :

              « Mettez une épingle ici. Eh ! non, pas là, ici, près de la manche » (ZOLA, Bonh. dames, 1883, p. 692).

              « Est-ce vrai? Je crois rêver. Eh non ! Ce n'est pas un rêve » (APOLL., Casanova, 1918, I, 10, p. 982).
              • [^] # Re: Pallier.

                Posté par (page perso) . Évalué à 2.

                Hé oui, mais moi, je préfère Hé.
                (tlfi dit "Dans tous ses emplois eh peut être remplacé par hé.")
          • [^] # Re: Pallier.

            Posté par . Évalué à 1.

            >"eh non" et "et non", Lequel est le bon?

            Je dirais :

            * Hé non ! blabla
            - Tu as eu ton bac ?
            - Hé non, je n'ai pas eu mon bac. *blam*

            * Et, non, blabla
            - C'est à cette heure ci que tu rentres ? Tu as eu ton bac ?
            - Oui c'est à cette heure-ci. Et non, je n'ai pas eu mon bac. *blam* *blam*

            (j'ai mon bac)
  • # Où sont les lettres ?...

    Posté par . Évalué à 2.

    Président du fanclub de Christine Fabréga, la première et unique présentatrice du "Mot le plus long (TM)", blonde cousine des regrettées Jacqueline Caurat et Catherine Langeais et en tant que secrétaire perpétuel de la fondation Max Favalelli, je proteste officiellement contre l'absence dans ce jeu d'un module dédié au premier et incontestablement primordial jeu de l'émission créée par notre grand gourou Armand Jammot (Dieu le garde en son paradis !)

    Les ignares oublient souvent que "les chiffres" ne sont qu'un appendice rajouté après bien des années d'émission.

    Vive le Mot le plus long !
  • # Le renard !

    Posté par . Évalué à 1.

    Bien que je préfère de loin les lettres aux chiffres, je ne peux m'empêcher de dire combien j'aime cette mascotte et la trouve excellente ; avec elle, c'est tout de suite beaucoup plus ludique, bravo pour le concept !

    L'animateur télé "Des chiffres et des lettres" ne tient vraiment pas la comparaison, c'est d'ailleurs, amha, ce qui manque cruellement à l'émission pour battre des records d'audience. :-D


    PS:
    Et non, mes origines ne sont pas nippones, comme quoi...

    THRAK (def.) : 1) A sudden and precise impact moving from intention, direction and commitment, in service of an aim. 2) 117 guitars almost striking the same chord simultaneously.

  • # Un peu faiblard...

    Posté par . Évalué à 1.

    Et si on veut faire 21 avec 1, 5, 6 et 7? Si au moins on pouvait compter sur ses doigts, mais non... (à moins de savoir plier ses doigts avec suffisament de précision pour encoder des nombres rationnels :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.