 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
F0rM
Inscrit le: 01 Mai 2006 Messages: 15
|
Posté le: 02 Fév 2007 2:09 Sujet du message: jeu des 1 et des 2, pas facile ! |
|
|
salut, jaimerais savoir s'il y a un bon samaritain qui pourrait me dire comment on fait pour générer cette procédure.
Le jeu débute
1
1 1
2 1
1 2 1 1
1 1 1 2 2 1
3 1 2 2 1 1
1 3 1 1 2 2 2 1
1 1 1 3 2 1 3 2 1 1
etc... quand apparaitra le chiffre 4 ?
merci beaucoup a tlm ! |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 02 Fév 2007 13:16 Sujet du message: |
|
|
Bonjour,
Chaque terme de la suite sur une ligne énumère la suite de la ligne précédente, et se lit par tranches de 2 chiffres .
Le terme "1 3 1 1 2 2 2 1" se lit "1 3 - 1 1 - 2 2 - 2 1", ce qui signifie que le terme précédent est composé
- d'une occurrence du chiffre 3
- suivie d'une occurrence du chiffre 1
- suivie de deux occurrences du chiffre 2
- suivie de deux occurrences du chiffre 1
Le terme suivant celui que vous avez donné est donc
3 1 1 3 1 2 1 1 1 3 1 2 2 1
Maintenant il ne reste plus qu'à programmer ceci...
Code: |
> occurence := proc (s::string)
local i, c;
if s = "" then error "chaine vide" end if;
i := 1; c := s[i]; t := "";
while i <= length(s) do
nb := 0;
while s[i] = c do nb := nb+1; i := i+1; end do;
t := cat(t, nb, c);
c := s[i]
end do;
t
end proc;
> occurence("1");
"11"
> occurence(%);
"21"
> occurence(%);
"1211"
> occurence(%);
"111221"
> occurence(%);
"312211"
> occurence(%);
"13112221"
> occurence(%);
"1113213211"
> occurence(%);
"31131211131221"
> occurence(%);
"13211311123113112211"
> occurence(%);
"11131221133112132113212221"
> occurence(%);
"3113112221232112111312211312113211"
|
Jamais de 4 donc ... |
|
Revenir en haut de page |
|
 |
