valeurs aléatoires et réponses identiques

Added by guillaume r. over 3 years ago

Bonjour,

Avec AMC, je fais des interros comportant des valeurs aléatoires calculées parfois avec le package fp parfois avec python (via pythontex). Et il arrive (lorsque j'anticipe mal l'intervalle ou bien suite à des arrondis) que j'obtienne des réponses (bonne et mauvaise!) identiques.

Je cherche donc un moyen des tester pour chaque question s'il y a parmi les réponses des valeurs identiques.

Ma première idée était d'écrire ce test dans chaque environnement question et de le faire avec l'une des commandes \IfEq ou \IfEqCase du package xstring mais cela alourdit considérablement le code.

Une deuxième idée m'est venue, mais je ne vois pas du tout comment la mettre en place. Cela consisterait à automatiser le test pour que dans chaque définition d'une question :

- on enregistre toutes les réponses (bonnes et mauvaises) de cette question ;

- puis on compare toutes ces réponses.

En fait, je ne vois pas comment gérer le possible nombre différent de réponses d'une question à l'autre (peut être en le donnant en argument ?) ni même quelle genre de boucle faire pour pouvoir tester les réponses deux à deux.

Peut être avez vous d'autres idées, ou bien des pistes pour me faire avancer...

En vous remerciant!


Replies (8)

RE: valeurs aléatoires et réponses identiques - Added by guillaume r. over 3 years ago

Merci Gérard pour cette piste que je vais explorer de ce pas..

Effectivement, à première vue je ne comprends pas (ou plutôt ne connais pas) le début du code, mais comme convenu je ne poserai pas de question!!

Encore merci et à bientôt

RE: valeurs aléatoires et réponses identiques - Added by Frédéric Bréal over 3 years ago

je ne comprends pas

Moi non plus, je sais juste que c'est du code latex3.
Ma phrase pouvait porter à confusion sur un mépris ou dédain mais non, juste une mauvaise formulation du soir.

RE: valeurs aléatoires et réponses identiques - Added by guillaume r. over 3 years ago

Ma phrase pouvait porter à confusion sur un mépris ou dédain

Non non pas de problème, je n'avais pas mal interprété votre réponse.

J'ai donc utilisé la piste donnée en suivant ma deuxième idée :
  • lors de la définition d'une réponse (bonne ou mauvaise) on enregistre celle-ci à l'aide d'un compteur ;
  • à la sortie de l'environnement reponses on effectue alors le test sur toutes les réponses enregistrées ;
  • dans le cas où il y a des réponses identiques un encadré s'affiche dans la marge.

Cela fonctionne pour des valeurs calculées avec fp ou pgf mais pas en python (mais dans ce cas on peut faire le test directement en python).

