Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

jeu des 1 et des 2, pas facile !

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
F0rM



Inscrit le: 01 Mai 2006
Messages: 15

MessagePosté le: 02 Fév 2007 2:09    Sujet du message: jeu des 1 et des 2, pas facile ! Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 02 Fév 2007 13:16    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
F0rM



Inscrit le: 01 Mai 2006
Messages: 15

MessagePosté le: 03 Sep 2007 20:07    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 04 Sep 2007 13:20    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
cormier



Inscrit le: 09 Sep 2007
Messages: 6

MessagePosté le: 10 Sep 2007 9:16    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
cormier



Inscrit le: 09 Sep 2007
Messages: 6

MessagePosté le: 10 Sep 2007 10:52    Sujet du message: correction de sf2 Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
F0rM



Inscrit le: 01 Mai 2006
Messages: 15

MessagePosté le: 15 Sep 2007 4:51    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
cormier



Inscrit le: 09 Sep 2007
Messages: 6

MessagePosté le: 15 Sep 2007 20:09    Sujet du message: jeu des 1 et 2 Répondre en citant

il faut corriger: il n'y a pas de n Surprisedn 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
Voir le profil de l'utilisateur Envoyer un message privé
cormier



Inscrit le: 09 Sep 2007
Messages: 6

MessagePosté le: 15 Sep 2007 20:52    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
cormier



Inscrit le: 09 Sep 2007
Messages: 6

MessagePosté le: 15 Sep 2007 21:51    Sujet du message: reponse Répondre en citant

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 1Mad) 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 2Sadx+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 Sada+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
Voir le profil de l'utilisateur Envoyer un message privé
F0rM



Inscrit le: 01 Mai 2006
Messages: 15

MessagePosté le: 19 Sep 2007 15:48    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
cormier



Inscrit le: 09 Sep 2007
Messages: 6

MessagePosté le: 19 Sep 2007 18:44    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
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


phpBB

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.