From dd5e8c7286f9994dded0afb7187460067a9135d4 Mon Sep 17 00:00:00 2001 From: Martin Putzlocher Date: Sun, 1 Dec 2024 18:57:12 +0100 Subject: [PATCH] =?UTF-8?q?Aufgabengenerierung=20f=C3=BCr=20ungleichnamige?= =?UTF-8?q?=20Br=C3=BCche=20und=20Neuentwurf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...uals_2brueche_addieren_ungleichnamig_v2.py | 238 ++++++++++++++++++ ..._2brueche_subtrahieren_ungleichnamig_v2.py | 238 ++++++++++++++++++ aufgabengenerator_formulas_fraction_new.py | 162 ++++++++++++ expression_parsing.py | 64 +++++ expression_parsing_2_ollama.py | 46 ++++ 5 files changed, 748 insertions(+) create mode 100644 aufgabengenerator_formuals_2brueche_addieren_ungleichnamig_v2.py create mode 100644 aufgabengenerator_formuals_2brueche_subtrahieren_ungleichnamig_v2.py create mode 100644 aufgabengenerator_formulas_fraction_new.py create mode 100644 expression_parsing.py create mode 100644 expression_parsing_2_ollama.py diff --git a/aufgabengenerator_formuals_2brueche_addieren_ungleichnamig_v2.py b/aufgabengenerator_formuals_2brueche_addieren_ungleichnamig_v2.py new file mode 100644 index 0000000..9114091 --- /dev/null +++ b/aufgabengenerator_formuals_2brueche_addieren_ungleichnamig_v2.py @@ -0,0 +1,238 @@ +import random +from math import gcd +import xml.etree.ElementTree as ET + +def lcm(a, b): + """Berechnet das kleinste gemeinsame Vielfache.""" + return abs(a * b) // gcd(a, b) + +def create_formula_question(numerator1, denominator1, numerator2, denominator2, n): + """Erzeugt eine Frage im Format 'Formulas'.""" + # GCD und das kleinste gemeinsame Vielfache für die Denominator + common_denominator = lcm(denominator1, denominator2) + new_numerator = (numerator1 * (common_denominator // denominator1)) + (numerator2 * (common_denominator // denominator2)) + gcd_result = gcd(new_numerator, common_denominator) + if gcd_result > 1: + print("kürzbar") + shortable = True + shortened_numerator = new_numerator // gcd_result + shortened_denominator = common_denominator // gcd_result + else: + shortable = False + + question = ET.Element('question', attrib={'type': 'formulas'}) + + name_elem = ET.SubElement(question, 'name') + text_elem = ET.SubElement(name_elem, 'text') + text_elem.text = 'Addition von 2 ungleichnamigen Brüchen {} E'.format(n) + + questiontext_elem = ET.SubElement(question, 'questiontext', attrib={'format': 'html'}) + text_elem = ET.SubElement(questiontext_elem, 'text') + if shortable: + text_elem.text = '''Addiere die Brüche und kürze das Ergebnis so weit wie möglich.

+

{#A}

]]> ''' + else: + text_elem.text = '''Addiere die beiden Brüche.

+

