parent
e849db9ded
commit
0fe5ed10b3
@ -0,0 +1,90 @@ |
||||
+1 -1, +1 -1, +1 -1, +1 -1, +2 -1, +2 -1, +2 -1, +3 -1, +3 -1, +3 -1, +3 -1 |
||||
ABBACBBBCDB |
||||
BABABCBDCAD |
||||
ABAACCCBADD |
||||
BAAAAACBADB |
||||
BAAACCBAAAC |
||||
ABBAABACCAC |
||||
BBBAACCADAC |
||||
AAAACCBDBBB |
||||
BABACAADBDC |
||||
AAAAAACCDBD |
||||
BBBABCBDDBC |
||||
ABBABACCCDA |
||||
AABAABCBCAD |
||||
BAAABACCCDB |
||||
BBAABCAACCC |
||||
BABABBCDCCA |
||||
AABACCBACDB |
||||
BBAAACAABBC |
||||
AAAACBBAAAA |
||||
AAAABCCDCCB |
||||
AABABCCBDAA |
||||
BBAACCCBADC |
||||
BBBABCBAABC |
||||
AAAABABCADB |
||||
ABBAAAADDAD |
||||
AAAAAABDDBA |
||||
BBAAAACCCDA |
||||
ABBACAABABD |
||||
BABACBCBABA |
||||
AAAABABBCCA |
||||
BBBAACAAABD |
||||
AAAACBAABBC |
||||
AABAACBCDCA |
||||
BBAABBCDBBC |
||||
ABAACCBBAAA |
||||
BAAACCAADCB |
||||
BBAAAACABAD |
||||
BAAABBCABDD |
||||
BBBAAABACCA |
||||
AABACCADBAC |
||||
BABABBBACCB |
||||
BAAACCBBABA |
||||
BBAAAACAADD |
||||
BAAAACBACAA |
||||
AAAAAACDBCD |
||||
AABABABCCDB |
||||
ABAAAAADBAC |
||||
ABAACAABABA |
||||
BABABBCDBBB |
||||
BBBABCBBDDD |
||||
BABABBCACBB |
||||
BABACCCABAB |
||||
ABAACCBAADB |
||||
AAAAABCBBCD |
||||
ABAACCBCCCD |
||||
BBBAAACBBCB |
||||
ABAAAAAADBC |
||||
AAAABBCDBCA |
||||
AABAABBABAC |
||||
ABBABBBBABD |
||||
BABAABAAADB |
||||
BABABBBDACA |
||||
BABABACDCDD |
||||
BBBACCCBAAB |
||||
ABAAABBBCDA |
||||
AAAABACBBBA |
||||
AABACBCBADA |
||||
BBAACCABCDA |
||||
BBBAABADADA |
||||
BBAACBBCDDD |
||||
BBAAACBCACC |
||||
BAAABBCDDDD |
||||
ABAABBCBBCA |
||||
BAAAAABCBCB |
||||
BBAAABCDDBB |
||||
ABAACAACBCC |
||||
AABACCABCCB |
||||
BAAACCADCBB |
||||
BBBAABCBDAD |
||||
BBAABBADCCB |
||||
ABAACABBCDC |
||||
BAAACACACCB |
||||
BBBACABDCDD |
||||
BBBAAACADAD |
||||
AAAAABADDAC |
||||
BBBAACCACBB |
||||
BBBABBABBDD |
||||
BABAACCADCD |
||||
ABBACBBACAC |
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,538 @@ |
||||
module CalculateurDeNotes exposing (..) |
||||
|
||||
import Browser |
||||
import Html exposing (Html) |
||||
import Element exposing (..) |
||||
import Element.Input as Input |
||||
import Set |
||||
import Array exposing (..) |
||||
import Parser exposing (..) |
||||
|
||||
|
||||
|
||||
{- |
||||
███ ███ █████ ██ ███ ██ |
||||
████ ████ ██ ██ ██ ████ ██ |
||||
██ ████ ██ ███████ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ██ ████ |
||||
-} |
||||
|
||||
main = |
||||
Browser.element |
||||
{ init = init |
||||
, update = update |
||||
, subscriptions = subscriptions |
||||
, view = view |
||||
} |
||||
|
||||
|
||||
|
||||
{- |
||||
███ ███ ██████ ██████ ███████ ██ |
||||
████ ████ ██ ██ ██ ██ ██ ██ |
||||
██ ████ ██ ██ ██ ██ ██ █████ ██ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██████ ██████ ███████ ███████ |
||||
-} |
||||
|
||||
type alias Model = |
||||
{ bareme : String |
||||
, reponsesCorrectes : String |
||||
, reponsesEleves : String |
||||
, eleves : Eleves |
||||
} |
||||
|
||||
init : () -> (Model, Cmd Msg) |
||||
init _ = |
||||
( { bareme = "" |
||||
, reponsesCorrectes = "" |
||||
, reponsesEleves = "" |
||||
, eleves = [] |
||||
} |
||||
, Cmd.none |
||||
) |
||||
|
||||
|
||||
|
||||
{- |
||||
██ ██ ██████ ██████ █████ ████████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██████ ██ ██ ███████ ██ █████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ██ ██████ ██ ██ ██ ███████ |
||||
-} |
||||
|
||||
type Msg |
||||
= NouveauBareme String |
||||
| NouvellesReponsesCorrectes String |
||||
| NouvellesReponsesEleves String |
||||
-- | CalculerNotes |
||||
|
||||
update : Msg -> Model -> ( Model, Cmd Msg ) |
||||
update msg model = |
||||
let |
||||
brms = unsafeRun baremeSujet [] model.bareme |
||||
rpnCorrectes = unsafeRun reponsesCorrectes Array.empty model.reponsesCorrectes |
||||
rpnEleves = unsafeRun reponsesEleves [] model.reponsesEleves |
||||
in |
||||
case msg of |
||||
NouveauBareme nouveauBareme -> |
||||
let |
||||
brmss = unsafeRun baremeSujet [] nouveauBareme |
||||
in |
||||
( { model |
||||
| bareme = nouveauBareme |
||||
, eleves = notes brmss rpnCorrectes rpnEleves |
||||
} |
||||
, Cmd.none |
||||
) |
||||
NouvellesReponsesCorrectes nouvellesReponsesCorrectes -> |
||||
let |
||||
rpnCorrectess = unsafeRun reponsesCorrectes Array.empty nouvellesReponsesCorrectes |
||||
in |
||||
( { model |
||||
| reponsesCorrectes = nouvellesReponsesCorrectes |
||||
, eleves = notes brms rpnCorrectess rpnEleves |
||||
} |
||||
, Cmd.none |
||||
) |
||||
NouvellesReponsesEleves nouvellesReponsesEleves -> |
||||
let |
||||
rpnElevess = unsafeRun reponsesEleves [] nouvellesReponsesEleves |
||||
in |
||||
( { model |
||||
| reponsesEleves = nouvellesReponsesEleves |
||||
, eleves = notes brms rpnCorrectes rpnElevess |
||||
} |
||||
, Cmd.none |
||||
) |
||||
{-- |
||||
CalculerNotes -> |
||||
( { model | eleves = notes brms rpnCorrectes rpnEleves } |
||||
, Cmd.none |
||||
) |
||||
--} |
||||
|
||||
unsafeRun prsr defaut texte = |
||||
case run prsr texte of |
||||
Ok x -> x |
||||
_ -> defaut |
||||
|
||||
|
||||
-- SUBSCRIPTIONS |
||||
|
||||
subscriptions : Model -> Sub Msg |
||||
subscriptions model = |
||||
Sub.none |
||||
|
||||
|
||||
{- |
||||
|
||||
██ ██ ██ ███████ ██ ██ |
||||
██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ █████ ██ █ ██ |
||||
██ ██ ██ ██ ██ ███ ██ |
||||
████ ██ ███████ ███ ███ |
||||
-} |
||||
|
||||
view : Model -> Html Msg |
||||
view model = |
||||
layout [] <| |
||||
row [spacing grandEspacement, padding tresGrandEspacement, height fill, width fill, clip, scrollbars] |
||||
[ column [spacing petitEspacement, height fill, width fill, clip, scrollbars] |
||||
[ Input.multiline [height <| maximum 300 fill, clip, scrollbars] |
||||
{ onChange = NouveauBareme |
||||
, label = Input.labelAbove [] <| text "Barème" |
||||
, placeholder = |
||||
Just |
||||
<| Input.placeholder [] |
||||
<| text "Entrer le barème sous la forme +3 -1, +2 -1" |
||||
, text = model.bareme |
||||
, spellcheck = False |
||||
} |
||||
, Input.multiline [height <| maximum 300 fill, clip, scrollbars] |
||||
{ onChange = NouvellesReponsesCorrectes |
||||
, label = Input.labelAbove [] <| text "Réponses correctes" |
||||
, placeholder = |
||||
Just |
||||
<| Input.placeholder [] |
||||
<| text "Entrer les réponses correctes pour chaque sujet" |
||||
, text = model.reponsesCorrectes |
||||
, spellcheck = False |
||||
} |
||||
, Input.multiline [height <| maximum 300 fill, clip, scrollbars] |
||||
{ onChange = NouvellesReponsesEleves |
||||
, label = Input.labelAbove [] <| text "Réponses des élèves" |
||||
, placeholder = |
||||
Just |
||||
<| Input.placeholder [] |
||||
<| text "Entrer les réponses des élèves" |
||||
, text = model.reponsesEleves |
||||
, spellcheck = False |
||||
} |
||||
] |
||||
, column [spacing petitEspacement, height fill, width fill] |
||||
[ {-- Input.button [] |
||||
{ onPress = Just CalculerNotes |
||||
, label = text "Calculer les notes" |
||||
} |
||||
--} |
||||
voirNotes model.eleves |
||||
] |
||||
] |
||||
|
||||
voirNotes : Eleves -> Element Msg |
||||
voirNotes rpnsEleves = |
||||
table [] |
||||
{ data = rpnsEleves |
||||
, columns = |
||||
[ { header = Element.text "Numéro étudiant" |
||||
, width = fill |
||||
, view = |
||||
\rpns -> |
||||
Element.text rpns.numeroEtudiant |
||||
} |
||||
, { header = Element.text "Note" |
||||
, width = fill |
||||
, view = |
||||
\rpns -> |
||||
case rpns.note of |
||||
Nothing -> Element.text "" |
||||
Just nt -> Element.text <| String.fromFloat nt |
||||
} |
||||
] |
||||
} |
||||
|
||||
petitEspacement = 20 |
||||
|
||||
grandEspacement = 5*petitEspacement // 4 |
||||
|
||||
tresGrandEspacement = 25*petitEspacement // 16 |
||||
|
||||
{- |
||||
██████ █████ ██████ ███████ ███ ███ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ████ ████ ██ |
||||
██████ ███████ ██████ █████ ██ ████ ██ █████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ██ ██ ██ ██ ███████ ██ ██ ███████ |
||||
-} |
||||
|
||||
|
||||
{-- |
||||
baremeEtReponses = |
||||
succeed (\brm rpn -> BaremeEtReponses brm (List.map (String.split "") rpn)) |
||||
|= baremeSujet |
||||
|= reponses |
||||
--} |
||||
|
||||
|
||||
type alias BaremeSujet = List BaremeQuestion |
||||
|
||||
baremeSujet = |
||||
sequence |
||||
{ start = "" |
||||
, separator = "," |
||||
, end = "" |
||||
, spaces = espaces |
||||
, item = baremeQuestion |
||||
, trailing = Forbidden |
||||
} |
||||
|
||||
espaces = |
||||
chompWhile <| (==) ' ' |
||||
|
||||
|
||||
type alias BaremeQuestion = |
||||
{ bonneReponse : Float |
||||
, mauvaiseReponse : Float |
||||
} |
||||
|
||||
baremeQuestion = |
||||
succeed BaremeQuestion |
||||
|= nombre |
||||
|. spaces |
||||
|= nombre |
||||
|
||||
nombre : Parser Float |
||||
nombre = |
||||
oneOf |
||||
[ succeed negate |
||||
|. symbol "-" |
||||
|= float |
||||
, succeed identity |
||||
|. symbol "+" |
||||
|= float |
||||
] |
||||
|
||||
{- |
||||
██████ ███████ ██████ ██████ ███ ██ ███████ ███████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ |
||||
██████ █████ ██████ ██ ██ ██ ██ ██ ███████ █████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ███████ ██ ██████ ██ ████ ███████ ███████ ███████ |
||||
-} |
||||
type alias ReponsesCorrectes = Array Reponses |
||||
|
||||
reponsesCorrectes : Parser ReponsesCorrectes |
||||
reponsesCorrectes = |
||||
succeed Array.fromList |
||||
|= sequence |
||||
{ start = "" |
||||
, separator = "\n" |
||||
, end = "" |
||||
, spaces = espaces |
||||
, item = reponses |
||||
, trailing = Optional |
||||
} |
||||
|
||||
|
||||
type alias Reponses = List String |
||||
|
||||
reponses = |
||||
sequence |
||||
{ start = "" |
||||
, separator = "" |
||||
, end = "" |
||||
, spaces = espaces |
||||
, item = variable |
||||
{ start = ( \ x -> x /= '\n' && x /= ';' ) |
||||
, inner = \_ -> False |
||||
, reserved = Set.fromList [] |
||||
} |
||||
, trailing = Optional |
||||
} |
||||
|
||||
|
||||
type alias Eleves = List Eleve |
||||
|
||||
reponsesEleves : Parser Eleves |
||||
reponsesEleves = |
||||
sequence |
||||
{ start = "" |
||||
, separator = "\n" |
||||
, end = "" |
||||
, spaces = espaces |
||||
, item = reponsesEleve |
||||
, trailing = Optional |
||||
} |
||||
|
||||
|
||||
|
||||
{- |
||||
███████ ██ ███████ ██ ██ ███████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ |
||||
█████ ██ █████ ██ ██ █████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ |
||||
███████ ███████ ███████ ████ ███████ ███████ |
||||
-} |
||||
|
||||
|
||||
type alias Eleve = |
||||
{ numeroEtudiant : String |
||||
, numeroSujet : Int |
||||
, reponses : Reponses |
||||
, note : Maybe Float |
||||
} |
||||
|
||||
reponsesEleve = |
||||
succeed Eleve |
||||
|= etudiant |
||||
|= int |
||||
|. champzInteret |
||||
|. champzInteret |
||||
|= reponsesQuizScan |
||||
|= champzInteret |
||||
|
||||
etudiant = |
||||
getChompedString |
||||
<| chompIf Char.isDigit |
||||
|. chompIf Char.isDigit |
||||
|. chompIf Char.isDigit |
||||
|. chompIf Char.isDigit |
||||
|. chompIf Char.isDigit |
||||
|
||||
champzInteret = |
||||
succeed Nothing |
||||
|. symbol ";" |
||||
|. chompWhile ( \ x -> x /= '\n' && x /= ';' ) |
||||
|
||||
reponsesQuizScan = |
||||
sequence |
||||
{ start = ";" |
||||
, separator = ";" |
||||
, end = "" |
||||
, spaces = espaces |
||||
, item = variable |
||||
{ start = ( \ x -> x /= '\n' && x /= ';' ) |
||||
, inner = \_ -> False |
||||
, reserved = Set.fromList [] |
||||
} |
||||
, trailing = Mandatory |
||||
} |
||||
|
||||
notes : BaremeSujet -> ReponsesCorrectes -> Eleves -> Eleves |
||||
notes brms rpnCorrectes rpnEleves = |
||||
let |
||||
f rpnEleve = |
||||
case Array.get (rpnEleve.numeroSujet - 11) rpnCorrectes of |
||||
Nothing -> rpnEleve |
||||
Just bonneRpns -> |
||||
{ rpnEleve | note = noteSujet brms bonneRpns rpnEleve.reponses } |
||||
in |
||||
List.map f rpnEleves |
||||
|
||||
noteSujet : BaremeSujet -> Reponses -> Reponses -> Maybe Float |
||||
noteSujet brms bonneRpns rpnsEleve = |
||||
case brms of |
||||
[] -> Just 0 |
||||
brm :: brmss -> |
||||
let |
||||
bonneRpn = List.head bonneRpns |
||||
bonneRpnSuite = List.tail bonneRpns |
||||
rpnEleve = List.head rpnsEleve |
||||
rpnEleveSuite = List.tail rpnsEleve |
||||
in |
||||
case ( (bonneRpn, bonneRpnSuite), (rpnEleve, rpnEleveSuite) ) of |
||||
( (Just bnRpn, Just bnRpnSuite), (Just rpnElv, Just rpnElvSuite) ) -> |
||||
noteSujet brmss bnRpnSuite rpnElvSuite |
||||
|> Maybe.andThen ( Just << (+) ( noteQuestion brm bnRpn rpnElv ) ) |
||||
_ -> Nothing |
||||
|
||||
noteQuestion brm bonneRpn rpnEleve = |
||||
if bonneRpn == rpnEleve then |
||||
brm.bonneReponse |
||||
else if rpnEleve == "-" then |
||||
0 |
||||
else |
||||
brm.mauvaiseReponse |
||||
|
||||
|
||||
monBareme = "+1 -1, +1 -1, +1 -1, +1 -1, +2 -1, +2 -1, +2 -1, +3 -1, +3 -1, +3 -1, +3 -1" |
||||
|
||||
mesReonses = |
||||
"""ABBACBBBCDB |
||||
BABABCBDCAD |
||||
ABAACCCBADD |
||||
BAAAAACBADB |
||||
BAAACCBAAAC |
||||
ABBAABACCAC |
||||
BBBAACCADAC |
||||
AAAACCBDBBB |
||||
BABACAADBDC |
||||
AAAAAACCDBD |
||||
BBBABCBDDBC |
||||
ABBABACCCDA |
||||
AABAABCBCAD |
||||
BAAABACCCDB |
||||
BBAABCAACCC |
||||
BABABBCDCCA |
||||
AABACCBACDB |
||||
BBAAACAABBC |
||||
AAAACBBAAAA |
||||
AAAABCCDCCB |
||||
AABABCCBDAA |
||||
BBAACCCBADC |
||||
BBBABCBAABC |
||||
AAAABABCADB |
||||
ABBAAAADDAD |
||||
AAAAAABDDBA |
||||
BBAAAACCCDA |
||||
ABBACAABABD |
||||
BABACBCBABA |
||||
AAAABABBCCA |
||||
BBBAACAAABD |
||||
AAAACBAABBC |
||||
AABAACBCDCA |
||||
BBAABBCDBBC |
||||
ABAACCBBAAA |
||||
BAAACCAADCB |
||||
BBAAAACABAD |
||||
BAAABBCABDD |
||||
BBBAAABACCA |
||||
AABACCADBAC |
||||
BABABBBACCB |
||||
BAAACCBBABA |
||||
BBAAAACAADD |
||||
BAAAACBACAA |
||||
AAAAAACDBCD |
||||
AABABABCCDB |
||||
ABAAAAADBAC |
||||
ABAACAABABA |
||||
BABABBCDBBB |
||||
BBBABCBBDDD |
||||
BABABBCACBB |
||||
BABACCCABAB |
||||
ABAACCBAADB |
||||
AAAAABCBBCD |
||||
ABAACCBCCCD |
||||
BBBAAACBBCB |
||||
ABAAAAAADBC |
||||
AAAABBCDBCA |
||||
AABAABBABAC |
||||
ABBABBBBABD |
||||
BABAABAAADB |
||||
BABABBBDACA |
||||
BABABACDCDD |
||||
BBBACCCBAAB |
||||
ABAAABBBCDA |
||||
AAAABACBBBA |
||||
AABACBCBADA |
||||
BBAACCABCDA |
||||
BBBAABADADA |
||||
BBAACBBCDDD |
||||
BBAAACBCACC |
||||
BAAABBCDDDD |
||||
ABAABBCBBCA |
||||
BAAAAABCBCB |
||||
BBAAABCDDBB |
||||
ABAACAACBCC |
||||
AABACCABCCB |
||||
BAAACCADCBB |
||||
BBBAABCBDAD |
||||
BBAABBADCCB |
||||
ABAACABBCDC |
||||
BAAACACACCB |
||||
BBBACABDCDD |
||||
BBBAAACADAD |
||||
AAAAABADDAC |
||||
BBBAACCACBB |
||||
BBBABBABBDD |
||||
BABAACCADCD |
||||
ABBACBBACAC""" |
||||
|
||||
mesEleves = |
||||
"""2000126;rayan;;B;B;A;B;B;-;B;D;A;D;-;; |
||||
2000224;selena;;B;B;A;A;B;-;C;B;B;-;-;; |
||||
2000527;maryam;;B;-;B;-;B;-;A;A;D;A;-;; |
||||
2000728;juliette;;A;-;-;-;A;C;A;D;C;C;-;; |
||||
2000829;ma?v?ne;;A;A;-;B;B;C;-;A;A;-;-;; |
||||
2000891;ma?v?ne;;B;B;B;B;C;A;C;B;C;D;C;; |
||||
2000948;mathilde;;B;B;A;B;C;B;A;-;-;-;-;; |
||||
2001047;lucille;;A;B;A;B;A;A;-;A;A;A;D;; |
||||
2001160;marie;;B;B;A;-;C;-;A;-;-;-;-;; |
||||
2001458;issra;;A;B;A;B;A;A;C;B;A;B;-;; |
||||
2001732;audrey;;B;B;A;A;C;C;C;-;-;-;-;; |
||||
2001834;emeric;;A;A;A;A;-;A;B;-;-;-;-;; |
||||
2001944;lamia;;A;B;B;A;A;B;A;D;C;A;C;; |
||||
2002030;adrien;;A;B;A;A;A;A;C;-;-;-;B;; |
||||
2002128;bettina;;B;B;A;A;A;C;C;A;B;-;-;; |
||||
2002333;samuel;;B;B;B;B;-;C;-;A;B;-;-;; |
||||
2002439;marl?ne;;B;B;A;A;A;B;C;B;A;B;D;; |
||||
2003684;vincent;;B;A;A;A;A;A;B;C;D;C;B;; |
||||
2000632;chiche;;B;B;A;B;A;C;C;B;A;-;-;; |
||||
2000334;BOUDRY;;A;B;A;A;-;-;A;C;-;-;-;; |
||||
2001641;GUERIN;;A;B;B;A;-;B;B;A;-;B;-;; |
||||
2002514;NGEUMELEU;;A;B;A;A;B;C;B;B;A;B;B;; |
||||
2002215;MEJJATI;;A;A;B;A;B;C;A;D;C;C;-;; |
||||
2002790;NICOISE;;A;B;A;A;A;B;B;A;A;A;A;; |
||||
2003293;SCHEPENS;;B;B;B;A;C;A;C;D;D;D;D;; |
||||
2000430;BOUHNIK;;A;A;B;A;B;C;B;D;C;-;-;; |
||||
2003392;SERGEANT;;B;A;A;A;C;A;A;-;-;-;-;; |
||||
2002986;PEREZ;;A;B;A;B;-;A;B;-;-;B;-;; |
||||
2003710;PERROT;;A;B;A;A;B;A;C;D;C;A;D;; |
||||
2003585;SUNNASSEE;;B;B;A;A;C;A;C;D;B;C;A;; |
||||
2003110;QIU;;B;A;A;A;C;A;C;A;B;C;A;; |
||||
2001356;ESTIVAL;;A;A;B;A;C;B;B;C;B;D;C;; |
||||
2001546;GRANDJEAN;;B;A;B;A;-;C;-;A;D;C;B;; |
||||
2001262;DUFRIEN;;B;A;-;A;-;C;-;B;C;-;D;;""" |
||||
@ -0,0 +1,734 @@ |
||||
module GenerateurDeProblemes exposing (..) |
||||
|
||||
import Browser |
||||
import Parser as P exposing (..) |
||||
import List as L |
||||
import Set |
||||
import ParserMaths as PM |
||||
import String as S |
||||
import Fractions as F exposing (Frac) |
||||
import Html exposing (Html, Attribute, button, div, textarea, input, p, iframe, section) |
||||
--import Html.Attributes as A -- exposing (..) |
||||
--import Html.Events |
||||
import Random |
||||
import Random.Extra |
||||
import Random.List |
||||
import Element exposing (..) |
||||
import Element.Background as Background |
||||
import Element.Border as Border |
||||
import Element.Events exposing (..) |
||||
import Element.Font as Font |
||||
import Element.Input as Input |
||||
|
||||
|
||||
{- |
||||
███ ███ █████ ██ ███ ██ |
||||
████ ████ ██ ██ ██ ████ ██ |
||||
██ ████ ██ ███████ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ██ ████ |
||||
-} |
||||
|
||||
main = |
||||
Browser.element |
||||
{ init = init |
||||
, update = update |
||||
, subscriptions = subscriptions |
||||
, view = view |
||||
} |
||||
|
||||
|
||||
{- |
||||
███ ███ ██████ ██████ ███████ ██ |
||||
████ ████ ██ ██ ██ ██ ██ ██ |
||||
██ ████ ██ ██ ██ ██ ██ █████ ██ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██████ ██████ ███████ ███████ |
||||
-} |
||||
|
||||
type alias Model = |
||||
{ structureDuSujet : String |
||||
, sujetGenere : String |
||||
} |
||||
|
||||
init : () -> (Model, Cmd Msg) |
||||
init _ = |
||||
( { structureDuSujet = "" |
||||
, sujetGenere = "" |
||||
} |
||||
, Cmd.none |
||||
) |
||||
|
||||
{- |
||||
██ ██ ██████ ██████ █████ ████████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██████ ██ ██ ███████ ██ █████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ██ ██████ ██ ██ ██ ███████ |
||||
-} |
||||
|
||||
type Msg |
||||
= StructureDuSujet String |
||||
| GenererSujet |
||||
| SujetGenere String |
||||
|
||||
update : Msg -> Model -> ( Model, Cmd Msg ) |
||||
update msg model = |
||||
case msg of |
||||
StructureDuSujet nouvelleStructure -> |
||||
( { model | structureDuSujet = nouvelleStructure } |
||||
, Cmd.none |
||||
) |
||||
SujetGenere nouveauSujetGenere -> |
||||
( { model | sujetGenere = nouveauSujetGenere } |
||||
, Cmd.none |
||||
) |
||||
GenererSujet -> |
||||
let |
||||
f strSuj = |
||||
case P.run (withIndent -1 sujet) strSuj of |
||||
Ok sjt -> Random.map quizScanVoirBlocs <| sujetsAleatoires sjt |
||||
Err erreurs -> Random.constant <| deadEndsToStringBis erreurs |
||||
in |
||||
( model |
||||
, Random.generate SujetGenere (f model.structureDuSujet) |
||||
) |
||||
|
||||
|
||||
-- SUBSCRIPTIONS |
||||
|
||||
subscriptions : Model -> Sub Msg |
||||
subscriptions model = |
||||
Sub.none |
||||
|
||||
|
||||
{- |
||||
|
||||
██ ██ ██ ███████ ██ ██ |
||||
██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ █████ ██ █ ██ |
||||
██ ██ ██ ██ ██ ███ ██ |
||||
████ ██ ███████ ███ ███ |
||||
-} |
||||
|
||||
view : Model -> Html Msg |
||||
view model = |
||||
layout [] <| |
||||
column [height fill, width fill] |
||||
[ Input.multiline [] |
||||
{ onChange = StructureDuSujet |
||||
, label = Input.labelHidden "chose" |
||||
, placeholder = Just <| Input.placeholder [] <| text "Structure du sujet" |
||||
, text = model.structureDuSujet |
||||
, spellcheck = True |
||||
} |
||||
, Input.button [] |
||||
{ onPress = Just GenererSujet |
||||
, label = text "Générer le sujet" |
||||
} |
||||
, text model.sujetGenere |
||||
] |
||||
|
||||
|
||||
{- |
||||
██████ █████ ██████ ███████ ███████ ██████ ███████ ██ ██ ██ ███████ ████████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ███████ ██████ ███████ █████ ██████ ███████ ██ ██ ██ █████ ██ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ███████ ███████ ██ ██ ███████ ██████ █████ ███████ ██ |
||||
-} |
||||
|
||||
type alias Blocs = List Bloc |
||||
|
||||
type Bloc = |
||||
Sujet (List Bloc) |
||||
| VariableAremplacer Aremplacer Blocs |
||||
| Entete Macro Blocs |
||||
| QCM Macro Propositions |
||||
| VraiFaux Propositions |
||||
|
||||
type alias Propositions = List Proposition |
||||
|
||||
type Proposition = |
||||
Vrai Macro |
||||
| Faux Macro |
||||
|
||||
type alias NombreDeLigne = Int |
||||
|
||||
{-- |
||||
voirBlocsParse blocsPotentiel = |
||||
case P.run (withIndent -1 blocs) blocsPotentiel of |
||||
Ok sjt -> voirBlocs sjt |
||||
Err erreurs -> deadEndsToStringBis erreurs |
||||
--} |
||||
|
||||
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 = |
||||
errs |
||||
|> List.map voirErreur |
||||
|> String.concat |
||||
|> (++) "Il y a des problèmes aux endroits suivants :\n" |
||||
|
||||
voirErreur err = |
||||
"Ligne : " ++ String.fromInt err.row |
||||
++ " | Colonne : " ++ String.fromInt err.col |
||||
|
||||
{-- |
||||
voirBlocs = S.join "\n" << L.map voirBloc |
||||
|
||||
voirBloc prblm = |
||||
-- Debug.log "voirBloc " <| |
||||
case prblm of |
||||
Entete mcr sjt -> |
||||
voirMacro mcr |
||||
++ "\n" |
||||
++ voirBlocs sjt |
||||
VraiFaux prps -> |
||||
let |
||||
f prp = |
||||
case prp of |
||||
Vrai mcr -> voirMacro mcr |
||||
Faux mcr -> voirMacro mcr |
||||
in |
||||
S.join "\n" <| L.map f prps |
||||
VariableAremplacer ar sjt -> "" ++ voirBlocs sjt |
||||
--} |
||||
|
||||
sujet : Parser Blocs |
||||
sujet = |
||||
succeed (L.singleton << Sujet) |
||||
|= blocs |
||||
|
||||
blocs : Parser Blocs |
||||
blocs = |
||||
let |
||||
problemes prblms = |
||||
let |
||||
boucle = |
||||
-- Debug.log "Boucle sur un bloc (bis) " <| |
||||
succeed ( \prblm -> Loop (prblm :: prblms) ) |
||||
|= bloc |
||||
fin = |
||||
P.map (\_ -> Done (List.reverse prblms)) |
||||
suite col_ind = |
||||
oneOf |
||||
[ succeed () |
||||
|. end |
||||
|> fin |
||||
, if Tuple.first col_ind > Tuple.second col_ind then -- if col > ind |
||||
boucle -- |> Debug.log "Boucle sur un bloc " |
||||
else |
||||
succeed () |
||||
|> fin |
||||
] |
||||
-- |> Debug.log ( "Choix de l'embrachement dans la boucle (position " ++ S.fromInt (Tuple.first col_ind) ++ "x" ++ S.fromInt (Tuple.second col_ind) ++ ")" ) |
||||
in |
||||
succeed Tuple.pair |
||||
|. spaces |
||||
|= getCol |
||||
|= getIndent |
||||
|> andThen suite |
||||
in |
||||
loop [] problemes |
||||
|
||||
bloc : Parser Bloc |
||||
bloc = |
||||
let |
||||
suite = |
||||
flip withIndent |
||||
<| oneOf |
||||
[ vraiFaux |
||||
, qcm |
||||
, backtrackable variableAremplacer |
||||
, entete ] |
||||
in |
||||
getCol |
||||
|> andThen suite |
||||
|
||||
flip f a b = f b a |
||||
|
||||
reserve = Set.fromList |
||||
[ "qcm" |
||||
, "vrfx" |
||||
, "var" |
||||
] |
||||
|
||||
sousBlocs = |
||||
let |
||||
suite col_ind = |
||||
if Tuple.first col_ind > Tuple.second col_ind then -- if col > ind |
||||
withIndent (Tuple.first col_ind) ( lazy (\_ -> blocs) ) -- Aucune idée de l'effet du lazy, ça marche sans... |
||||
else |
||||
succeed [] |
||||
in |
||||
succeed Tuple.pair |
||||
|. spaces |
||||
|= getCol |
||||
|= getIndent |
||||
|> andThen suite |
||||
|
||||
entete : Parser Bloc |
||||
entete = |
||||
-- Debug.log "entete " <| |
||||
succeed Entete |
||||
|= macro |
||||
|= blocs -- sousBlocs |
||||
|
||||
vraiFaux = |
||||
-- Debug.log "vraiFaux " <| |
||||
succeed VraiFaux |
||||
|. keyword "vrfx" |
||||
|= propositions |
||||
|
||||
qcm = |
||||
-- Debug.log "vraiFaux " <| |
||||
succeed QCM |
||||
|. keyword "qcm" |
||||
|. espaces |
||||
|= macro |
||||
|= propositions |
||||
|
||||
propositions = |
||||
let |
||||
suiteBis prps = |
||||
let |
||||
boucle = |
||||
oneOf |
||||
[ succeed ( \mcr -> Loop ( Vrai mcr :: prps ) ) |
||||
|. symbol "+" |
||||
|= macro |
||||
, succeed ( \mcr -> Loop ( Faux mcr :: prps ) ) |
||||
|. symbol "-" |
||||
|= macro |
||||
] |
||||
fin = |
||||
P.map (\_ -> Done prps) |
||||
suite col_ind = |
||||
oneOf |
||||
[ succeed () |
||||
|. end |
||||
|> fin |
||||
, if Tuple.first col_ind > Tuple.second col_ind then -- if col > ind |
||||
boucle |
||||
else |
||||
succeed () |
||||
|> fin |
||||
] |
||||
in |
||||
succeed Tuple.pair |
||||
|. spaces |
||||
|= getCol |
||||
|= getIndent |
||||
|> andThen suite |
||||
in |
||||
loop [] suiteBis |
||||
|
||||
|
||||
{- |
||||
██████ █████ ██████ ███████ ███████ ██████ ███ ███ █████ ██████ ██████ ██████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ███████ ██████ ███████ █████ ██████ ██ ████ ██ ███████ ██ ██████ ██ ██ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ███████ ███████ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ██████ |
||||
-} |
||||
|
||||
type TexteVariable |
||||
= Texte String |
||||
| Variable String |
||||
|
||||
type alias Macro |
||||
= List TexteVariable |
||||
|
||||
voirMacro = S.concat << L.map voirTexteVariable |
||||
|
||||
voirTexteVariable txtvar = |
||||
case txtvar of |
||||
Texte txt -> txt |
||||
Variable var -> |
||||
let |
||||
expressionParseePotentielle = PM.parseMaths var |
||||
in |
||||
case expressionParseePotentielle of |
||||
Err erreur -> "L'expression est mal formée." |
||||
Ok expressionParsee -> |
||||
case Maybe.map F.teX <| PM.evaluer <| expressionParsee of |
||||
Just a -> a |
||||
Nothing -> "Les puissances non-entières ne sont pas acceptées." |
||||
|
||||
texteSansVariables : Parser TexteVariable |
||||
texteSansVariables = |
||||
let |
||||
condition caractere = caractere /= '#' && caractere /= '\n' |
||||
in |
||||
succeed Texte |
||||
|= P.getChompedString ( |
||||
succeed () |
||||
|. P.chompIf condition |
||||
|. P.chompWhile condition |
||||
|
||||
) |
||||
|
||||
expressionVariable : Parser TexteVariable |
||||
expressionVariable |
||||
= succeed Variable |
||||
|. symbol "#" |
||||
|= P.getChompedString ( P.chompUntil "#" ) |
||||
|. symbol "#" |
||||
|
||||
macro : Parser Macro |
||||
macro = |
||||
let |
||||
suite ls = |
||||
P.oneOf |
||||
[ succeed (\l -> P.Loop (l :: ls)) |
||||
|= P.oneOf |
||||
[ expressionVariable |
||||
, texteSansVariables |
||||
, backtrackable retourAlaLigne |
||||
] |
||||
, succeed () |
||||
|> P.map (\_ -> P.Done (List.reverse ls)) |
||||
] |
||||
in |
||||
P.loop [] suite |
||||
|
||||
retourAlaLigne = |
||||
let |
||||
suite ind = |
||||
succeed (Texte "\n") |
||||
|. token "\n" |
||||
|. token (S.repeat (ind - 1) " ") |
||||
in |
||||
getIndent |
||||
|> andThen suite |
||||
|
||||
|
||||
{- |
||||
██████ █████ ██████ ███████ ███████ ██████ ██ ██ █████ ██████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ███████ ██████ ███████ █████ ██████ ██ ██ ███████ ██████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ███████ ███████ ██ ██ ████ ██ ██ ██ ██ |
||||
-} |
||||
|
||||
type alias Variables = List Aremplacer |
||||
|
||||
type alias Aremplacer = |
||||
{ var : String |
||||
, vals : List String |
||||
} |
||||
|
||||
parserAremplacer variables = |
||||
case P.run aRemplacer variables of |
||||
Ok ars -> ars |
||||
Err _ -> Aremplacer "" [] |
||||
|
||||
espaces = |
||||
chompWhile <| (==) ' ' |
||||
|
||||
variableAremplacer : Parser Bloc |
||||
variableAremplacer = |
||||
-- Debug.log "variableAremplacer " <| |
||||
succeed VariableAremplacer |
||||
|= aRemplacer |
||||
|= blocs -- sousBlocs |
||||
|
||||
aRemplacer : Parser Aremplacer |
||||
aRemplacer = |
||||
succeed ( \x y -> Aremplacer x (L.map (F.raw << PM.evaluerBis) y) ) |
||||
|. espaces |
||||
|= variable |
||||
{ start = Char.isAlpha |
||||
, inner = Char.isAlpha |
||||
, reserved = reserve |
||||
} |
||||
|. espaces |
||||
|. symbol ":" |
||||
|= sequence |
||||
{ start = "" |
||||
, separator = "," |
||||
, end = "" |
||||
, spaces = espaces |
||||
, item = PM.expr |
||||
, trailing = P.Optional |
||||
} |
||||
|
||||
{- |
||||
███████ ██ ████████ █████ ██ ███████ █████ ████████ ██████ ██ ██████ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
███████ ██ ██ ███████ ██ █████ ███████ ██ ██ ██ ██ ██████ █████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
███████ █████ ██ ██ ██ ███████ ███████ ██ ██ ██ ██████ ██ ██ ██ ███████ |
||||
-} |
||||
|
||||
sujetsAleatoires : Blocs -> Random.Generator Blocs |
||||
sujetsAleatoires sjt = |
||||
blocsAleatoires sjt |
||||
|> Random.list 89 |
||||
|> Random.map L.concat |
||||
|
||||
blocsAleatoires : Blocs -> Random.Generator Blocs |
||||
blocsAleatoires sjt = |
||||
Random.map L.concat |
||||
<| Random.Extra.sequence |
||||
<| L.map blocAleatoire sjt |
||||
|
||||
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 = remplacerLaVariableDansLesBlocsAleatoires vrbl vl sj |
||||
in |
||||
{-- |
||||
Debug.log |
||||
( "blocAleatoire, branche VariableAremplacer, variable : " |
||||
++ vrbl ++ " " |
||||
) <| |
||||
--} |
||||
Random.andThen (f sjt) vlr |
||||
Entete mcr sjt -> |
||||
Random.map (L.singleton << Entete mcr) (blocsAleatoires sjt) |
||||
VraiFaux prps -> |
||||
Random.map |
||||
(L.singleton << VraiFaux << L.singleton) |
||||
( valeurAleatoire ( Vrai [ Texte "Le prof de maths est le meilleur." ] ) prps ) |
||||
QCM mcr prps -> |
||||
Random.map |
||||
(L.singleton << QCM mcr) |
||||
(Random.List.shuffle prps ) |
||||
|
||||
{-| Permet de prendre un élément aléatoire dans une liste |
||||
avec une valeur par défaut si la liste est vide. |
||||
-} |
||||
valeurAleatoire : a -> List a -> Random.Generator a |
||||
valeurAleatoire f fs = |
||||
case fs of |
||||
[] -> |
||||
Random.constant f |
||||
ff :: fss -> |
||||
Random.uniform ff fss |
||||
|
||||
remplacerLaVariableDansLeBlocAleatoire : |
||||
String -> String -> Bloc -> Random.Generator Blocs |
||||
remplacerLaVariableDansLeBlocAleatoire vrbl vlr prblm = |
||||
case prblm of |
||||
Sujet blcs -> |
||||
remplacerLaVariableDansLesBlocsAleatoires vrbl vlr blcs |
||||
VariableAremplacer ar sjt -> |
||||
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 ) |
||||
( remplacerLaVariableDansLesBlocsAleatoires vrbl vlr sjt ) |
||||
QCM mcr prps -> |
||||
Random.map L.singleton |
||||
<| Random.map2 QCM |
||||
( Random.constant <| remplacerLaVariableParLaValeurDansLaMacro vrbl vlr mcr ) |
||||
( Random.List.shuffle |
||||
<| L.map (remplacerLaVariableParLaValeurDansLaProposition vrbl vlr) prps |
||||
) |
||||
VraiFaux prps -> |
||||
Random.map |
||||
( L.singleton |
||||
<< VraiFaux |
||||
<< L.singleton |
||||
<< remplacerLaVariableParLaValeurDansLaProposition vrbl vlr |
||||
) |
||||
<| valeurAleatoire ( Vrai [ Texte "Le prof de maths est le meilleur." ] ) prps |
||||
|
||||
remplacerLaVariableDansLesBlocsAleatoires : |
||||
String -> String -> Blocs -> Random.Generator Blocs |
||||
remplacerLaVariableDansLesBlocsAleatoires vrbl vlr sjt = |
||||
Random.map L.concat |
||||
<| Random.Extra.sequence |
||||
<| L.map (remplacerLaVariableDansLeBlocAleatoire vrbl vlr) sjt |
||||
|
||||
remplacerLaVariableParLaValeurDansLaProposition vrbl vlr prp = |
||||
case prp of |
||||
Vrai mcr -> Vrai <| remplacerLaVariableParLaValeurDansLaMacro vrbl vlr mcr |
||||
Faux mcr -> Faux <| remplacerLaVariableParLaValeurDansLaMacro vrbl vlr mcr |
||||
|
||||
|
||||
{- |
||||
██████ ██ ██ ██ ███████ ███████ ██████ █████ ███ ██ |
||||
██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ████ ██ |
||||
██ ██ ██ ██ ██ ███ ███████ ██ ███████ ██ ██ ██ |
||||
██ ▄▄ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ |
||||
██████ ██████ ██ ███████ ███████ ██████ ██ ██ ██ ████ |
||||
▀▀ |
||||
-} |
||||
|
||||
quizScanVoirBlocs : Blocs -> String |
||||
quizScanVoirBlocs blcs = |
||||
S.join "\n" <| L.map quizScanVoirBloc blcs |
||||
|
||||
quizScanVoirBloc prblm = |
||||
case prblm of |
||||
Sujet blcs -> |
||||
"\n\\begin{Sujet}\n" |
||||
++ quizScanVoirBlocs blcs |
||||
++ "\n\\end{Sujet}" |
||||
Entete mcr sjt -> |
||||
-- "\n \\begin{itemize}\n \\item " |
||||
voirMacro mcr |
||||
++ "\n" |
||||
++ quizScanVoirBlocs sjt |
||||
-- ++ " \\end{itemize}" |
||||
QCM mcr prps -> |
||||
let |
||||
f prp = |
||||
case prp of |
||||
Vrai mc -> |
||||
" \\Vrai{" ++ voirMacro mc ++ "}" |
||||
Faux mc -> |
||||
" \\Faux{" ++ voirMacro mc ++ "}" |
||||
in |
||||
"\n \\begin{QCM}\n" |
||||
++ voirMacro mcr |
||||
++ "\n \\begin{enumerate}\n" |
||||
++ ( S.join "\n" <| L.map f prps ) |
||||
++ "\n \\end{enumerate}\n \\end{QCM}" |
||||
VraiFaux prps -> |
||||
let |
||||
f prp = |
||||
case prp of |
||||
Vrai mc -> |
||||
"\n \\begin{VraiFaux}\n \\Vrai{" ++ voirMacro mc ++ "}\n \\end{VraiFaux}" |
||||
Faux mc -> |
||||
"\n \\begin{VraiFaux}\n \\Faux{" ++ voirMacro mc ++ "}\n \\end{VraiFaux}" |
||||
in |
||||
S.concat <| L.map f prps |
||||
VariableAremplacer ar sjt -> |
||||
"" ++ quizScanVoirBlocs sjt |
||||
|
||||
|
||||
|
||||
{- |
||||
███ ███ ██ ██ ██ ███████ ██ ██ ██████ |
||||
████ ████ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ████ ██ ██ ███ █████ ██ ██ ██████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
██ ██ ██ ██ ██ ███████ ██████ ██ ██ |
||||
-} |
||||
|
||||
{-- |
||||
remplacer : String -> String -> List String |
||||
remplacer variables question = |
||||
let |
||||
ars = |
||||
S.lines variables |
||||
|> L.map parserAremplacer |
||||
mcr = |
||||
parserQuestion question |
||||
in |
||||
remplacerLesVariablesDansLaMacro ars mcr |
||||
|
||||
remplacerLesVariablesDansLaMacro : List Aremplacer -> Macro -> List String |
||||
remplacerLesVariablesDansLaMacro ars mcr = |
||||
remplacerLesVariablesDansLaMacroBis ars [mcr] |
||||
|> L.map voirMacro |
||||
|
||||
remplacerLesVariablesDansLaMacroBis : List Aremplacer -> List Macro -> List Macro |
||||
remplacerLesVariablesDansLaMacroBis ars macros = |
||||
case ars of |
||||
[] -> macros |
||||
ar :: arss -> |
||||
L.map (remplacerLaVariableDansLaMacro ar) macros |
||||
|> L.concat |
||||
|> remplacerLesVariablesDansLaMacroBis arss |
||||
|
||||
remplacerLaVariableDansLaMacro : Aremplacer -> Macro -> List Macro |
||||
remplacerLaVariableDansLaMacro ar mcr = |
||||
let |
||||
f val = remplacerLaVariableParLaValeurDansLaMacro ar.var val mcr |
||||
in |
||||
L.map f ar.vals |
||||
--} |
||||
|
||||
remplacerLaVariableParLaValeurDansLaMacro : String -> String -> Macro -> Macro |
||||
remplacerLaVariableParLaValeurDansLaMacro var val mcr = |
||||
L.map (remplacerLaVariableParLaValeurDansLeTexteVariable var val) mcr |
||||
|
||||
remplacerLaVariableParLaValeurDansLeTexteVariable var val tv = |
||||
case tv of |
||||
Texte chaine -> Texte chaine |
||||
Variable chaine -> Variable <| S.replace var val chaine |
||||
--} |
||||
|
||||
|
||||
{- |
||||
|
||||
███████ ██ ██ ██████ ██████ ███████ ███████ ███████ ██ ██████ ███ ██ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ |
||||
█████ ███ ██████ ██████ █████ ███████ ███████ ██ ██ ██ ██ ██ ██ ███████ |
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ |
||||
███████ ██ ██ ██ ██ ██ ███████ ███████ ███████ ██ ██████ ██ ████ ███████ |
||||
|
||||
|
||||
|
||||
-} |
||||
|
||||
monome a n = |
||||
if a == 0 then "" |
||||
else if n == 0 then ( String.fromInt a ) |
||||
else if (n,a) == (1,1) then "x" |
||||
else if (n,a) == (1,-1) then "-x" |
||||
else if n == 1 then ( String.fromInt a ) ++ "x" |
||||
else if a == 1 then "x^{" ++ ( String.fromInt n ) ++ "}" |
||||
else if a == -1 then "-x^{" ++ ( String.fromInt n ) ++ "}" |
||||
else ( String.fromInt a ) ++ "x^{" ++ ( String.fromInt n ) ++ "}" |
||||
|
||||
poly a_ks = |
||||
if a_ks == [] then "0" |
||||
else polyBis a_ks ( List.length a_ks - 1 ) |
||||
|
||||
polyBis a_ks n = |
||||
case a_ks of |
||||
[] -> "" |
||||
a_n :: a_kss -> |
||||
if a_n == 0 then polyBis a_kss ( n - 1 ) |
||||
else ( monome a_n n ) ++ ( polyGen a_kss ( n - 1 ) ) |
||||
|
||||
polyGen a_ks n = |
||||
case a_ks of |
||||
[] -> "" |
||||
a_i :: a_is -> |
||||
if a_i <= 0 then ( monome a_i n ) ++ ( polyGen a_is ( n - 1 ) ) |
||||
else "+" ++ ( monome a_i n ) ++ ( polyGen a_is ( n - 1 ) ) |
||||
|
||||
polyD a_ks = polyDbis a_ks ( List.length a_ks - 1 ) |
||||
|
||||
polyDbis a_ks n = |
||||
case a_ks of |
||||
[] -> [] |
||||
a_0 :: [] -> [] |
||||
a_k :: a_kss -> ( n*a_k ) :: polyDbis a_kss ( n - 1 ) |
||||
|
||||
dl a_ks = |
||||
if a_ks == [] then "0" |
||||
else dlBis a_ks 0 |
||||
|
||||
dlBis a_ks n = |
||||
case a_ks of |
||||
[] -> "" |
||||
premierCoef :: suite -> |
||||
if premierCoef == 0 then dlBis suite ( n + 1 ) |
||||
else ( monome premierCoef n ) ++ ( dlGen suite ( n + 1 ) ) |
||||
|
||||
dlGen a_ks n = |
||||
case a_ks of |
||||
[] -> "" |
||||
a_i :: a_is -> |
||||
if a_i <= 0 then ( monome a_i n ) ++ ( dlGen a_is ( n + 1 ) ) |
||||
else "+" ++ ( monome a_i n ) ++ ( dlGen a_is ( n + 1 ) ) |
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue