problèmme: marche d'une puce sur un tétraèdre ABCD
simuler un parcours de 4 arêtes . déterminer le sommet ateint
simuler 30 promenades _déterminer les fréquences pour chaque sommet
l'auteur pour aider ( éliminer un sommet à chaque choix ) désigne les arêtes
AB et CD par 1
AC et DB Par 2 (arêtes opposées)
BC et AD par 3
Modeste en programmation, maladroit avec "If..end" je cherche en premier le motif de base, promenade à 4 arêtes.
L'essais choisi ( celui qui semble le plus naturel ) me force à travailler
"If..end"..
les résultats me laisse perplexe. ( 11 pour A,22 pour B,33 pour C,44 pour D sont
les sommets ) les sorties (1,2,3) les trajets ( avec entAleat )
Prompt P
If P= 11
entAleat (1,3)-> A
Disp A : Pause
If A = 1 : then
22 -> P : end
If A = 2 : then
33 -> P : end
If A= 3 : then
44 -> P : end
Disp P ¹
If P= 22
entAleat (1,3)-> B
Disp B : Pause
If B = 1 : then
11 -> P : end
If B = 2 : then
44 -> P : end
If B = 3 : then
33 -> P : end
Disp P
If P= 33
entAleat (1,3)-> C
Disp : Pause
If C = 1 : then
44 -> P : end
If C = 2 : then
11 -> P : end
If C= 3 : then
22 -> P : end
Disp P
If P= 44
entAleat (1,3)-> D
Disp : Pause
If D = 1 : then
33 -> P : end
If D = 2 : then
22-> P : end
If D= 3 : then
11 -> P : end
Disp P
des Disp et des pauses pour observation
J'espère que ma ligne est claire ..
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Dim 19 Avr 2015, 20:02
Bonsoir,
J'ai du mal à comprendre à quoi correspondent D et P, et pourquoi tu dis "11 pour A,22 pour B,33 pour C,44 pour D" alors qu'avant tu parlais du codage des arrêtes...
oui: j'ai appelé sommetA:11 sommetB:22 sommetC:33 sommetD: 44 P c'est la position( un sommet)
donc P=11 ou 22 ou 33 ou 44
la sortie de entAleat(1,3) ( qui fixe le sommet futur) initialement je l'avais appelé s puis méfiant j'ai appelé
entAleat(1,3) de A -> A
entAleat(1,3) de B -> B
entAleat(1,3) de C -> C
entAleat(1,3) de D -> D
ex: s'il est en P=11 (A); si entAleat sort 1 il va en P= 22( B)
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 29 Avr 2015, 11:28
Bonjour,
Désolé pour le délai de réponse...
C'est bizarre d'appeler les sommets 11/22/33/44 plutôt que 1/2/3/4 je trouve
Pour le côté programmation:
_Numéroter les sommets "0, 1, 2, 3" pour A, B, C, D serait plus simple d'un point de vue algorithmique.
Ainsi, il suffirait de tirer un nombre entre 0 et 2, de rajouter 1 (resp 2) à la position si on a tiré 1 (resp 2), d'enlever 1 dans le cas contraire, puis de faire un modulo 4 pour récupérer la prochaine position.
_Ton programme est globalement correct, le seul problème étant l'utilisation des Then/End
Par exemple:
Code
If P= 11
entAleat (1,3)-> A
Disp A : Pause
If A = 1 : then
22 -> P : end
If A = 2 : then
33 -> P : end
If A= 3 : then
44 -> P : end
Disp P ¹
Je pense que ce que tu voulais faire, c'est : si elle est sur l’arrête A, on la déplace en le signalant.
Dans ce cas, il faut entourer le code par un Then/End suite au If P= 11.
Ensuite, Si le Then/End global était obligatoire à cause de la taille du bloc, au niveau de
Code
If A = 2 : then
33 -> P : end
C'est inutile de mettre Then/end s'il n'y a qu'une instruction éxécutée.
Ce qui nous donne finalement:
Code
If P=11
Then
entAleat (1,3)-> A
Pause A //Remplace un Disp A:Pause
If A = 1: 22 -> P
If A = 2: 33 -> P
If A = 3: 44 -> P
Disp P
End
Ensuite, tu peux sortir les "entAleat (1,3" des blocs, et utiliser à chaque fois la même variable (A par exemple), et donc aussi sortir son affichage. De même pour le Disp P, à sortir cette fois à la fin des blocs.
Ce qui nous donne finalement:
Code
Prompt P
entAleat(1,3-> A
Pause A
If P=11
Then
If A = 1: 22 -> P
If A = 2: 33 -> P
If A = 3: 44 -> P
End
If P=22
Then
If A = 1: 11 -> P
If A = 2: 33 -> P
If A = 3: 44 -> P
End
If P=33
Then
If A = 1: 11 -> P
If A = 2: 22 -> P
If A = 3: 44 -> P
End
If P=44
Then
If A = 1: 11 -> P
If A = 2: 22 -> P
If A = 3: 33 -> P
End
Disp P
Ensuite, on entoure le tout (sauf le Prompt P bien sur) avec une boucle for pour faire 4 trajets.
Et pour simuler le bon nombre de promenades, une autre boucle for qui englobe le tout (sauf le Prompt P là aussi) avec une liste pour stocker le sommet d'arrivée (divise P par 11 du coup pour obtenir un indice de liste cohérent).
J'espère que j'ai été clair, n'hésite pas à demander plus de précisions .
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Jeu 30 Avr 2015, 14:32
J'ai raconté n'importe quoi désolé ^^
Exemple: on est en A.
On tire 3 on va en D.
Mais si coup on passe par la boucle du D !
Donc on se retrouve en C...
Pour remédier a ce pb, je te suggère de séparer le point d'arrivée du point de départ :
Code
Prompt P
entAleat(1,3-> A
Pause A
If P=11
Then
If A = 1: 22 -> Q
If A = 2: 33 -> Q
If A = 3: 44 -> Q
End
If P=22
Then
If A = 1: 11 -> Q
If A = 2: 33 -> Q
If A = 3: 44 -> Q
End
If P=33
Then
If A = 1: 11 -> Q
If A = 2: 22 -> Q
If A = 3: 44 -> Q
End
If P=44
Then
If A = 1: 11 -> Q
If A = 2: 22 -> Q
If A = 3: 33 -> Q
End
En revenant sur le 1er code envisagé ( pour travailler sur les " If..end") et aussi les obsrvations ( les Disp : suivant où on les place les résultats ne sont pas ceux attendus!! avant end ? aprés end? )
Rappel
Prompt P
If P = 11
then
entAleat (1,3) -> s
Pause s
If s = 1 : 22 -> P
If s = 2 : 33 -> P
if s = 3 : 44 -> P
Pause P
End
les 3 autres blocs (22,33, 44 ) absolument identiques.
- résultats sur les 4 entrées ( nous sommes d'accord : on n'aura pas le même nombre de résultats ? )
Il y a des résultats difficiles à expliquer (?)
blocs
11(s=1) -> 22(2) ->44(3)->11 BON
11(2) -> 33(2) ->11(2)-> 22 ???
22(1)->11(1) -> 33 ??
33(3) ->22(3) ->11 ??
enfin 44(2) -> 22 BON et 44(3) -> 11 ???
Sur la ligne les 4 blocs fonctionnent "en série"? le code revient en arrière?
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Lun 04 Mai 2015, 13:10
Le code ne peut pas revenir en arrière non...
L'erreur doit être autre par...
Pour les tests, tu as bien rajoute les then/end sur chaque bloc ce qui manquait au premier code ?
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Lun 04 Mai 2015, 21:15
En fait ça ne me paraît pas possible ce que tu me décris...
Je vois si j'ai le temps de tester ce soir pas sur...
Tu as bien tous les Then/End (4 au total), et un seul if p=11 ?
Tout calcul (de liste, nombre, Chaîne, matrice) dont tu peux stocker le résultat dans une variable avec sto -> (ce qui exclu les tests/arguments) a son résultat stockée dans Ans (Rép en français, 2nde ).
Ex:
Code
13
Disp Rép
Affiche 13
"test->chaine1
Disp Rép
Affiche "test
14-2->A
If A+2=786
5
Disp Rép
Affiche 12
Text(4-A,X4,sub(chaine1,1,6Z-B
Ne modifie pas Rep
La seule exeption que je connaisse est Pause, qui modifie Rép
Ex:
Code
1->A
Pause 3-A
Disp Rép
Affiche deux fois 2 (une fois la pause une fois le disp)
j'ai refait le code (toujours le même puisque à l'écriture il est correcte )
des résultats plus cohérents semble t-il.Voici une liste tous partant de P = 11
11(3) -> 44(1) -> 33 normal -33 en sortie
11(2) -> 33(1) -> 11 ?..44 normal
11(1) -> 22(3) -> 33(1) -> 44(3) -> 11 top
11(3) -> 44(2) -> 22 normal
11(2) -> 33(2) -> 11 se bloque
11(2) -> 33(3) -> 22 se bloque
11(3) -> 44(2) -> 22 normal 22 en sortie
11(2) -> 33(1) -> 44(3) -> 11 normal
11(1) -> 22(2) -> 44(2) -> 22 normal
es_tu d'accord?
Rq:
quand on écrit un code si la proposition est longue la TI va à la ligne mais ne met pas les 2 points ,on laisse ou il faut mettre les 2 points?
Ici on a étudié le code de base. Si on veut une ballade de 30 sauts, il faudra For, celà va être "coton",le compteur C+1 -> C va concerner toutes les lignes?
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 06 Mai 2015, 21:03
Oui ces résultats sont cohérents avec le code.
Pour ta rq: les ":" marquent non pas un retour a la ligne mais un début d'instruction. Il ne faut pas en rajouter au milieu lorsque la ti va a la ligne (il s'agit juste d'un affichage).
On est bien d'accord que ce code n'est pas le bon, que celui qui est correct est celui avec la variable intermédiaire Q ?
Je ne comprends pas ta question a propos du compteur.
Si tu as une boucle for, il est incrémenté a chaque début de ligne.
* heureux que la lecture des résultats soit correcte!..je prends tout ce que je peux!
1 - à propos des " : " merci! , voilà une source d'erreur possible que j'ai dû commettre.
2 - oui car je me demandais avec ce code s'il fallait For ( où on sait le nombre à mettre ) ou While (où on sait certes le nombre total de sauts mais pas le nombre de sauts par tour du code).
3 - " On est bien d'accord que ce code n'est pas le bon, que celui qui est correct est celui avec la variable intermédiaire Q ? " dis-tu.
Pourquoi dis-tu celà,je ne comprends pas. Le 2ème code marche aussi. Bien sûr on ne pourra utiliser le For.( je n'ai pas fait d'essais à cet instant)
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Jeu 07 Mai 2015, 14:00
Ce code justement n'est pas prévisible :trop dur de gérer le nombre d'arêtes parcourues.
L'autre code est plus simple de ce point de vue: il suffit de mettre une boucle for.
D'accord , si c'est à cause de la complexité des trajets ( voir les résultats des essais).
Merci Mathieu pour ce travail. 2 points de vue c'est mieux.Beaucoup de choses ont été remise en place.
pour conclure, peux tu me montrer le code que toi tu ferais avec tes choix. Si tu fais des optimisations ( je me souviens de celles que toi et linkakro aviez réalisées sur certains codes.Il y avait un coté esthétique,c'était super.) explique.
merci encore.
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Jeu 07 Mai 2015, 21:52
Il n'est pas non plus impossible de le faire. Je ne suis pas sur que les résultats soient plus rapide par contre...
2 choses a prendre en compte: comme tu l'as dit il faut faire un while, avec un compteur, qui s'incremente a l'intérieur de chacun des 4 blocs If.
Il faut aussi faire attention au fait que on peut faire le dernier trajet en partant du point A. On est alors sur de faire un trajet en trop (puisque les autres blocs suivent). Une solution serait de rajouter un "If P=22 and C!=T" avec T le nombre de trajets voulus et C le compteur des trajets. (de même pour 33 et 44.
Pour vraiment optimiser je prendrai un point de vue un peu différent.
J'associrai:
0 a A
1 a B
2 a C
3 a D
Plus précisément, j'utilise les modulo :
Si le nombre est congru a 0 modulo 4, on est en A. Idem pour congru a 1 B etc.
Je tire un nb aléatoire entre 1 et 3 qui correspond au déplacement.
Donc en rajoutant le nombre tire a la position, en considérant les modulos, je change bien de sommet avec equiprobabilite de tomber sur les 3 autres.
Je fais ceci le nb de fois voulus.
Puis il me suffit de regarder modulo 4 (4partDec(.25P)) pour avoir la position finale.
Code
Prompt P
For(A,1,X //X le nb de trajets par expérience
P+entAleat(1,3->P
//Disp 4partDec(.25P //optionnel, si tu veux suivre l'évolution
End
Disp 4partDec(.25P
On peut même les tirer tous d'un coup en passant un 3e argument a entAleat: le nombre de nombres aléatoire, le résultat est alors une liste, il suffit de sommer.
Ex: entAleat(1,5,3 peut renvoyer {1,4,4,3,2} par exemple.
On obtient :
Code
Prompt P
Disp 4partDec(.25(P+somme(entAleat(1,3,X
Mais on ne peut plus suivre le parcourt... Juste le résultat final.
Ensuite pour faire N fois l'expérience (une expérience = X trajets a partir du même point de départ.
J exploite la fonction seq)(suite en français) qui a la syntaxe :
suite(expr,var,depart,fin[,pas]
Qui construit une liste avec, pour le i ème terme, le résultat du calcul de expr après avoir incrémenté la variable var de pas, et ce tant que var<fin
Ex: suite(X^2,X,1,4
Renvoi:
{1,4,9,16}
Ici, j'ai juste besoin de faire N fois le même calcul (mais qui renvoi des valeurs différentes grâce aux fonctions pseudo aléatoires).
Ce qui donne :
Code
Prompt P
Disp suite(4partDec(.25(P+somme(entAleat(1,3,X))),A,1,N
Je peux aussi sortir certains calculs de la fonction suite (on peut multiplier une liste par un entier, additionner sans pb):
Code
Prompt P
Dsip 4partDec(.25(P+suite(somme(entAleat(1,3,X)),A,1,N
Ça économise des parenthèses, je ne sais pas ce qui est le plus rapide...
Voili voilou, heureux d'avoir pu t'aider
Si tu as besoin de précisions sur certains points n'hésite pas bien sur.
Quand je suis rentré hier soir et que j'ai vu ton message j'ai pris un coup au moral! c'était de l'hébreu!..les congruences!! celà faisait un moment..
J'ai revue un peu la question,il semble que celà aille mieux.
Je me concentrerai uniquement sur le 1er code de ton message ( sur le nouvel aperçu je ne suis pas déçu!!)
ai-je bien compris:
- ton Disp donne le sommet obtenu à chaque saut
- j'ai ajouté un Pause P
2 essais donnent(X = 4 )
départ 0(A)
ton Disp: 3, 2, 3, 0
pause P :3, 6, 7, 8
ma lecture D, C, D, A (je tire mes résultats aprés calculs, honnètement!)
départ 1
ton Disp:0, 1, 0, 1
pause P: 4, 5, 8, 9
soit A, B, A, B ( 4/4 reste 0 , 5/4 reste 1 , 8/4 reste 0)
Je suis vraiment très satisfait.Ce dernier code est superbe. Je ne regrette pas les révisions forcées sur modulo et congruences!.. Bien sûr pour les élèves ce sera celui à 1 entAleat que je prendrai. Il est parfait.
Le code suivant:
" Disp 4partDec(.25(P+somme(entAleat(1,3,X "
tu fais la somme des X valeurs que donne entAléat ?
- la commande " somme " se trouve -t-elle dans une rubrique de la face avant ou est-on obligé d'aller dans Catalogue et comme le " s " est à la fin...Je ne l'ai pas trouvée dans les rubriques.
- je te soumets toujours , de principe, mes essais.
Ayant ajouté un Disp pour P; voici un essais ( but: remonter à sortie de entAléat(1,3 )
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Ven 15 Mai 2015, 23:26
La commande somme est dans le menu des listes.
Je te dis la combinaison exacte des que j'ai une calto sous la main.
Pour le catalogue: appuyer sur une touche permet d'aller directement aux commandes commençant par la lettre de la touche.
Je suis d'accord avec tes tests, sauf le début de l'expérience que je ne comprends pas... Tu commences au sommet 1? Pourquoi le premier nombre aléatoire serait 2?
quand au 2 ème code (avec somme(entAléat(1,3,7) reviendrait avec le même départ à 1 et les même entAléat( supposons):
somme= 1+3+3+3+1+1+3= 15 donc position de fin: ( 15+ 1 du départ)*1/4 donne
position finale: 0 comme la liste de sortie. C'est pourquoi il donnerais que la position finale.
Ce que demandent d'ailleurs certain éxos ( Proba d'arrivée sur chaque sommet)
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Jeu 21 Mai 2015, 22:51
N est le nombre d'expériences a réaliser.
A correspond, en terme d equivalent dans une boucle, au numero de l'expérience en cours (il n'influe donc pas sur l'expérience).
P est fixé comme le sommet de départ pour toutes les N expériences.
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 27 Mai 2015, 21:05
Sommes nous d'accord sur :
Une expérience: parcourt de X arretes, avec pour resultat le sommet d'arrivée.
Du coup on veut effectuer N fois cette expérience, en partant a chaque fois du même sommet.
Ainsi :
4partDec(.25(P+somme(entAleat(1,3,X)))
Realise une expérience, a partir du sommet P, sans modifier les données.
suite(expr,A,debut,fin[,incrément=1]
Permet de realiser une suite dont chaque terme est évalué pour une valeur de A differente (en la faisant varier de debut a fin, selon l incrément si indiqué, 1 par défaut).
Si expr est indépendant de A:
suite(expr,A,1,N
Permet de créer une liste de N termes dont tous les termes vaudront l évaluation de expr.
Dans un cas standard, ça donne une liste de N fois le meme nombre.
Dans notre cas, on a de l aleatoire, donc la valeur prise par expr varie, quand bien même elle ne depend pas réellement de A.
Ainsi,expr(4partDec(.25(P+somme(entAleat(1,3,X))),A,N
Permet de realiser N fois l expérience, et de renvoyer le résultat sous forme de liste.
A ne signifie rien de concret (si tu veux c'est le compteur qui permet de savoir le numéro de l expérience en cours, comme dans une boucle for qui realiserait les expériences). Elle est muette, puisque le résultat de l expérience ne depend pas de son numéro.
1 - à ta question
Sommes nous d'accord sur :
Une expérience: parcourt de X arêtes, avec pour résultat le sommet d'arrivée.
Du coup on veut effectuer N fois cette expérience, en partant a chaque fois du même sommet.
Ainsi :
4partDec(.25(P+somme(entAleat(1,3,X)))
Realise une expérience, a partir du sommet P, sans modifier les données.
D'accord MAIS " sans modifier les données" la seule donnée c'est P le sommet de départ?
2 - Si expr est indépendant de A:
suite(expr,A,1,N
Permet de créer une liste de N termes dont tous les termes vaudront l évaluation de expr.
Dans un cas standard, ça donne une liste de N fois le même nombre.
des essais avec le même argument (N= 5): TI (refuse l' argument)
- essais (analogie) pour voir:
suite(x^2, A, 1, 3 donne (4, 4, 4 ) A varie ? comment expliques-tu 3 fois 4 ?
3 termes d'accord ( N=3)
Enfin tout est clair mais cette erreur m'a permis de mieux comprendre les choses .J'en ai fait des essais!! mais tous était dirigés vers les arguments de
suite( x^2, x,1, 5) ou suite (x^2,A,1,5 et suite( "notre fct Disp",A,1,5.
Mathieu,bilan impeccable. Tu as fait tout ce que je souhaitais . Mis au point des 2 premiers codes et ensuite ballade dans les optimisations et quelle ballade: plus d'une page traduit en une ou 2 lignes!
Et des commandes en plus: entAleat (1,3,X (j'ignorais la possibilité de faire une liste(X)et les opérations..
et suite (fct, x, deb, fin)!!
Merci pour tout ce travail et ta bienveillance permanente. Merci.