Pilotenboard.de :: DLR-Test Infos, Ausbildung, Erfahrungsberichte :: operated by SkyTest® :: Foren-Übersicht

 Wiki  ChatChat  FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin   RegistrierenRegistrieren 

Mathemakustik Python-Skript

 
Neues Thema eröffnen   Neue Antwort erstellen    Pilotenboard.de :: DLR-Test Infos, Ausbildung, Erfahrungsberichte :: operated by SkyTest® :: Foren-Übersicht -> Mathematik-Übungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Maxim6077
Bruchpilot
Bruchpilot


Anmeldungsdatum: 20.08.2025
Beiträge: 1

BeitragVerfasst am: Mi Aug 20, 2025 5:43 pm    Titel: Mathemakustik Python-Skript Antworten mit Zitat

Hallo Gemeinde,

da dies mein erster Post ist, moechte ich mich vorerst fuer die zahlreichen Informationen bedanken.

Nun zum Thema:
Ich bin gerade in der Vorbereitung fuer meine EFA BU. Beim Kopfrechnen wiederholen sich die Aufgaben bekanntlich ja, weshalb die Vorbereitung darueber eher mittelmaessig ist. Nun hoert man oefters von Mathemakustik, einem Programm, welches dir fuer 20 Euro Mathematikaufgaben vorliest.
Da ich es allerdings nicht einsehe fuer so eine Lappalie Geld auszugeben, habe ich ein Pythonskript geschrieben, welches genau das auch kann.

Code:

import random
import pyttsx3
import winsound
import threading
import time
from inputimeout import inputimeout, TimeoutOccurred

# ==============================
# ========== CONFIG ===========
# ==============================
NUM_TASKS = 25           
ADD_MAX = 1000           
SUB_MAX = 1000           
MUL_MAX = 30             
DIV_MAX = 30             
TIME_LIMIT = 30           
WARNING_BEFORE = 5       
BEEP_FREQUENCY = 1000     
BEEP_DURATION = 500       
TTS_RATE = 135           

DIFFICULTY = "hard"   # "normal" oder "hard"

# ==============================
# TTS Funktion
# ==============================
def speak(text, rate=TTS_RATE):
    engine = pyttsx3.init()
    engine.setProperty('rate', rate)
    voices = engine.getProperty('voices')
    engine.setProperty('voice', voices[0].id)
    engine.say(text)
    engine.runAndWait()
    engine.stop()

# ==============================
# Signalton vor Ablauf
# ==============================

def warning_beep(stop_event, wait_time=TIME_LIMIT, frequency=BEEP_FREQUENCY, duration=BEEP_DURATION):
    for _ in range(wait_time - WARNING_BEFORE):
        if stop_event.is_set():
            return
        time.sleep(1)
    if not stop_event.is_set():
        winsound.Beep(frequency, duration)
       
# ==============================
# Aufgaben-Generator
# ==============================

def generate_task(task_type):
    if task_type == "add":
        a = random.randint(1, ADD_MAX)
        b = random.randint(1, ADD_MAX)
        expr = f"{a} plus {b}"
        result = a + b
        return expr, expr, result

    elif task_type == "sub":
        a = random.randint(1, SUB_MAX)
        b = random.randint(1, SUB_MAX)

        # 75% Chance, dass Ergebnis positiv, 25% Chance negativ
        if random.random() <0> a:
            a, b = b, a  # gr??ere Zahl zuerst → positiv
        # sonst a und b belassen → negativ m?glich

        expr = f"{a} minus {b}"
        spoken_expr = expr
        result = a - b
        return expr, spoken_expr, result


    elif task_type == "mul":
        a = random.randint(2, MUL_MAX)
        b = random.randint(2, MUL_MAX)
        expr = f"{a} mal {b}"
        result = a * b
        return expr, expr, result

    elif task_type == "div":
        # Ergebnis zwischen 1 und DIV_MAX
        result = random.randint(2, DIV_MAX)
   
        # Divisor b darf nicht 1 sein und nicht gleich dem Ergebnis
        b_candidates = [x for x in range(2, DIV_MAX+1) if x != result]
        b = random.choice(b_candidates)
   
        a = result * b
        expr = f"{a} geteilt durch {b}"
        return expr, expr, result