Le test n'est ici valable que lorsqu'il y a 5 réponses au total mais peut facilement se réécrire pour un nombre différent (càd refaire d'autres commandes). Il y a certainement moyen de creuser encore un peu pour pouvoir par exemple donner le nombre de réponses en argument de ce test et faire en sorte qu'il s'adapte, mais pour le moment je me contenterai de cela!

Pour qui cela intéresse je joins mes fichiers...

Bonne journée

RE: valeurs aléatoires et réponses identiques - Added by guillaume r. over 3 years ago

J'ai creusé un peu et voici une façon de répondre à la problématique de ce post :

  • le code donné par Gérard pour (du peu que j'en comprenne!) créer de quoi faire plusieurs tests booléens et d'expressions avec le package xparse:
    \ExplSyntaxOn
    \DeclareExpandableDocumentCommand{\booltest}{mmm}
     {
      \bool_if:nTF { #1 } { #2 } { #3 }
     }
    \DeclareExpandableDocumentCommand{\fpcompare}{m}
     {
      \fp_compare_p:n { #1 }
     }
    \ExplSyntaxOff
    
  • deux commandes \Bonne[]{} et \Mauvaise[]{} pour pouvoir enregistrer les réponses au moment de leur définition, à l'aide d'un compteur et du package etoolbox :
    \newcounter{rep}
    \newcommand{\Bonne}[2][]{\bonne[#1]{#2}\stepcounter{rep} \global\csdef{Rep\therep}{#2}}
    \newcommand{\Mauvaise}[2][]{\mauvaise[#1]{#2}\stepcounter{rep} \global\csdef{Rep\therep}{#2}}
    
  • le test des réponses enregistrées (entre 2 et 9 réponses) qui affichera un encadré dans la marge en cas de réponses identiques :
    \newcommand{\TestReponses}{
    \booltest{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}
    ||  \booltest{\fpcompare{\therep>2}}
        {\fpcompare{\csuse{Rep1} = \csuse{Rep3}} || \fpcompare{\csuse{Rep2} = \csuse{Rep3}}}{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}
    ||  \booltest{\fpcompare{\therep>3}}
        {\fpcompare{\csuse{Rep1} = \csuse{Rep4}} || \fpcompare{\csuse{Rep2} = \csuse{Rep4}} || \fpcompare{\csuse{Rep3} = \csuse{Rep4}}}{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}     
    ||  \booltest{\fpcompare{\therep>4}}
    {\fpcompare{\csuse{Rep1} = \csuse{Rep5}} || \fpcompare{\csuse{Rep2} = \csuse{Rep5}} || \fpcompare{\csuse{Rep3} = \csuse{Rep5}} || \fpcompare{\csuse{Rep4} = \csuse{Rep5}}}{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}
    ||  \booltest{\fpcompare{\therep>5}}
    {\fpcompare{\csuse{Rep1} = \csuse{Rep6}} || \fpcompare{\csuse{Rep2} = \csuse{Rep6}} || \fpcompare{\csuse{Rep3} = \csuse{Rep6}} || \fpcompare{\csuse{Rep4} = \csuse{Rep6}} || \fpcompare{\csuse{Rep5} = \csuse{Rep6}}}{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}%
    ||  \booltest{\fpcompare{\therep>6}}
    {\fpcompare{\csuse{Rep1} = \csuse{Rep7}} || \fpcompare{\csuse{Rep2} = \csuse{Rep7}} || \fpcompare{\csuse{Rep3} = \csuse{Rep7}} || \fpcompare{\csuse{Rep4} = \csuse{Rep7}} || \fpcompare{\csuse{Rep5} = \csuse{Rep7}} || \fpcompare{\csuse{Rep6} = \csuse{Rep7}} }{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}
    ||  \booltest{\fpcompare{\therep>7}}
    {\fpcompare{\csuse{Rep1} = \csuse{Rep8}} || \fpcompare{\csuse{Rep2} = \csuse{Rep8}} || \fpcompare{\csuse{Rep3} = \csuse{Rep8}} || \fpcompare{\csuse{Rep4} = \csuse{Rep8}} || \fpcompare{\csuse{Rep5} = \csuse{Rep8}} || \fpcompare{\csuse{Rep6} = \csuse{Rep8}} || \fpcompare{\csuse{Rep7} = \csuse{Rep8}}}{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}%
    ||  \booltest{\fpcompare{\therep>8}}
    {\fpcompare{\csuse{Rep1} = \csuse{Rep9}} || \fpcompare{\csuse{Rep2} = \csuse{Rep9}} || \fpcompare{\csuse{Rep3} = \csuse{Rep9}} || \fpcompare{\csuse{Rep4} = \csuse{Rep9}} || \fpcompare{\csuse{Rep5} = \csuse{Rep9}}  || \fpcompare{\csuse{Rep6} = \csuse{Rep9}} || \fpcompare{\csuse{Rep7} = \csuse{Rep9}} || \fpcompare{\csuse{Rep8} = \csuse{Rep9}}}{\fpcompare{\csuse{Rep1} = \csuse{Rep2}}}
    }
    {\marginpar{\raisebox{1cm}{\fbox{\bf Achtung!}}}}
    {}
    }
    
  • une commande \Element{}{} pour créer les questions/réponses à la manière d'AMC et dans laquelle le test des réponses s'effectue à la fin :
    \newcommand{\Element}[2]{\element{#1}{\setcounter{rep}{0}#2\TestReponses}}
    

J'imagine que cela ralentit pas mal la compilation mais cela me permettra plus facilement de détecter mes étourderies de conception de sujets avec valeurs aléatoires!!!

à bientôt!

RE: valeurs aléatoires et réponses identiques - Added by Frédéric Bréal over 3 years ago

Le principe de \whiledo

\whiledo{\value{sortie}=0}{ 
\booltest{
…
}
 {\relax}%on ne fait rien donc sortie =0
 {\setcounter{sortie}{1}}
}%%%whiledo

c'est de laisser AMC tourner en boucle la génération de nombre aléatoire jusqu'à ce que le compteur sortie =1 soit tous les nombres sont différents donc vous n'avez pas à relancer le sujet.

RE: valeurs aléatoires et réponses identiques - Added by guillaume r. over 3 years ago

ok, mais dans ce cas je pense qu'il faut inclure dans cette boucle les \FPeval (ce n'était pas le cas dans votre exemple).

De plus, c'est peut être une mauvaise façon de faire, mais lorsque je compose un tel sujet, je fais tirer au hasard dans ma définition de question (càd dans le deuxième argument de la commande \element) et non toutes les valeurs du sujet au début. Du coup avec cette boucle \whiledo il faudrait la réécrire à chaque fois.

Ma "bidouille" me convient parfaitement dans la mesure où les quelques fois où j'ai eu des soucis de réponses identiques, cela concernait 2 ou 3 sujets sur 40 et puisque j'en imprime toujours au moins 10 de plus que mon nombre d'élèves par classe je peux me permettre de laisser les énoncés avec ou sans l'avertissement dans la marge et de mettre de côté "les mauvais" lors de la distribution en classe...

RE: valeurs aléatoires et réponses identiques - Added by Frédéric Bréal over 3 years ago

(ce n'était pas le cas dans votre exemple)

ha oui, vous avez raison. Il faudrait le mettre à la place du relax.

(1-8/8)