From 67cb5b02417a6f2b4e328ae9aa35d1a90eff7884 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Jameux Date: Mon, 8 Nov 2021 11:45:31 +0100 Subject: [PATCH] =?UTF-8?q?G=C3=A9n=C3=A9rateur=20de=20sujet=20fonctionnel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- elm-stuff/0.19.1/QCM.elmi | Bin 14325 -> 14493 bytes elm-stuff/0.19.1/QCM.elmo | Bin 91455 -> 92293 bytes elm-stuff/0.19.1/d.dat | Bin 2486 -> 2486 bytes src/QCM.elm | 138 ++++++++++++++++++++------------------ 4 files changed, 74 insertions(+), 64 deletions(-) diff --git a/elm-stuff/0.19.1/QCM.elmi b/elm-stuff/0.19.1/QCM.elmi index dd38e7bc5b68938f6896ca85fd85d8cbf8b3e559..9ac8dbe79df111e40f07567175eb91b4787e6561 100644 GIT binary patch delta 848 zcmeyGKeup#7^Ck-@&AmhEJ-=}$&(NAJFv1ifmjn|vbex3Ua-VRIpN7UQo>NlL^&f? zkgDRzj6#OoU}dZzWyL@PbS5v9(}1X(crgsb5d|yY2P<&QNlh%t&n!wUo}8#7hcE=2 z!Tex-oM3$+sl_Fe7lSP6S-UP)$ZQSs!3?1r1Oc@%gz|CH(ndI{u2 zkVnM8EP=w(%&Oqz#Jn(|{a~rpda_VOje3%kBV>7??!o4=iHs7AYLoBFNDco{S}ivtpiic=?ll+&7= zqGvieO84UAnR@dOdQ`yS!Ttuc-SQrD93WAj~2Ri#g)iEQf6Pf(R zD2kC~a-4|@kmbb*Rl>?JdAI(7&HIcMnV{hVGzc0N_e@n8xj4fTi!u|Fa)2p$0lVzv HEc0#vx{Cr# delta 885 zcmbPR_%(lm7^BZd@&AmQ{a6=pa&QC``Vu`dF<&@g73E=HzusDw}sJCNVPxPv%p1 zMd(HLbNJ*HvLb8l7PFJuNV~0uy{zFj4NnR+$;>&&I#5Yl3H9c z`Jkf0WD^Y{e2nB`Zp|QOWOrsG%49zMc_=y%Ns$2p zSSGJBJ|F{kAygDju?U4t=FyRy9BrgB*_u&!vYuJ&g!j!`Hu+p=X6*kCX>p^;?{gh|`f!0h;F3&zD{ zYV@z8J8`cuWGT!3xE}(R?ItGTFwq$2$Cj9A;txf$Uq;6tjhgszzuH2}7Ws42_dMsk z=RD^*=jFrC=-2Pk3&$W#k~CB&Cr0otRFOan(8-^EHRv?TpO!2=4Gp;RhXM6kJJ9$i z+)jSvz)kG|pfISlAJISiWJ4%A9cEMyijsbr=Yz4yU?>{tjz!MRM1$c-jEPJoB8dns znd3Xa>4ow)0q?QjmdZ92h_C$S$1b)WQ=EycKL$KrXMH6yLWz<7)O;Ff`8r{_1%B72 zYbx4x2TW>0-O)%eF+CZJWHT$1oU_N}a;WUjxC@<)R^#FAkVfgq6_?K9IiQ+*=0j=Z zxcIltEmE=yd^J5ZcQ%s9*wrsBe$8UCVf@5#6003nyzSx{1&Z*fr8++!)laT49G3!P zr`=|NOgs$Qual{R;_)pTW6Dnw_gBRX+AKEZvEqw%9>1%4o0cykqX7_)JRH_G8Sq_) z-auu*>2=49)|8(PT6{J5LtQCeX}oFK$t10dpG|0F{wRqn4AgoRDm)LTA|nHhMn})Y zLeX;)5!sp=^J`KQ)X~(u2&Q%O(U{c!2aw~&MXwoC{S>bB6_c_);EX%dMt062QHl}g zk?f^~MBZ_FcOg=Wt+3(23(duNsqV*z#8|BNXGe<0l&3|`ZKuCCeYxQU9mtw1%)-0( zXV}K@;l?_>LWiAPpkWWbwXYpF{gq_kI57CtzC~m|=H=1Aa(7i>Gm|bWzSi{W_K+g( z!4;&F?h+t1Ltw%$n>jSzC{B0jpftpZ!!|oNd44DyoH`{Ao7DcyylGAO7B>GNCjg}w zt){>S2V3g@-(3B*ryjS;D)6|^hj&hM#1nurPM%#=IGIsm{gwD0aCpLD+_ke#Y<PI3@-cnYYK{1WUV?D;nH3n?=M#2xc>xOfW-}eCclj~M_Sj>SIWqpr*X-^ zXV!C84YD*6B|8l7VCMR{$+N2Dyl$D`N;ryHR+j7xaLsUMfA%(>z<0 zy>zzMp1ykH{2U2*!6>XX!R2CeK>^am9KV~Aq|z9f#D`!+=WQ}BEH5i+Hh-TK)+1q? zgnNFtQl#9gA>zwo6|Q!H0Th}D>j6<5olq`(-3@O5Zm#jFWuYCe5vB*mFFkH1&E2AW zI&B=j{Ev}*&;t|b?C6l*GCbz0&)@$`ltp>_)Rv=oAdNGlL`HF3$*LC|IM>YMDsLlx zA8=&lD9q%xc_lg22QNun7LGgHYaw6sK^NXiF@m=r^hJtFh3){HQWZ=79e_v3@ELGR zfmz}HQ!oa(R<1t53(=Esk!q`$R|h>F2*%=(?8B(ZD%~inA~2m0pZv*4lq4x|5yv1r zXORtbzI~H|L*(;8Fp-H-7*_{KdiJA925Up(TAWMx7KKtq}?hf h%VTg+2`JZxPFpLM_Lm6EF!X52%@N>)Z_dC3^B>{%tbhOj delta 1963 zcmah}O>7%g5caIS8?T)>_Ie%1&X1iq5dww84oz`OehDOXk~UVO1caKVPPEWe`Kx1B zq7_8~p$b)0iAL=^AgTc3Qhs8zpjF^dKpdb_s`Q40fO6nM)D$=ZO4(iSZXA07U)FEl z%)D>r`(|FdL*KkbuOuLaU;4ec*5zD1{T%L4b*n%9vHDdlxt|0N?m`oeQ15^R?^EMo z#TZqC$qfd>8#eKk2$YkRa-ff=7pLchd4aLye>VG)ZV?tTLPp@urP8x0*{3fp%rDKQ zW`s1ooIN9CN&-9<`C>LB;Oca}_^ovjXhuna;H<(ZvzCv-IQ^YdjnALO@0n+TH6A6u z_d`G$XonvtvDMjbjqy`Qn{-5db3!V!IGf%B>nXW<1n*P@xTIEt5%G{>etb;9ZP;8Y z4CAQPqkn7`BRM{BwaESZ7*M&WG z0lZS@!%ptu$|3-GFV=t;JKU^Qj}q6pB?{D%?0QM~WL3w1fN8<{IEO2&3*V3OMqBYC z|EqbFw2BfpL$$b2-M9~64_TUoN6GCWaFLq{aNtg`1CIwjG%s(h#)sX(MwZgS$|VM{ zm#@L=wQ;gJ1eIzMaVPkJ)jY%3_1nd@ZH5|4y3*$RIb={_uti&!&*%~iV(W!wtO>W1 zmR_iqIeHy)BW|*m0uJXJUSy4E%nj5QKdG2h{XWXjd$yPVG$-CVUAjdi(inkgs zGkLz0B=}dI8#e~L{eD@VXS1{C$7WIs6S6dQmh^F=c(Yqip%MEkc|T<_b;MuVA{yD9 zT&2CB)!%4v@5Ne5DDa8N_HOH*jBuR`h`El>C@p3&9?|}_`9c_t`!O3mh~caQw}x5# z!s;ZuGr;23Q)T$;fdlxrj}MxnQ#rsNqt#`3V0O|MmRmJV;V-fBS4AYbgZM=g2zFw~V7ZVQDcl6xLp zQhOU*bNI|42})A`zmRC))tdD`u0_H!2UI9Ea}Ps&(!dk&o<0Az^jkkfK--|Jbd%Ki zG+Y5$5&ICFES^wuZU~f#W94D1Cy8NbEu56CV~q6DFqGNxZe>uClk{maByZcHifpss zl`1CS5)^Yw?ovQYpF9JXZPMpcFiMf06F^7Q{gq6mmjz=NSSqx^fc%7#7f!&{auqtQ zS?rVWsREz``}!C(lgUX4VeeZsiJpWkCJ)(2{Wv7asbR2@H^#wFl2Z`QGqH!7$fyIZ W{X3j^`oW94R;SW<$uSKVn129s - ( { model | variables = nouvellesVariables } - , Cmd.none - ) - --} SujetGenere nouveauSujetGenere -> ( { model | sujetGenere = nouveauSujetGenere } , Cmd.none @@ -124,7 +118,7 @@ update msg model = let f strSuj = case P.run (withIndent -1 sujet) strSuj of - Ok sjt -> Random.map quizScanVoirSujet <| sujetsAleatoires sjt + Ok sjt -> Random.map quizScanVoirBlocs <| sujetsAleatoires sjt Err erreurs -> Random.constant <| deadEndsToStringBis erreurs in ( model @@ -230,12 +224,13 @@ text chaine = ██ ██ ██ ██ ██ ███████ ███████ ██ ██ ███████ ██████ █████ ███████ ██ -} -type alias Sujet = List Probleme +type alias Blocs = List Bloc -type Probleme = - VariableAremplacer Aremplacer Sujet - | Entete Macro Sujet - -- | ProblemeOuvert NombreDeLigne TexteVariable +type Bloc = + Sujet (List Bloc) + | VariableAremplacer Aremplacer Blocs + | Entete Macro Blocs + -- | ProblèmeOuvert NombreDeLigne TexteVariable | QCM Macro Propositions | VraiFaux Propositions @@ -248,15 +243,15 @@ type Proposition = type alias NombreDeLigne = Int {-- -voirSujetParse sujetPotentiel = - case P.run (withIndent -1 sujet) sujetPotentiel of - Ok sjt -> voirSujet sjt +voirBlocsParse blocsPotentiel = + case P.run (withIndent -1 blocs) blocsPotentiel of + Ok sjt -> voirBlocs sjt Err erreurs -> deadEndsToStringBis erreurs --} -voirSujetParseAleatoire sujetPotentiel = - case P.run (withIndent -1 sujet) sujetPotentiel of - Ok sjt -> Random.map quizScanVoirSujet <| sujetAleatoire sjt +voirBlocsParseAleatoire blocsPotentiel = + case P.run (withIndent -1 blocs) blocsPotentiel of + Ok sjt -> Random.map quizScanVoirBlocs <| blocsAleatoires sjt Err erreurs -> Random.constant <| deadEndsToStringBis erreurs deadEndsToStringBis errs = @@ -270,15 +265,15 @@ voirErreur err = ++ " | Colonne : " ++ String.fromInt err.col {-- -voirSujet = S.join "\n" << L.map voirProbleme +voirBlocs = S.join "\n" << L.map voirBloc -voirProbleme prblm = - -- Debug.log "voirProbleme " <| +voirBloc prblm = + -- Debug.log "voirBloc " <| case prblm of Entete mcr sjt -> voirMacro mcr ++ "\n" - ++ voirSujet sjt + ++ voirBlocs sjt VraiFaux prps -> let f prp = @@ -287,18 +282,23 @@ voirProbleme prblm = Faux mcr -> voirMacro mcr in S.join "\n" <| L.map f prps - VariableAremplacer ar sjt -> "" ++ voirSujet sjt + VariableAremplacer ar sjt -> "" ++ voirBlocs sjt --} -sujet : Parser Sujet +sujet : Parser Blocs sujet = + succeed (L.singleton << Sujet) + |= blocs + +blocs : Parser Blocs +blocs = let problemes prblms = let boucle = - -- Debug.log "Boucle sur un probleme (bis) " <| + -- Debug.log "Boucle sur un bloc (bis) " <| succeed ( \prblm -> Loop (prblm :: prblms) ) - |= probleme + |= bloc fin = map (\_ -> Done (List.reverse prblms)) suite col_ind = @@ -307,7 +307,7 @@ sujet = |. end |> fin , if Tuple.first col_ind > Tuple.second col_ind then -- if col > ind - boucle -- |> Debug.log "Boucle sur un probleme " + boucle -- |> Debug.log "Boucle sur un bloc " else succeed () |> fin @@ -322,8 +322,8 @@ sujet = in loop [] problemes -probleme : Parser Probleme -probleme = +bloc : Parser Bloc +bloc = let suite = flip withIndent @@ -344,11 +344,11 @@ reserve = Set.fromList , "var" ] -sousSujet = +sousBlocs = let suite col_ind = if Tuple.first col_ind > Tuple.second col_ind then -- if col > ind - withIndent (Tuple.first col_ind) ( lazy (\_ -> sujet) ) -- Aucune idée de l'effet du lazy, ça marche sans... + withIndent (Tuple.first col_ind) ( lazy (\_ -> blocs) ) -- Aucune idée de l'effet du lazy, ça marche sans... else succeed [] in @@ -358,12 +358,12 @@ sousSujet = |= getIndent |> andThen suite -entete : Parser Probleme +entete : Parser Bloc entete = -- Debug.log "entete " <| succeed Entete |= macro - |= sujet -- sousSujet + |= blocs -- sousBlocs vraiFaux = -- Debug.log "vraiFaux " <| @@ -517,12 +517,12 @@ parserAremplacer variables = espaces = chompWhile <| (==) ' ' -variableAremplacer : Parser Probleme +variableAremplacer : Parser Bloc variableAremplacer = -- Debug.log "variableAremplacer " <| succeed VariableAremplacer |= aRemplacer - |= sujet -- sousSujet + |= blocs -- sousBlocs aRemplacer : Parser Aremplacer aRemplacer = @@ -552,36 +552,38 @@ aRemplacer = ███████ █████ ██ ██ ██ ███████ ███████ ██ ██ ██ ██████ ██ ██ ██ ███████ -} -sujetsAleatoires : Sujet -> Random.Generator Sujet +sujetsAleatoires : Blocs -> Random.Generator Blocs sujetsAleatoires sjt = - sujetAleatoire sjt + blocsAleatoires sjt |> Random.list 89 |> Random.map L.concat -sujetAleatoire : Sujet -> Random.Generator Sujet -sujetAleatoire sjt = +blocsAleatoires : Blocs -> Random.Generator Blocs +blocsAleatoires sjt = Random.map L.concat <| Random.Extra.sequence - <| L.map problemeAleatoire sjt + <| L.map blocAleatoire sjt -problemeAleatoire : Probleme -> Random.Generator Sujet -problemeAleatoire prblm = +blocAleatoire : Bloc -> Random.Generator Blocs +blocAleatoire prblm = case prblm of + Sujet blcs -> + Random.map (L.singleton << Sujet) (blocsAleatoires blcs) VariableAremplacer ar sjt -> let vrbl = ar.var vlr = valeurAleatoire "" ar.vals - f sj vl = remplacerLaVariableDansLeSujetAleatoire vrbl vl sj + f sj vl = remplacerLaVariableDansLesBlocsAleatoires vrbl vl sj in {-- Debug.log - ( "problemeAleatoire, branche VariableAremplacer, variable : " + ( "blocAleatoire, branche VariableAremplacer, variable : " ++ vrbl ++ " " ) <| --} Random.andThen (f sjt) vlr Entete mcr sjt -> - Random.map (L.singleton << Entete mcr) (sujetAleatoire sjt) + Random.map (L.singleton << Entete mcr) (blocsAleatoires sjt) VraiFaux prps -> Random.map (L.singleton << VraiFaux << L.singleton) @@ -602,18 +604,20 @@ valeurAleatoire f fs = ff :: fss -> Random.uniform ff fss -remplacerLaVariableDansLeProblemeAleatoire : - String -> String -> Probleme -> Random.Generator Sujet -remplacerLaVariableDansLeProblemeAleatoire vrbl vlr prblm = +remplacerLaVariableDansLeBlocAleatoire : + String -> String -> Bloc -> Random.Generator Blocs +remplacerLaVariableDansLeBlocAleatoire vrbl vlr prblm = case prblm of + Sujet blcs -> + remplacerLaVariableDansLesBlocsAleatoires vrbl vlr blcs VariableAremplacer ar sjt -> - problemeAleatoire (VariableAremplacer ar sjt) - |> Random.andThen (remplacerLaVariableDansLeSujetAleatoire vrbl vlr) + blocAleatoire (VariableAremplacer ar sjt) + |> Random.andThen (remplacerLaVariableDansLesBlocsAleatoires vrbl vlr) Entete mcr sjt -> Random.map L.singleton <| Random.map2 Entete ( Random.constant <| remplacerLaVariableParLaValeurDansLaMacro vrbl vlr mcr ) - ( remplacerLaVariableDansLeSujetAleatoire vrbl vlr sjt ) + ( remplacerLaVariableDansLesBlocsAleatoires vrbl vlr sjt ) QCM mcr prps -> Random.map L.singleton <| Random.map2 QCM @@ -630,12 +634,12 @@ remplacerLaVariableDansLeProblemeAleatoire vrbl vlr prblm = ) <| valeurAleatoire ( Vrai [ Texte "Le prof de maths est le meilleur." ] ) prps -remplacerLaVariableDansLeSujetAleatoire : - String -> String -> Sujet -> Random.Generator Sujet -remplacerLaVariableDansLeSujetAleatoire vrbl vlr sjt = +remplacerLaVariableDansLesBlocsAleatoires : + String -> String -> Blocs -> Random.Generator Blocs +remplacerLaVariableDansLesBlocsAleatoires vrbl vlr sjt = Random.map L.concat <| Random.Extra.sequence - <| L.map (remplacerLaVariableDansLeProblemeAleatoire vrbl vlr) sjt + <| L.map (remplacerLaVariableDansLeBlocAleatoire vrbl vlr) sjt remplacerLaVariableParLaValeurDansLaProposition vrbl vlr prp = case prp of @@ -652,18 +656,20 @@ remplacerLaVariableParLaValeurDansLaProposition vrbl vlr prp = ▀▀ -} -quizScanVoirSujet : Sujet -> String -quizScanVoirSujet sjt = - "\n\\begin{Sujet}\n" - ++ ( S.join "\n" <| L.map quizScanVoirProbleme sjt ) - ++ "\n\\end{Sujet}" +quizScanVoirBlocs : Blocs -> String +quizScanVoirBlocs blcs = + S.join "\n" <| L.map quizScanVoirBloc blcs -quizScanVoirProbleme prblm = +quizScanVoirBloc prblm = case prblm of + Sujet blcs -> + "\n\\begin{Sujet}\n" + ++ quizScanVoirBlocs blcs + ++ "\n\\end{Sujet}" Entete mcr sjt -> voirMacro mcr ++ "\n" - ++ quizScanVoirSujet sjt + ++ quizScanVoirBlocs sjt QCM mcr prps -> let f prp = @@ -689,7 +695,11 @@ quizScanVoirProbleme prblm = "\n \\begin{VraiFaux}\n \\Faux{" ++ voirMacro mc ++ "}\n \\end{VraiFaux}" in S.concat <| L.map f prps - VariableAremplacer ar sjt -> "" ++ quizScanVoirSujet sjt + VariableAremplacer ar sjt -> + "" ++ quizScanVoirBlocs sjt + + + {- ███ ███ ██ ██ ██ ███████ ██ ██ ██████ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██