{#A}

]]> ''' + + # Allgemeines Feedback + generalfeedback_elem = ET.SubElement(question, 'generalfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(generalfeedback_elem, 'text') + text_elem.text = ' ' + + # Grundlegende Bewertungsinformationen + ET.SubElement(question, 'defaultgrade').text = '1.0000000' + ET.SubElement(question, 'penalty').text = '0.3333333' + ET.SubElement(question, 'hidden').text = '0' + ET.SubElement(question, 'idnumber').text = ' ' + + # Feedback für korrekte und inkorrekte Antworten + correctfeedback_elem = ET.SubElement(question, 'correctfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(correctfeedback_elem, 'text') + text_elem.text = '''Die Antwort ist richtig.

]]> ''' + + partiallycorrectfeedback_elem = ET.SubElement(question, 'partiallycorrectfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(partiallycorrectfeedback_elem, 'text') + text_elem.text = '''Die Antwort ist teilweise richtig.

]]> ''' + + incorrectfeedback_elem = ET.SubElement(question, 'incorrectfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(incorrectfeedback_elem, 'text') + text_elem.text = '''Die Antwort ist falsch.

]]>''' + + ET.SubElement(question, 'shownumcorrect') + + varsrandom_elem = ET.SubElement(question, 'varsrandom') + text_elem = ET.SubElement(varsrandom_elem, 'text') + text_elem.text = f' ' + + # Globale Variablen definieren + varsglobal_elem = ET.SubElement(question, 'varsglobal') + text_elem = ET.SubElement(varsglobal_elem, 'text') + text_elem.text = f'n = [{numerator1}, {numerator2}];\n d = [{denominator1}, {denominator2}];' + + answernumbering_elem = ET.SubElement(question, 'answernumbering') + text_elem = ET.SubElement(answernumbering_elem, 'text') + text_elem.text = 'ABCD' + + # Antworten definieren + answers_elem = ET.SubElement(question, 'answers') + + # Indizes für die Antworten + partindex_elem = ET.SubElement(answers_elem, 'partindex') + ET.SubElement(partindex_elem, 'text').text = '0' + + placeholder_elem = ET.SubElement(answers_elem, 'placeholder') + ET.SubElement(placeholder_elem, 'text').text = '#A' + + # Punktzahl auf Teilaufgabe + answermark_elem = ET.SubElement(answers_elem, 'answermark') + if shortable: + ET.SubElement(answermark_elem, 'text').text = '2' + else: + ET.SubElement(answermark_elem, 'text').text = '1' + + answertype_elem = ET.SubElement(answers_elem, 'answertype') + ET.SubElement(answertype_elem, 'text').text = '0' + + numbox_elem = ET.SubElement(answers_elem, 'numbox') + ET.SubElement(numbox_elem, 'text').text = '2' + + # Berechnungsvariablen + vars1_elem = ET.SubElement(answers_elem, 'vars1') + if shortable: + vars1_elem_text = "" + else: + vars1_elem_text = "" + ET.SubElement(vars1_elem, 'text').text = vars1_elem_text + + # Antwort + answer_elem = ET.SubElement(answers_elem, 'answer') + if shortable: + answer_text = '[thesumnum, cd, snum, sdenom]' + else: + answer_text = '[thesumnum, cd]' + ET.SubElement(answer_elem, 'text').text = answer_text + + answernotunique_elem = ET.SubElement(answers_elem, 'answernotunique') + ET.SubElement(answernotunique_elem, 'text').text = '0' + + vars2_elem = ET.SubElement(answers_elem, 'vars2') + if shortable: + vars2_elem_text = "" + else: + vars2_elem_text = "" + ET.SubElement(vars2_elem, 'text').text = vars2_elem_text + + correctness_elem = ET.SubElement(answers_elem, 'correctness') + if shortable: + ET.SubElement(correctness_elem, 'text').text = '0.25*ga + 0.25*gb + 0.25*gsa + 0.25*gsb' + else: + ET.SubElement(correctness_elem, 'text').text = '0.5*ga + 0.5*gb' + + unitpenalty_elem = ET.SubElement(answers_elem, 'unitpenalty') + ET.SubElement(unitpenalty_elem, 'text').text = '1' + + postunit_elem = ET.SubElement(answers_elem, 'postunit') + ET.SubElement(postunit_elem, 'text').text = ' ' + + ruleid_elem = ET.SubElement(answers_elem, 'ruleid') + ET.SubElement(ruleid_elem, 'text').text = '1' + + otherrule_elem = ET.SubElement(answers_elem, 'otherrule') + ET.SubElement(otherrule_elem, 'text').text = ' ' + + # Unterfragen-Text + subqtext_elem = ET.SubElement(answers_elem, 'subqtext', attrib={'format': 'html'}) + if shortable: + sub_question_text = '''Berechne:

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1} = gekürzt: {_2} / {_3}

]]> ''' + else: + sub_question_text = '''Berechne:

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1}

]]> ''' + ET.SubElement(subqtext_elem, 'text').text = sub_question_text + + # Lösungshinweis + feedback_elem = ET.SubElement(answers_elem, 'feedback', attrib={'format': 'html'}) + if shortable: + feedback_text = '''Lösungshinweis +

Die korrekte Lösung ist:

+

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} + \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} = \\frac{{snum}}{{sdenom}} \\)

]]>''' + else: + feedback_text = '''Lösungshinweis +

