Résoudre SABLE+SOLEIL=BIKINI . Dans cette équation chaque lettre peut etre
remplacée par un chiffre. Deux lettres ne peuvent pas avoir la même valeur.
ca marche aussi pour :
SEND+MORE=MONEY
TWENTY+TWENTY+TWENTY+TEN+TEN=EIGHTY
RIEN+RIEN=ZERO
UNE+DEUX=TROIS
BALLE+FOOT=COUPE
Analyse
C'est facile ? On prend toutes les lettres et on les mets dans un tableau, ensuite
on crée toutes les combinaisons de n (nombre de lettre) chiffres dans l'ensemble {0..9}.
Ensuite il ne reste plus qu'à faire le calcul en remplacant chaque lettre par son chiffre correspondant
Programme
#define ADD "UNE+DEUX=TROIS"
//#define ADD "BALLE+FOOT=COUPE"
//#define ADD "SOLEIL+SABLE=BIKINI"
// #define ADD "SEND+MORE=MONEY"
// #define ADD "TWENTY+TWENTY+TWENTY+TEN+TEN=EIGHTY"
char t[10], r[10], ind=0, add[] = ADD ".";
int compute( char *s, unsignedlong d ) {
if ( *s == '.' ) return d;
if ( *s == '+' ) return d + compute(s+1, 0L);
if ( *s == '=' ) return d - compute(s+1, 0L);
return compute(s+1, d*10 + r[*s]);
}
void next(int c, int u, int j) {
if ( c < ind ) {
if ( !(u & (1<<j))) r[c] = j, next(c+1, u| (1<<j), 0);
if ( j != 9 ) next(c, u, j+1);
} else {
if ( !compute(add, 0L) ) {
char *p = add-1;
printf("\n" ADD " <-> ");
while ( *++p != '.' ) printf("%c",(*p<10?r[*p]+'0':*p));
}
}
}
void parse(char *c) {
char i;
if ( *c == '.') { next(0,0,0) ; return ; }
if ( *c >= 'A' && *c <='Z' ) {
i=ind;
while (--i >= 0 && t[i] != *c );
if ( i != -1 ) *c = i ;
else t[ind] = *c, *c = ind++ ;
}
parse(c+1);
}
int main ( void ) {
parse(add);
}
Conclusion
Pour chaque saison
il y a une équation
mais de toutes facons
il faut des recursions.