gesucht wird eine kreative Methode um Sachaufgaben zu erstellen
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
und was mache ich jetzt damit, damit ich es in der Datenbank speichern kann?
1. das ist Python und nicht JSON, wenn Du json haben willst, dann benutze einfach json.dumps.
2. ist nicht nötig, wenn Du nicht mit Rest rechnen willst. Ist auch ziemliches gefrickle.
3. dank eigener Formatter-Klasse baut man das mit dem Rest am besten in format_field ein.
4. Verstehe ich nicht, mein Beispiel jat doch zwei unterschiedliche Variablengruppen. Zeig ein Beispiel, das Deiner Meinung nach nicht funktioniert.
2. ist nicht nötig, wenn Du nicht mit Rest rechnen willst. Ist auch ziemliches gefrickle.
3. dank eigener Formatter-Klasse baut man das mit dem Rest am besten in format_field ein.
4. Verstehe ich nicht, mein Beispiel jat doch zwei unterschiedliche Variablengruppen. Zeig ein Beispiel, das Deiner Meinung nach nicht funktioniert.
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
1. Ich erstelle die Aufgaben direkt im Admin Tool. Jetzt muss ich wieder dumm fragen: Wie bekomme ich da diese Liste in mein JSONField? Oder soll eine Funktion erstellen um die Daten in die Datenbank zu bringen?
2. Heißt das, die ganze Funktion wird nicht gebraucht (wo greife ich darauf zu?) oder soll ich nur das mit divmod weglassen?
3. Darüber muss ich erst mal hirnen.
4. Ich hatte an Aufgaben mit Division gedacht bei denen ja kein Rest entstehen soll wie z.B.
"Ein Sportler legt in 1 Stunde eine Strecke von 12 km zurück. Wie weit kommt er in 45 Minuten?" Da muss ich sicherstellen, dass alle Kombinationen von Strecke und Zeit sicher geteilt werden können und hätte sie gruppiert. Geht aber sicher auch anders.
2. Heißt das, die ganze Funktion wird nicht gebraucht (wo greife ich darauf zu?) oder soll ich nur das mit divmod weglassen?
3. Darüber muss ich erst mal hirnen.
4. Ich hatte an Aufgaben mit Division gedacht bei denen ja kein Rest entstehen soll wie z.B.
"Ein Sportler legt in 1 Stunde eine Strecke von 12 km zurück. Wie weit kommt er in 45 Minuten?" Da muss ich sicherstellen, dass alle Kombinationen von Strecke und Zeit sicher geteilt werden können und hätte sie gruppiert. Geht aber sicher auch anders.
Würde ich jetzt auch gruppieren, warum sollte man es anders machen?Pitwheazle hat geschrieben: ↑Donnerstag 30. März 2023, 15:56 4. Ich hatte an Aufgaben mit Division gedacht bei denen ja kein Rest entstehen soll wie z.B.
"Ein Sportler legt in 1 Stunde eine Strecke von 12 km zurück. Wie weit kommt er in 45 Minuten?" Da muss ich sicherstellen, dass alle Kombinationen von Strecke und Zeit sicher geteilt werden können und hätte sie gruppiert. Geht aber sicher auch anders.
Code: Alles auswählen
variablen_auswahl = {
"a": [
(1, 12, 45),
],
_______________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python https://docs.python-guide.org/
Beim Programmieren sollte eine Funktion genau eine Sache machen.
Eine Funktion, die eine Textaufgabe ausgibt, sollte sich nicht mit den Details der Formatierung aufhalten, das sollte in eine eigene Funktion wandern, z.B. in die Formattierungsklasse, die man ja trivial um eine "Rest"-Ausgabe erweitern kann:
Eine Funktion, die eine Textaufgabe ausgibt, sollte sich nicht mit den Details der Formatierung aufhalten, das sollte in eine eigene Funktion wandern, z.B. in die Formattierungsklasse, die man ja trivial um eine "Rest"-Ausgabe erweitern kann:
Code: Alles auswählen
class MathFormatter(string.Formatter):
def format_field(self, value, format_spec):
""" floats are formatted with comma.
There is a special format specifier for division with remainder.
{:r} only output there is a remainder
{:<d>r} output the remainder for division with <d> (e.g. {:15r}).
"""
if format_spec.endswith('r'):
result = format(value, '.0f')
if value % 1:
if format_spec == 'r':
result += " + Rest"
else:
rest = round((value % 1) * int(format_spec[:-1]))
result += f" + Rest {rest:d}"
else:
result = format(value, format_spec)
if format_spec.endswith('f') or isinstance(value, float):
result = result.replace('.', ',')
return result
def evaluate(self, format_string, **kwargs):
text = format_string.split('=')[0].format(**kwargs)
return Parser().evaluate(text, {})
text = "Wie viele {a}cm lange Stücke kann man von einer {b}m langen Leiste absägen?"
ergebnis = "100*{b} / {a} = {:{a}r}"
variablen_auswahl = {"a": [5,10,15,20,25], "b": [1,1.2,1.5,2,2.5]}
variablen = {
name: random.choice(werte)
for name, werte in variablen_auswahl.items()
}
formatter = MathFormatter()
loesung = formatter.evaluate(ergebnis, **variablen)
print(formatter.format(text, **variablen))
print(formatter.format(ergebnis, loesung, **variablen))
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
Gute Güte! Vielen Dank auch dafür. Ein bisschen lerne ich ja auch dazu.
Für mich wäre es jetzt wichtig zu wissen, wie ich diese wunderbare Liste mit dem gesparten Geld und den Pullovern in die Datenbank bekomme.
Für mich wäre es jetzt wichtig zu wissen, wie ich diese wunderbare Liste mit dem gesparten Geld und den Pullovern in die Datenbank bekomme.
Hab ich zwar schon geschrieben aber nochmal:
Code: Alles auswählen
variablen_auswahl = {
"a": [
('Julia', 'Sie', 'ihr'),
('Sophie', 'Sie', 'ihr'),
('Maria', 'Sie', 'ihr'),
('Paul', 'Er', 'ihm')],
"d": [
("einen neuen Pullover", "der"),
("eine neue Tasche", "die")],
"e": [10, 15, 20],
"f": [25, 28, 30]
}
print(json.dumps(variablen_auswahl))
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
Das mit dem „print“ erzeugt das JSONTeil!
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
Ich habe jetzt wieder Festland unter den Füßen (Grüße aus Cadaques von der Costa Brava) und habe deine letzten Vorschläge eingearbeitet. Das mit
Und vielen dank für die Resteberechnung - funktioniert auch prima!
habe ich hinbekommen. Auf den ersten Blick ändert das am Original nur die runden in eckige Klammern - ist es das oder gibt es noch was, das man (ich) nicht sieht?
Und vielen dank für die Resteberechnung - funktioniert auch prima!
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
@sirius3:
Kannst du da nochmal drüberschauen. Ich habe in deinem Code "ergebnis" und "loesung" vertauscht - glaube aber nicht, dass es daran liegt:
Das Ergebnis sollte "6" sein und die Lösung "Lösung: 100*1 / 15 = 6 + Rest". Als Lösung erhalte ich aber "Lösung: 100*1 / 15 = 7 + Rest 10" (Und 6 wird natürlich nicht akkzeptiert).
Ich habe es wirklich versucht, mich durch deinen "formatter" Code zu arbeiten - ich kriege es nicht raus.
Kannst du da nochmal drüberschauen. Ich habe in deinem Code "ergebnis" und "loesung" vertauscht - glaube aber nicht, dass es daran liegt:
Code: Alles auswählen
text = "Wie viele {a}cm lange Stücke kann man von einer {b}m langen Leiste absägen?"
loesung = "100*{b} / {a} = {:{a}r}"
variablen_auswahl = {"a": [15], "b": [1]}
text=aufgabe.text
loesung=aufgabe.loesung
frage = aufgabe.links_text
einheit = aufgabe.rechts_text
variablen = {
name: random.choice(werte)
for name, werte in variablen_auswahl.items()
}
formatter = MathFormatter()
ergebnis = formatter.evaluate(loesung, **variablen)
text = (formatter.format(text, **variablen))
lsg = (formatter.format(loesung, ergebnis, **variablen))
Ich habe es wirklich versucht, mich durch deinen "formatter" Code zu arbeiten - ich kriege es nicht raus.
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
Ein Nachtrag:
Wer des Lesens mächtig ist hat mehr vom Leben. Ich habe das mit der Erklärung mit dem Rest jetzt verstanden (Und das {a} weggelassen). Das Ergebnis stimmt aber trotzdem noch nicht: Das Ergebnis ist bei mir immer noch 6,6666, das müsste hier noch abgerundet werden. Habe ich da was falsch gemacht oder muss das noch ergänzt werden - wenn ja, wo und wie?
Und noch eine Anmerkung: Ich konnte den Code bisher nur innerhalb meines Projektes ausprobieren. Mir ist es nicht gelungen, ihn innerhalb eines online Compiler/Interpreter auszuprobieren, da ich nicht weiß, wie ich das mit dem "parser()" importiere.
.... nicht, dass ich den Rest ganz durchschaut hätte ...
Wer des Lesens mächtig ist hat mehr vom Leben. Ich habe das mit der Erklärung mit dem Rest jetzt verstanden (Und das {a} weggelassen). Das Ergebnis stimmt aber trotzdem noch nicht: Das Ergebnis ist bei mir immer noch 6,6666, das müsste hier noch abgerundet werden. Habe ich da was falsch gemacht oder muss das noch ergänzt werden - wenn ja, wo und wie?
Und noch eine Anmerkung: Ich konnte den Code bisher nur innerhalb meines Projektes ausprobieren. Mir ist es nicht gelungen, ihn innerhalb eines online Compiler/Interpreter auszuprobieren, da ich nicht weiß, wie ich das mit dem "parser()" importiere.
.... nicht, dass ich den Rest ganz durchschaut hätte ...
Ja, das mit dem Runden hatte ich nicht auf dem Schirm.
Der `parser` wird so, wie jedes andere Paket auch, installiert.
Code: Alles auswählen
class MathFormatter(string.Formatter):
def format_field(self, value, format_spec):
""" floats are formatted with comma.
There is a special format specifier for division with remainder.
{:r} only output there is a remainder
{:<d>r} output the remainder for division with <d> (e.g. {:15r}).
{:<d>c} output the number as a fraction with divisor <d>.
"""
if format_spec.endswith(('r', 'c')):
result = format(int(value), 'd')
if value % 1:
if format_spec == 'r':
result += " + Rest"
else:
divisor = int(format_spec[:-1])
rest = round((value % 1) * divisor)
if format_spec.endswith('r'):
result += f" + Rest {rest:d}"
else:
result += f" + {rest:d}/{divisor:d}"
else:
result = format(value, format_spec)
if format_spec.endswith('f') or isinstance(value, float):
result = result.replace('.', ',')
return result
def evaluate(self, format_string, **kwargs):
text = format_string.split('=')[0].format(**kwargs)
return Parser().evaluate(text, {})
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
Bärenstark! Die Lösung stimmt, ... aber das Ergebnis, die Zahl mit der die Eingabe verglichen wird, passt immer noch nicht ganz. Das Ergebnis (in deinem Code "loesung") ist immer noch eine Kommazahl. Ich habe mir jetzt so geholfen:
Auch da komme ich nicht weiter:
und
habe ich den Code lokal zum laufen gebracht. Da wird aber die Biblithek doch auf meinem Computer installiert. Das geht aber bei https://www.programiz.com/python-progra ... -compiler/ nicht. Das habe ich wieder nicht kapiert
. Kann ich mit Jupyter Notebook, deinen Code auch lokal auf meinem Computer ausprobieren - das habe ich ebenfalls nicht kapiert
- bringt mich Jupyter Notebook weiter?
Code: Alles auswählen
ergebnis = formatter.evaluate(loesung, **variablen)
if "r" in loesung.split("=")[1]:
ergebnis=ergebnis//1
lsg = (formatter.format(loesung, ergebnis, **variablen))
Mit
Code: Alles auswählen
pip install py_expression_eval
Code: Alles auswählen
> from py_expression_eval import Parser
> parser = Parser()


https://www.programiz.com/learn-python/faq
Compiler
2. Certain modules are not present in the Python interpreter. Why?
As of now, only basic modules are available in the interpreter (compiler). However, we are working to enable additional modules.
Compiler
2. Certain modules are not present in the Python interpreter. Why?
As of now, only basic modules are available in the interpreter (compiler). However, we are working to enable additional modules.
_______________________________________________________________________________
https://www.python-kurs.eu/index.php
https://learnxinyminutes.com/docs/python/ https://learnxinyminutes.com/docs/de-de/python-de/
https://quickref.me/python https://docs.python-guide.org/
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
Genau
-
- User
- Beiträge: 1050
- Registriert: Sonntag 19. September 2021, 09:40
So, ich bin jetzt an Aufgaben mit diesem Problem.grubenfox hat geschrieben: ↑Donnerstag 30. März 2023, 16:24Würde ich jetzt auch gruppieren, warum sollte man es anders machen?Pitwheazle hat geschrieben: ↑Donnerstag 30. März 2023, 15:56 4. Ich hatte an Aufgaben mit Division gedacht bei denen ja kein Rest entstehen soll wie z.B.
"Ein Sportler legt in 1 Stunde eine Strecke von 12 km zurück. Wie weit kommt er in 45 Minuten?" Da muss ich sicherstellen, dass alle Kombinationen von Strecke und Zeit sicher geteilt werden können und hätte sie gruppiert. Geht aber sicher auch anders.Code: Alles auswählen
variablen_auswahl = { "a": [ (1, 12, 45), ],
Der obige Aufgabentext müsste ja eher ""Ein Sportler legt in {a[0][a[1] eine Strecke von {b} km zurück. Wie weit kommt er in {c} Minuten?"
Oder meine Aufgabe jetzt:
Code: Alles auswählen
Ein Auto fährt mit einer Geschwindigkeit von {a}km/h. Wie lange braucht es, um eine Strecke von {b}km zurückzulegen?
{"a": [60,90],"b": [180]}