Die korrekte Lösung ist:

+

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} + \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} \\)

]]>''' + ET.SubElement(feedback_elem, 'text').text = feedback_text + + # correctfeedback + + correctfeedback_elem = ET.SubElement(answers_elem, 'correctfeedback', attrib={'format': 'html'}) + correctfeedback_text = '''Richtig!

]]>''' + ET.SubElement(correctfeedback_elem, 'text').text = correctfeedback_text + + # partially correct feedback + + pcorrectfeedback_elem = ET.SubElement(answers_elem, 'partiallycorrectfeedback', attrib={'format': 'html'}) + pcorrectfeedback_text = '''Teilweise richtig.

]]>''' + ET.SubElement(pcorrectfeedback_elem, 'text').text = pcorrectfeedback_text + + # incorrect feedback + incorrectfeedback_elem = ET.SubElement(answers_elem, 'incorrectfeedback', attrib={'format': 'html'}) + incorrectfeedback_text = '''Leider nicht richtig.

]]>''' + ET.SubElement(incorrectfeedback_elem, 'text').text = incorrectfeedback_text + + return question + +def generate_questions(num_questions): + """Generiert Aufgaben für die Addition ungleichnamiger Brüche.""" + questions = [] + + for i in range(num_questions): + numerator1 = random.randint(1, 10) + denominator1 = random.randint(2, 10) + numerator2 = random.randint(1, 10) + denominator2 = random.randint(2, 10) + + # Sicherstellen, dass die Nenner unterschiedlich sind + while denominator1 == denominator2: + denominator2 = random.randint(2, 10) + + question = create_formula_question(numerator1, denominator1, numerator2, denominator2, i) + questions.append(question) + + return questions + +def create_quiz(questions): + """Erzeugt die gesamte Quiz-Struktur.""" + quiz = ET.Element('quiz') + for q in questions: + quiz.append(q) + return quiz + +def save_to_file(xml_element, filename): + """Speichert das XML-Dokument in einer Datei.""" + tree = ET.ElementTree(xml_element) + ET.indent(tree) + with open(filename, 'wb') as f: + tree.write(f, encoding='utf-8', xml_declaration=True) + +def ersetze_vars2(xml_file): + # XML-Datei lesen + with open(xml_file, 'r') as f: + text = f.read() + + text = text.replace("&","&") + text = text.replace("<","<") + text = text.replace(">",">") + + with open(xml_file, 'w') as f: + f.write(text) + + +# Hauptprogramm +if __name__ == "__main__": + num_questions = 20 # Anzahl der zu generierenden Aufgaben + questions = generate_questions(num_questions) + quiz = create_quiz(questions) + + save_to_file(quiz, 'formulas_fraction_addition_quiz.xml') + ersetze_vars2('formulas_fraction_addition_quiz.xml') + + print("Moodle-XML-Datei 'formulas_fraction_addition_quiz.xml' erfolgreich erstellt.") diff --git a/aufgabengenerator_formuals_2brueche_subtrahieren_ungleichnamig_v2.py b/aufgabengenerator_formuals_2brueche_subtrahieren_ungleichnamig_v2.py new file mode 100644 index 0000000..3609b10 --- /dev/null +++ b/aufgabengenerator_formuals_2brueche_subtrahieren_ungleichnamig_v2.py @@ -0,0 +1,238 @@ +import random +from math import gcd +import xml.etree.ElementTree as ET + +def lcm(a, b): + """Berechnet das kleinste gemeinsame Vielfache.""" + return abs(a * b) // gcd(a, b) + +def create_formula_question(numerator1, denominator1, numerator2, denominator2, n): + """Erzeugt eine Frage im Format 'Formulas'.""" + # GCD und das kleinste gemeinsame Vielfache für die Denominator + common_denominator = lcm(denominator1, denominator2) + new_numerator = (numerator1 * (common_denominator // denominator1)) - (numerator2 * (common_denominator // denominator2)) + gcd_result = gcd(new_numerator, common_denominator) + if gcd_result > 1: + print("kürzbar") + shortable = True + shortened_numerator = new_numerator // gcd_result + shortened_denominator = common_denominator // gcd_result + else: + shortable = False + + question = ET.Element('question', attrib={'type': 'formulas'}) + + name_elem = ET.SubElement(question, 'name') + text_elem = ET.SubElement(name_elem, 'text') + text_elem.text = 'Subtraktion von 2 ungleichnamigen Brüchen {} E'.format(n) + + questiontext_elem = ET.SubElement(question, 'questiontext', attrib={'format': 'html'}) + text_elem = ET.SubElement(questiontext_elem, 'text') + if shortable: + text_elem.text = '''Subtrahiere die Brüche und kürze das Ergebnis so weit wie möglich.

