gesucht wird eine kreative Methode um Sachaufgaben zu erstellen

Django, Flask, Bottle, WSGI, CGI…
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

und was mache ich jetzt damit, damit ich es in der Datenbank speichern kann?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Pitwheazle
User
Beiträge: 873
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.
Benutzeravatar
grubenfox
User
Beiträge: 431
Registriert: Freitag 2. Dezember 2022, 15:49

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.
Würde ich jetzt auch gruppieren, warum sollte man es anders machen?

Code: Alles auswählen

variablen_auswahl = {
    "a": [
        (1, 12, 45),
],
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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:

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))
Pitwheazle
User
Beiträge: 873
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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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))
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Das mit dem „print“ erzeugt das JSONTeil!
Pitwheazle
User
Beiträge: 873
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
Sirius3 hat geschrieben: Donnerstag 30. März 2023, 20:19 print(json.dumps(variablen_auswahl))
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!
Pitwheazle
User
Beiträge: 873
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:

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))
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.
Pitwheazle
User
Beiträge: 873
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 ...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, das mit dem Runden hatte ich nicht auf dem Schirm.

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, {})
Der `parser` wird so, wie jedes andere Paket auch, installiert.
Pitwheazle
User
Beiträge: 873
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:

Code: Alles auswählen

        ergebnis = formatter.evaluate(loesung, **variablen)
        if "r" in loesung.split("=")[1]:
            ergebnis=ergebnis//1
        lsg = (formatter.format(loesung, ergebnis, **variablen))
Auch da komme ich nicht weiter:
Sirius3 hat geschrieben: Montag 3. April 2023, 18:45 Der `parser` wird so, wie jedes andere Paket auch, installiert.
Mit

Code: Alles auswählen

pip install py_expression_eval
und

Code: Alles auswählen

> from py_expression_eval import Parser
> parser = Parser()
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 :oops: . Kann ich mit Jupyter Notebook, deinen Code auch lokal auf meinem Computer ausprobieren - das habe ich ebenfalls nicht kapiert :oops: - bringt mich Jupyter Notebook weiter?
Benutzeravatar
grubenfox
User
Beiträge: 431
Registriert: Freitag 2. Dezember 2022, 15:49

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.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

grubenfox hat geschrieben: Dienstag 4. April 2023, 13:00 2. Certain modules are not present in the Python interpreter.
Genau
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

grubenfox hat geschrieben: Donnerstag 30. März 2023, 16:24
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.
Würde ich jetzt auch gruppieren, warum sollte man es anders machen?

Code: Alles auswählen

variablen_auswahl = {
    "a": [
        (1, 12, 45),
],
So, ich bin jetzt an Aufgaben mit diesem Problem.
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]}
... da ist es nicht einfach, Zahlen zu finden, die beliebig kombinierbar sind. Daher war meine Idee, jeweils Zahlenpaare in {a} und {b} zu verknüpfen und diese mit einer gemeinsamen Zufallszahl aufzurufen.
Antworten