F0rM
Inscrit le: 01 Mai 2006 Messages: 15
|
Posté le: 03 Sep 2007 20:07 Sujet du message: |
|
|
Bonjour maitre ALS, j'aimerais savoir comment on peut etre sur qu'il n'y aura jamais de 4 dans la suite logique ? Il faudrait mettre un index qu'on définit auparavant comme par exemple n = 1000 (n étant le nombre de fois qu'on exécute la procédure occurence) et ensuite tester si dans ces lignes il n'y aurait pas un 4. En principe , il faudrait aller jusqu'à l'infini ou un très très grand nombre pour s'en assurer ?
Qu'en dis-tu ?
Merci bcp
F0rM |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 04 Sep 2007 13:20 Sujet du message: |
|
|
Bonjour, oui effectivement pour tester la présence d'un éventuel 4, il suffit de rajouter une ligne de la manière suivante
> occurence := proc (s::string)
............. # inchangé
if StringTools[Search]("4",t)>0 then print("la chaine contient 4") end if;
t
end proc;
A+ |
|
Revenir en haut de page |
|
 |
cormier
Inscrit le: 09 Sep 2007 Messages: 6
|
Posté le: 10 Sep 2007 9:16 Sujet du message: |
|
|
bonjour,voici une procédure:sf qui s'arrete quand on retrouve une meme sequence.
sf:=proc(l);A:=[l];while(1=1) do B:=[];C:=[];for ki from 1 to nops(A[nops(A)]) do if not(member(A[nops(A)][ki],B)) then a:=0;for i from 1 to nops(A[nops(A)]) do if A[nops(A)][i]=A[nops(A)][ki] then a:=a+1;fi;od;B:=[op(B),A[nops(A)][ki]];C:=[op(C),a,A[nops(A)][ki]];fi;od;if not(member(C,A)) then A:=[op(A),C] else break;fi od;D:=([seq([op(A[i]),seq(``,j=1..max(seq(nops(A[k]),k=1..nops(A)))-nops(A[i]))],i=1..nops(A))]);return(matrix(D));end;`Warning, \`A\` is implicitly declared local to procedure \`sf\`\n`
`Warning, \`B\` is implicitly declared local to procedure \`sf\`\n`
`Warning, \`C\` is implicitly declared local to procedure \`sf\`\n`
`Warning, \`ki\` is implicitly declared local to procedure \`sf\`\n`
`Warning, \`a\` is implicitly declared local to procedure \`sf\`\n`
`Warning, \`i\` is implicitly declared local to procedure \`sf\`\n`
`Warning, \`D\` is implicitly declared local to procedure \`sf\`\n`
sf := proc(l)
local A, B, C, ki, a, i, D;
A := [l];
while 1 = 1 do
B := [];
C := [];
for ki to nops(A[nops(A)]) do
if not member(A[nops(A)][ki], B) then
a := 0;
for i to nops(A[nops(A)]) do
if A[nops(A)][i] = A[nops(A)][ki] then
a := a + 1
end if
end do;
B := [op(B), A[nops(A)][ki]];
C := [op(C), a, A[nops(A)][ki]]
end if
end do;
if not member(C, A) then A := [op(A), C]
else break
end if
end do;
D := [seq([op(A[i]), seq(``, j = 1 ..
max(seq(nops(A[k]), k = 1 .. nops(A))) - nops(A[i]))]
, i = 1 .. nops(A))];
return matrix(D)
end proc
> sf([0]);
[0 ]
[ ]
[1 0 ]
[ ]
[1 1 1 0 ]
[ ]
[3 1 1 0 ]
[ ]
[1 3 2 1 1 0 ]
[ ]
[3 1 1 3 1 2 1 0 ]
[ ]
[2 3 4 1 1 2 1 0 ]
[ ]
[2 2 1 3 1 4 3 1 1 0]
[ ]
[2 2 4 1 2 3 1 4 1 0]
[ ]
[3 2 2 4 3 1 1 3 1 0]
[ ]
[3 3 2 2 1 4 3 1 1 0]
[ ]
[3 3 2 2 3 1 1 4 1 0] |
|
Revenir en haut de page |
|
 |
cormier
Inscrit le: 09 Sep 2007 Messages: 6
|
Posté le: 10 Sep 2007 10:52 Sujet du message: correction de sf2 |
|
|
excusez moi :la procédure que j'ai faite détermine le nombre total de l'élément dans la séquence .
voici la procédure sf2 qui répond au problème.sf3 determine l'ensemble des séquences jusqu'a ce qu'on en retrouve une.
avec sf2 on peut arreter au k ieme rang.
sf2:=proc(l0,n);x:=1;B:=[l0];while(1=1) do l:=B[nops(B)];A:=[];i:=1;while(i<=nops(l)) do a:=0;for ki from i to nops(l) do if l[ki]<>l[i] then break;else a:=a+1;fi;od;A:=[op(A),a,l[i]];i:=i+a;od;if not(member(A,B)) and x<>n then B:=[op(B),A];x:=x+1;else break;fi;od;return(matrix([seq([B[j]],j=1..nops(B))]));end;
Warning, `x` is implicitly declared local to procedure `sf2`
Warning, `B` is implicitly declared local to procedure `sf2`
Warning, `l` is implicitly declared local to procedure `sf2`
Warning, `A` is implicitly declared local to procedure `sf2`
Warning, `i` is implicitly declared local to procedure `sf2`
Warning, `a` is implicitly declared local to procedure `sf2`
Warning, `ki` is implicitly declared local to procedure `sf2`
sf2 := proc(l0, n)
local x, B, l, A, i, a, ki;
x := 1;
B := [l0];
while 1 = 1 do
l := B[nops(B)];
A := [];
i := 1;
while i <= nops(l) do
a := 0;
for ki from i to nops(l) do
if l[ki] <> l[i] then break
else a := a + 1
end if
end do;
A := [op(A), a, l[i]];
i := i + a
end do;
if not member(A, B) and x <> n then
B := [op(B), A]; x := x + 1
else break
end if
end do;
return matrix([seq([B[j]], j = 1 .. nops(B))])
end proc
> sf2([1],4);
[ [1] ]
[ ]
[ [1, 1] ]
[ ]
[ [2, 1] ]
[ ]
[[1, 2, 1, 1]]
> sf3:=proc(l0,n);B:=[l0];while(1=1) do l:=B[nops(B)];A:=[];i:=1;while(i<=nops(l)) do a:=0;for ki from i to nops(l) do if l[ki]<>l[i] then break;else a:=a+1;fi;od;A:=[op(A),a,l[i]];i:=i+a;od;if not(member(A,B)) then B:=[op(B),A];else break;fi;od;return(matrix([seq([B[j]],j=1..nops(B))]));end;
Warning, `B` is implicitly declared local to procedure `sf3`
Warning, `l` is implicitly declared local to procedure `sf3`
Warning, `A` is implicitly declared local to procedure `sf3`
Warning, `i` is implicitly declared local to procedure `sf3`
Warning, `a` is implicitly declared local to procedure `sf3`
Warning, `ki` is implicitly declared local to procedure `sf3`
sf3 := proc(l0, n)
local B, l, A, i, a, ki;
B := [l0];
while 1 = 1 do
l := B[nops(B)];
A := [];
i := 1;
while i <= nops(l) do
a := 0;
for ki from i to nops(l) do
if l[ki] <> l[i] then break
else a := a + 1
end if
end do;
A := [op(A), a, l[i]];
i := i + a
end do;
if not member(A, B) then B := [op(B), A]
else break
end if
end do;
return matrix([seq([B[j]], j = 1 .. nops(B))])
end proc |
|
Revenir en haut de page |
|
 |
F0rM
Inscrit le: 01 Mai 2006 Messages: 15
|
Posté le: 15 Sep 2007 4:51 Sujet du message: |
|
|
en réponse a cormier, ta procédure sf3 je sais pas comment l'utiliser, ya bcp de trucs la dedans, comment je pourrais massurer qu'il n'y aura jamais de 4 ??
Merci de ton aide, F0rM |
|
Revenir en haut de page |
|
 |
cormier
Inscrit le: 09 Sep 2007 Messages: 6
|
Posté le: 15 Sep 2007 20:09 Sujet du message: jeu des 1 et 2 |
|
|
il faut corriger: il n'y a pas de n n ecrit sf3:=proc(l);(etc......)
pour executer sf3 tu ecris: par ex sf3([1]); [1] est la séquence initiale.
sf3 s'execute jusqu'a ce qu' on retrouve une sequence qui a deja été mise ,ainsi on a toutes les séquences possibles qu'on peut avoir.
on regarde parmi celles-ci si il y a un 4 ou non.
le problème est que ca dure longtemps et je n'ai pas trouvé d'autres moyens pour déterminer la présence du 4. |
|
Revenir en haut de page |
|
 |
cormier
Inscrit le: 09 Sep 2007 Messages: 6
|
Posté le: 15 Sep 2007 20:52 Sujet du message: |
|
|
voici une procédure qui dit si il y aura un certain nombre x:
sf4:=proc(l0,x);r:=0;B:=[l0];while(1=1) do l:=B[nops(B)];A:=[];i:=1;while(i<=nops(l)) do a:=0;for ki from i to nops(l) do if l[ki]<>l[i] then break;else a:=a+1;fi;od;A:=[op(A),a,l[i]];i:=i+a;od;if not(member(A,B)) and not(member(x,A)) then B:=[op(B),A];else r:=1;break;fi;od;if r=1 and not(member(A,B)) then printf("il y a un %d\n",x);else printf("il n'y a pas de %d\n",x);fi;end;
on fait sf4([1],4); [1] est la séquence initiale ,4 est le nombre dont on veut tester la présence dans les séquences.
cette procédure dure longtemps (j'ai appuyer sur stop). |
|
Revenir en haut de page |
|
 |
cormier
Inscrit le: 09 Sep 2007 Messages: 6
|
Posté le: 15 Sep 2007 21:51 Sujet du message: reponse |
|
|
si il y avait par exemple un 4 a la sequence 3 ,alors a la sequence 2 d'avant on aurait par exemple 1111 c'est a dire x1111y (cas ou il y a un chiffre avant 1 ) avec x et y different de 1 et donc on aurait a la séquence 1 (d'avant cette derniere) :seq(1,i=1..x),1,y et donc on aurait a la sequence 2 x+1),1,1,y et d'apres ce que j'ai dit avant ,on aurait aussi a la sequence 2:x1111y donc on aurait : (x+1),1,1,y=x,1,1,1,1,y c'est ABSURDE donc:
ccl1:si il y a un chiffre avant le 1 ,alors absurde
ccl2:si on a 1111y (:pas de chiffre devant le 1) a la sequence 2,alors a la sequence 1 on a une impossibilité donc on a pas 1111y)=>on a pas (pas de chiffre avant le 1).
donc il y a un 4 =>il y a un chiffre avant le 1=>ABSURDE.
donc il ne peut pas y avoir de 4.
on peut faire ce raisonnement avec un autre chiffre que 1:
on aurait a+x),a,a,y=x,a,a,a,a,y (1er cas) ( on a a la sequence 1: seq(a,i=1..x),seq(a,i=1..a),seq(y,i=1..a))
et 2ieme cas :impossibilité aussi.
dans mon explication la notation sequence "3 ,2,1" veut dire n,n+1,n+2 tt n. a la sequence 1 (reelle) et 2 on a pas 4. tt n>=1 on a pas 4 a la sequence n+2 cad tt n>=3 on a pas 4 a la sequence n.
DONC:tt n>=1 on a pas 4 a la sequence nn n'a jamais 4.
Dernière édition par cormier le 16 Sep 2007 8:51; édité 2 fois |
|
Revenir en haut de page |
|
 |
F0rM
Inscrit le: 01 Mai 2006 Messages: 15
|
Posté le: 19 Sep 2007 15:48 Sujet du message: |
|
|
Salut Cormier, ta procédure sf4 ne fonctionne pas dans maple 8 ni maple 11, i y a un probleme de KERNEL, cette procédure bouffe toute la mémoire vive du processeur et génère des erreurs. On doit alors fermer maple et le réouvrir.
J'aimerais savoir aussi comment on peut s'assurer que ta procédure arrête éventuellement ?? Car ta boucle while va tester tant et aussi longtemps qu'on aura pas trouver de 4 dans la séquence, mais ca peut aller jusqu'à l'infini. À mon avis, il doit manquer un critère d'arret et/ou de convergence, faudrait en parler a maitre ALS peut etre.
Merci de votre aide, F0rM |
|
Revenir en haut de page |
|
 |
cormier
Inscrit le: 09 Sep 2007 Messages: 6
|
Posté le: 19 Sep 2007 18:44 Sujet du message: |
|
|
tu devrais lire mon avant-dernier message(reponse)
j'y ai démontré qu'il n'y pas de 4.(je ne suis pas passé par maple)
ma procédure sf4 s'arrete quand elle trouve un 4 ou une séquence qu'elle a déja eue.
le problème est que si il n'y a pas de 4 et que le nombre de séquences possibles est infinie elle ne s'arrete pas.
j'ai écrit sf4 sous maple 7 et elle "fonctionne" sous maple 7(pas d'erreurs mais marche a l'infinie).maple 7 déclare les variables automatiquement.il faut peut etre les déclarer comme local sous maple 8 ou 11. |
|
Revenir en haut de page |
|
 |
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com
Apprendre Maple - ©
- Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.
|