+

{#A}

]]> ''' + else: + text_elem.text = '''Subtrahiere die beiden Brüche.

+

{#A}

]]> ''' + + # Allgemeines Feedback + generalfeedback_elem = ET.SubElement(question, 'generalfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(generalfeedback_elem, 'text') + text_elem.text = ' ' + + # Grundlegende Bewertungsinformationen + ET.SubElement(question, 'defaultgrade').text = '1.0000000' + ET.SubElement(question, 'penalty').text = '0.3333333' + ET.SubElement(question, 'hidden').text = '0' + ET.SubElement(question, 'idnumber').text = ' ' + + # Feedback für korrekte und inkorrekte Antworten + correctfeedback_elem = ET.SubElement(question, 'correctfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(correctfeedback_elem, 'text') + text_elem.text = '''Die Antwort ist richtig.

]]> ''' + + partiallycorrectfeedback_elem = ET.SubElement(question, 'partiallycorrectfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(partiallycorrectfeedback_elem, 'text') + text_elem.text = '''Die Antwort ist teilweise richtig.

]]> ''' + + incorrectfeedback_elem = ET.SubElement(question, 'incorrectfeedback', attrib={'format': 'html'}) + text_elem = ET.SubElement(incorrectfeedback_elem, 'text') + text_elem.text = '''Die Antwort ist falsch.

]]>''' + + ET.SubElement(question, 'shownumcorrect') + + varsrandom_elem = ET.SubElement(question, 'varsrandom') + text_elem = ET.SubElement(varsrandom_elem, 'text') + text_elem.text = f' ' + + # Globale Variablen definieren + varsglobal_elem = ET.SubElement(question, 'varsglobal') + text_elem = ET.SubElement(varsglobal_elem, 'text') + text_elem.text = f'n = [{numerator1}, {numerator2}];\n d = [{denominator1}, {denominator2}];' + + answernumbering_elem = ET.SubElement(question, 'answernumbering') + text_elem = ET.SubElement(answernumbering_elem, 'text') + text_elem.text = 'ABCD' + + # Antworten definieren + answers_elem = ET.SubElement(question, 'answers') + + # Indizes für die Antworten + partindex_elem = ET.SubElement(answers_elem, 'partindex') + ET.SubElement(partindex_elem, 'text').text = '0' + + placeholder_elem = ET.SubElement(answers_elem, 'placeholder') + ET.SubElement(placeholder_elem, 'text').text = '#A' + + # Punktzahl auf Teilaufgabe + answermark_elem = ET.SubElement(answers_elem, 'answermark') + if shortable: + ET.SubElement(answermark_elem, 'text').text = '2' + else: + ET.SubElement(answermark_elem, 'text').text = '1' + + answertype_elem = ET.SubElement(answers_elem, 'answertype') + ET.SubElement(answertype_elem, 'text').text = '0' + + numbox_elem = ET.SubElement(answers_elem, 'numbox') + ET.SubElement(numbox_elem, 'text').text = '2' + + # Berechnungsvariablen + vars1_elem = ET.SubElement(answers_elem, 'vars1') + if shortable: + vars1_elem_text = "" + else: + vars1_elem_text = "" + ET.SubElement(vars1_elem, 'text').text = vars1_elem_text + + # Antwort + answer_elem = ET.SubElement(answers_elem, 'answer') + if shortable: + answer_text = '[thesumnum, cd, snum, sdenom]' + else: + answer_text = '[thesumnum, cd]' + ET.SubElement(answer_elem, 'text').text = answer_text + + answernotunique_elem = ET.SubElement(answers_elem, 'answernotunique') + ET.SubElement(answernotunique_elem, 'text').text = '0' + + vars2_elem = ET.SubElement(answers_elem, 'vars2') + if shortable: + vars2_elem_text = "" + else: + vars2_elem_text = "" + ET.SubElement(vars2_elem, 'text').text = vars2_elem_text + + correctness_elem = ET.SubElement(answers_elem, 'correctness') + if shortable: + ET.SubElement(correctness_elem, 'text').text = '0.25*ga + 0.25*gb + 0.25*gsa + 0.25*gsb' + else: + ET.SubElement(correctness_elem, 'text').text = '0.5*ga + 0.5*gb' + + unitpenalty_elem = ET.SubElement(answers_elem, 'unitpenalty') + ET.SubElement(unitpenalty_elem, 'text').text = '1' + + postunit_elem = ET.SubElement(answers_elem, 'postunit') + ET.SubElement(postunit_elem, 'text').text = ' ' + + ruleid_elem = ET.SubElement(answers_elem, 'ruleid') + ET.SubElement(ruleid_elem, 'text').text = '1' + + otherrule_elem = ET.SubElement(answers_elem, 'otherrule') + ET.SubElement(otherrule_elem, 'text').text = ' ' + + # Unterfragen-Text + subqtext_elem = ET.SubElement(answers_elem, 'subqtext', attrib={'format': 'html'}) + if shortable: + sub_question_text = '''Berechne:

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1} = gekürzt: {_2} / {_3}

]]> ''' + else: + sub_question_text = '''Berechne:

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1}

]]> ''' + ET.SubElement(subqtext_elem, 'text').text = sub_question_text + + # Lösungshinweis + feedback_elem = ET.SubElement(answers_elem, 'feedback', attrib={'format': 'html'}) + if shortable: + feedback_text = '''Lösungshinweis +

