Bonjour tout le monde,
Voici l'exo qui me donne du fil à retordre:
Début énoncé
chaque lettre représente un chiffre et un seul. Trouver la ou les solutions à :
proposition de solution (la plus simple possible), pour le premier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 %MOT+MOT+MOT=BLA %FORTY+TEN+TEN=SIXTY %NEUF+UN+UN=ONZE %UNE+UNE=DEUX %CHIEN+CHASSE=GIBIER
Remarque (importante) : on détaille ici exactement et précisément ce que l'on veut (le "quoi"), mais
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
16
17
18
19
20
21 /* je décris l'ensemble des possibilités envisageables */ chiffre(0). chiffre(1). chiffre(2). chiffre(3). chiffre(4). chiffre(5). chiffre(6). chiffre(7). chiffre(8). chiffre(9). /* je note ce que je veux */ solution([M,O,T,B,L,A]) if chiffre(M),M=\=0, chiffre(O),O=\=M, chiffre(T),T=\=O,T=\=M, chiffre(B),B=\=0,B=\=T,B=\=O,B=\=M, chiffre(L),L=\=B,L=\=T,L=\=O,L=\=M, chiffre(A),A=\=L,A=\=B,A=\=T,A=\=O,A=\=M, 3*(M*100+O*10+T)=:=B*100+L*10+A.
on ne donne aucune indication sur la méthode de résolution du problème, pas d'algorithme (le
"comment"), on laisse Prolog se débrouiller.
Fin énoncé
1ère question: 3*(M*100+O*10+T)=:=B*100+L*10+A. Je ne comprends pas du tout d'où ça découle, j'ai recherché: peut être ça concerne la priorité des opérateur, l'ordre du terme composé mais quand bien même je n'ai pas compris comment cela est construit...
Ensuite j'ai écris ceci pour répondre à l'exercice:
Problème: Pour CHIEN+CHASSE=GIBIER et pour FORTY+TEN+TEN=SIXTY ça met trop de temps on pourrait faire une permutation peut être pour alléger les calcul ou autre je ne sais pas afin que ça s'exécute plus vite!
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 %Règles listes: %Association d'une lettre dans une liste à un chiffre chiffres([T|[]]):-chiffre(T). chiffres([T|Q]):-chiffre(T),chiffres(Q). %Appartenance à une liste: membre(X,[X|_]). membre(X,[_|Q]):-membre(X,Q). %Difference des membres d'une liste (nous évite de répéter à chaque fois que toutes les lettres ont un chiffre différent) differents([]). differents([T|Q]):- not(membre(T,Q)), differents(Q). %Unifie une liste à une variable evalue(ListeChiffres,R) :- append(TousSaufDernier,[DernierELement],ListeChiffres), evalue(TousSaufDernier,X), R is DernierELement + 10*X. evalue([X],X). %Solutions %MOT+MOT+MOT=BLA solution([M,O,T,B,L,A]):- chiffre(M),M=\=0, chiffre(O),O=\=M, chiffre(T),T=\=O,T=\=M, chiffre(B),B=\=0,B=\=T,B=\=O,B=\=M, chiffre(L),L=\=B,L=\=T,L=\=O,L=\=M, chiffre(A),A=\=L,A=\=B,A=\=T,A=\=O,A=\=M, 3*(M*100+O*10+T)=:=B*100+L*10+A. %FORTY+TEN+TEN=SIXTY solution([F,O,R,T,Y,E,N,S,I,X]):- evalue([F,O,R,T,Y],Forty), evalue([T,E,N],Ten), evalue([S,I,X,T,Y],Sixty), Forty+Ten+Ten =:= Sixty, fail. %NEUF+UN+UN=ONZE solution([N,E,U,F,O,Z]):- chiffres([N,E,U,F,O,Z]), differents([N,E,U,F,O,Z]), evalue([N,E,U,F],Neuf), evalue([U,N],Un), evalue([O,N,Z,E],Onze), Onze =:= Neuf+Un+Un, fail. %UNE+UNE=DEUX solution([U,N,E,D,X]):- chiffres([U,N,E,D,X]), differents([U,N,E,D,X]), evalue([U,N,E],Une), evalue([D,E,U,X],Deux), Une+Une =:= Deux, fail. %CHIEN+CHASSE=GIBIER solution([C,H,I,E,N,A,S,G,B,R]):- chiffres([C,H,I,E,N,A,S,G,B,R]), differents([C,H,I,E,N,A,S,G,B,R]), evalue([C,H,I,E,N],Chien), evalue([C,H,A,S,S,E],Chasse), evalue([G,I,B,I,E,R],Gibier), Chien+Chasse =:= Gibier, fail.
Merci pour vos réponses!





Répondre avec citation



Partager