• # Une version texte en C "pur"

    Posté par . En réponse à la dépêche Kitsune 2.0 : jeu de lettres et de chiffres. É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");
    }