Die korrekte Lösung ist:

+

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} - \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} = \\frac{{snum}}{{sdenom}} \\)

]]>''' + else: + feedback_text = '''Lösungshinweis +

Die korrekte Lösung ist:

+

\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} - \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} \\)

]]>''' + ET.SubElement(feedback_elem, 'text').text = feedback_text + + # correctfeedback + + correctfeedback_elem = ET.SubElement(answers_elem, 'correctfeedback', attrib={'format': 'html'}) + correctfeedback_text = '''Richtig!

]]>''' + ET.SubElement(correctfeedback_elem, 'text').text = correctfeedback_text + + # partially correct feedback + + pcorrectfeedback_elem = ET.SubElement(answers_elem, 'partiallycorrectfeedback', attrib={'format': 'html'}) + pcorrectfeedback_text = '''Teilweise richtig.

]]>''' + ET.SubElement(pcorrectfeedback_elem, 'text').text = pcorrectfeedback_text + + # incorrect feedback + incorrectfeedback_elem = ET.SubElement(answers_elem, 'incorrectfeedback', attrib={'format': 'html'}) + incorrectfeedback_text = '''Leider nicht richtig.

]]>''' + ET.SubElement(incorrectfeedback_elem, 'text').text = incorrectfeedback_text + + return question + +def generate_questions(num_questions): + """Generiert Aufgaben für die Addition ungleichnamiger Brüche.""" + questions = [] + + for i in range(num_questions): + numerator1 = random.randint(1, 10) + denominator1 = random.randint(2, 10) + numerator2 = random.randint(1, 10) + denominator2 = random.randint(2, 10) + + # Sicherstellen, dass die Nenner unterschiedlich sind + while denominator1 == denominator2: + denominator2 = random.randint(2, 10) + + question = create_formula_question(numerator1, denominator1, numerator2, denominator2, i) + questions.append(question) + + return questions + +def create_quiz(questions): + """Erzeugt die gesamte Quiz-Struktur.""" + quiz = ET.Element('quiz') + for q in questions: + quiz.append(q) + return quiz + +def save_to_file(xml_element, filename): + """Speichert das XML-Dokument in einer Datei.""" + tree = ET.ElementTree(xml_element) + ET.indent(tree) + with open(filename, 'wb') as f: + tree.write(f, encoding='utf-8', xml_declaration=True) + +def ersetze_vars2(xml_file): + # XML-Datei lesen + with open(xml_file, 'r') as f: + text = f.read() + + text = text.replace("&","&") + text = text.replace("<","<") + text = text.replace(">",">") + + with open(xml_file, 'w') as f: + f.write(text) + + +# Hauptprogramm +if __name__ == "__main__": + num_questions = 20 # Anzahl der zu generierenden Aufgaben + questions = generate_questions(num_questions) + quiz = create_quiz(questions) + + save_to_file(quiz, 'formulas_fraction_addition_quiz.xml') + ersetze_vars2('formulas_fraction_addition_quiz.xml') + + print("Moodle-XML-Datei 'formulas_fraction_addition_quiz.xml' erfolgreich erstellt.") diff --git a/aufgabengenerator_formulas_fraction_new.py b/aufgabengenerator_formulas_fraction_new.py new file mode 100644 index 0000000..bddc6bc --- /dev/null +++ b/aufgabengenerator_formulas_fraction_new.py @@ -0,0 +1,162 @@ +import random +from math import gcd, lcm +import xml.etree.ElementTree as ET +from collections import Counter + +# Konstanten +# Anzahl der zu generierenden Fragen. +NUM_QUESTIONS = 1 +# Algebraische Struktur der Aufgaben +STRUCTURE = "-(+)" + +# TODO +# Platzhalter hinzufügen + +# Anzahl der benötigten Brüche +NUM_FRACTIONS = 1 + STRUCTURE.count("+") + STRUCTURE.count("+") + STRUCTURE.count("*") + STRUCTURE.count("/") +# Größter Zähler +MAX_NUMERATOR = 20 +# Größter Nenner +MAX_DENOMINATOR = 20 +# Größter erlaubter gemeinsamer Nenner +MAX_COMMON_DENOMINATOR = 100 +# Dateiname für Ausgabe +FILENAME = 'formulas_new_quiz.xml' + + + + + +def create_formula_question(n): + numerators = [] + denominators = [] + for i in range(NUM_FRACTIONS): + n = random.randint(1, MAX_NUMERATOR) + d = random.randint(2, MAX_DENOMINATOR) + numerators.append(n) + denominators.append(d) + + # Sicherstellen, dass die Nenner unterschiedlich sind + same_denominators = [k for k,v in Counter(denominators).items() if v>1] + while len(same_denominators) > 1: + new_denom = random.randint(2, MAX_DENOMINATOR) + denominators.replace(same_denominators[0], new_denom) + same_denominators = [k for k,v in Counter(denominators).items() if v>1] + # [DEBUG] + print(numerators) + print(denominators) + # [DEBUG] + *denoms_integers, = denominators + common_denominator = lcm(*denoms_integers) + + fractions = [] + for i in range(NUM_FRACTIONS): + fraction = {"n": numerators[i], "d": denominators[i]} + fractions.append(fraction) + # [DEBUG] + print(fractions) + # [DEBUG] + + cd = common_denominator + expanded_numerators = [frac["n"] * cd // frac["d"] for frac in fractions] + + expanded_fractions = [] + for i in range(NUM_FRACTIONS): + fraction = {"n": expanded_numerators[i], "d": cd} + expanded_fractions.append(fraction) + # [DEBUG] + print(expanded_fractions) + # [DEBUG] + + eval_string = f"{expanded_numerators[0]}" + cnt_next_fraction = 1 + for c in STRUCTURE: + if c == "(" or c ==")": + eval_string += c + elif c == "+" or c == "-" or c == "*" or c == "/": + eval_string += c + eval_string += f"{expanded_numerators[cnt_next_fraction]}" + cnt_next_fraction += 1 + + # [DEBUG] + print(eval_string) + # [DEBUG] + result_numerator = eval(eval_string) + + question = ET.Element('question', attrib={'type': 'formulas'}) + + return question + + +def generate_questions(num_questions): + """ + Generiert eine Liste von Aufgaben. + + Args: + num_questions (int): Die Anzahl der zu generierenden Fragen. + + Returns: + list: Eine Liste von Frage-Elementen. + """ + questions = [] + for i in range(num_questions): + # Hier können Sie die Funktionsdefinition für die Erzeugung einer Aufgabe hinzufügen + questions.append(create_formula_question(i)) + + return questions + +def create_quiz(questions): + """ + Erstellt das gesamte Quiz-Element. + + Args: + questions (list): Eine Liste von Frage-Elementen. + + Returns: + Element: Das gesamte Quiz -Element. + """ + quiz = ET.Element('quiz') + for q in questions: + quiz.append(q) + return quiz + +def save_to_file(xml_element, filename): + """ + Speichert das XML-Dokument in eine Datei. + + Args: + xml_element (Element): Das XML-Element, zu speichern. + filename (str): Der Name der Zieldatei. + + Returns: + None + """ + tree = ET.ElementTree(xml_element) + with open(filename, 'wb') as f: + tree.write(f, encoding='utf_8', xml_declaration=True) + + return + +def replace_vars2(xml_file): + # XML-Datei lesen + with open(xml_file, 'r') as f: + text = f.read() + + text = text.replace("&","&") + text = text.replace("<","<") + text = text.replace(">",">") + + with open(xml_file, 'w') as f: + f.write(text) + + +# Hauptprogramm +if __name__ == "__main__": + + questions = generate_questions(NUM_QUESTIONS) + quiz = create_quiz(questions) + + save_to_file(quiz, FILENAME) + replace_vars2(FILENAME) + + print("Moodle-XMLDatei erfolgreich erstellt.") diff --git a/expression_parsing.py b/expression_parsing.py new file mode 100644 index 0000000..782c6bb --- /dev/null +++ b/expression_parsing.py @@ -0,0 +1,64 @@ +import re +import random +import operator + +# Define operators and their corresponding functions +ops = { + '+': operator.add, + '-': operator.sub, + '*': operator.mul, + '/': operator.truediv +} + +def calculate(expression, num=1): + """Calculate the result of the expression using n[0], n[1], ...""" + numbers = [random.randint(1, 10) for _ in range(num)] + print(numbers) + # Replace placeholders with actual number values + for i, num in enumerate(numbers): + placeholder = f'n{i}' + expression = re.sub(rf'\{placeholder}\s*([+-/*])', rf'{num} \1', expression) + expression = re.sub(rf'({placeholder})\s*', rf'{num}', expression) + + print(expression) + # Evaluate the result + return eval(expression) + +def parse_expression(expression): + """Parse an algebraic expression and determine the required number of numbers""" + op_count = 0 + + # Count operators in parentheses + paren_count = 1 + max_depth = 0 + + for i, char in enumerate(expression): + if char == '(': + paren_count += 1 + elif char == ')': + paren_count -= 1 + + # Update max depth when a closed parenthesis is encountered + max_depth = max(max_depth, paren_count) + + if char in ops.keys(): + op_count += 1 + + return max_depth + op_count + +def main(): + expression = input("Enter an algebraic structure (e.g., -(+)): ") + + # Handle the empty string case by providing a default expression + if not expression: + expression = 'n0-(n1+n2)' + + num_needed = parse_expression(expression) + + result = calculate(expression, num_needed) + + print(f"Generated calculation: {expression}") + print(f"Result: {result}") + +if __name__ == "__main__": + main() diff --git a/expression_parsing_2_ollama.py b/expression_parsing_2_ollama.py new file mode 100644 index 0000000..5699fa6 --- /dev/null +++ b/expression_parsing_2_ollama.py @@ -0,0 +1,46 @@ +import re +import random + +def calculate(expression, num=1): + """Calculate the result of the expression using n[0], n[1], ...""" + + # Generate random numbers and replace placeholders with them in the expression + numbers = [random.randint(1, 10) for _ in range(num)] + new_expression = expression + + for i, num in enumerate(numbers): + placeholder = f'n[{i}]' + new_expression = re.sub(rf'\b{n[i]}(\W|$)', str(num), new_expression) + + # Evaluate the result + return eval(new_expression) + +def parse_expression(expression): + """Parse an algebraic expression and determine the required number of numbers""" + + count_n = 0 + + i = 0 + for char in expression: + if char == 'n' and (i+1 < len(expression) and expression[i+1] == '['): + count_n += 1 + i += 1 + + return count_n + +def main(): + expression = input("Enter an algebraic structure (e.g., -(+)): ") + + # Handle the empty string case by providing a default expression + if not expression: + expression = '-(+)' + + num_needed = parse_expression(expression) + + result = calculate(expression, num_needed) + + print(f"Generated calculation: {expression}") + print(f"Result: {result}") + +if __name__ == "__main__": + main()