# ==============================
# Trainingsdurchlauf
# ==============================

def run_training():
    speak(f"Willkommen zum Kopfrechentraining. Es folgen {NUM_TASKS} Aufgaben.")
    print(f"🔢 Kopfrechentraining gestartet ({NUM_TASKS} Aufgaben).")
    print("Dr?cke Strg+C zum Abbrechen.n")

    task_types = ["add", "sub", "mul", "div"] * (NUM_TASKS // 4)
    while len(task_types) < NUM_TASKS:
        task_types.append(random.choice(["add", "sub", "mul", "div"]))
    random.shuffle(task_types)

    correct = 0
    total = len(task_types)
    user_answers = []

    for i, task_type in enumerate(task_types, 1):
        expr, spoken_expr, result = generate_task(task_type)
        if DIFFICULTY == "hard":
            speak(f"{spoken_expr}")  # nur TTS, keine sofortige R?ckmeldung
        else:
            speak(f"{spoken_expr}")

        stop_event = threading.Event()
        timer_thread = threading.Thread(target=warning_beep, args=(stop_event,))
        timer_thread.daemon = True
        timer_thread.start()

        try:
            user_input = inputimeout(prompt=f"({i}/{total}) Deine L?sung: ", timeout=TIME_LIMIT)
            stop_event.set()
        except TimeoutOccurred:
            stop_event.set()
            speak(f"Zeit abgelaufen.")
            if DIFFICULTY == "normal":
                print(f"⏰ Zeit abgelaufen → L?sung: {expr} = {result}n")
            user_answers.append((expr, result, None))
            continue

        try:
            user_result = float(user_input.replace(",", "."))
            user_answers.append((expr, result, user_result))
            if DIFFICULTY == "normal":
                if abs(user_result - result) < 1e-6:
                    speak("Richtig!")
                    print(f"✅ Richtig! {expr} = {result}n")
                    correct += 1
                else:
                    speak("Falsch.")
                    print(f"❌ Falsch → L?sung: {expr} = {result}n")
        except ValueError:
            speak("Ung?ltig.")
            print("⚠️ Ung?ltige Eingabe.n")
            user_answers.append((expr, result, None))

    # ==============================
    # Endauswertung
    # ==============================
    print("n📊 Endauswertung:")
    for expr, result, user_result in user_answers:
        if user_result is None:
            status = "⏰ keine Eingabe"
            display_input = "-"
        elif abs(user_result - result) < 1e-6:
            status = "✅ richtig"
            display_input = user_result
            correct += 1
        else:
            status = "❌ falsch"
            display_input = user_result
        print(f"{expr} → Deine Eingabe: {display_input}, {status}, L?sung: {result}")

    percentage = (correct / total) * 100
    speak(f"Training beendet. Du hast {correct} von {total} Aufgaben richtig.")
    speak(f"Das sind {percentage:.1f} Prozent.")
    print(f"n📊 Gesamt: {correct}/{total} richtig = {percentage:.1f}%")

# ==============================
# Hauptprogramm
# ==============================
def main():
    while True:
        run_training()
        try:
            again = input("nM?chtest du noch einmal trainieren? (j/n): ").strip().lower()
        except KeyboardInterrupt:
            print("nTraining beendet.")
            break
        if again != "j":
            print("Training beendet.")
            break

# ==============================
if __name__ == "__main__":
    main()


Allerdings ist das Ganze noch nicht ganz und wuerde mich ueber Verbesserungsvorschlaege/Meinungen freuen.

Das Ganze ist auch als .exe verfuegbar.

Vielen Dank
Max
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
   
Neues Thema eröffnen   Neue Antwort erstellen    Pilotenboard.de :: DLR-Test Infos, Ausbildung, Erfahrungsberichte :: operated by SkyTest® :: Foren-Übersicht -> Mathematik-Übungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Impressum        Datenschutzbestimmungen nach DSGVO

Cobalt by Jakob Persson
Cobalt phpBB Theme/Template by Jakob Persson.
Copyright © Jakob Persson 2002.

Powered by phpBB © 2001, 2002 phpBB Group