Spaces:
Sleeping
Sleeping
import gradio as gr | |
import random | |
def generate_problem(operation, min_value, max_value): | |
""" | |
Generates a random math problem based on the selected operation and range. | |
""" | |
# Ensure min_value is less than or equal to max_value | |
if min_value > max_value: | |
min_value, max_value = max_value, min_value | |
num1 = random.randint(int(min_value), int(max_value)) | |
num2 = random.randint(int(min_value), int(max_value)) | |
# Avoid division by zero | |
if operation == 'Divide': | |
while num2 == 0: | |
num2 = random.randint(int(min_value), int(max_value)) | |
return num1, num2 | |
def update_question(operation, min_value, max_value): | |
""" | |
Updates the question text and generates new random numbers. | |
""" | |
num1, num2 = generate_problem(operation, min_value, max_value) | |
op_symbol = {'Add': '+', 'Subtract': '-', 'Multiply': '*', 'Divide': '/'}[operation] | |
question = f"What is {num1} {op_symbol} {num2}?" | |
return question, num1, num2 | |
def check_answer(operation, user_answer, num1, num2, min_value, max_value, correct_tally, incorrect_tally): | |
""" | |
Checks the user's answer, updates tallies, and returns the result message and a new question. | |
""" | |
# Calculate the correct answer | |
if operation == 'Add': | |
correct_answer = num1 + num2 | |
elif operation == 'Subtract': | |
correct_answer = num1 - num2 | |
elif operation == 'Multiply': | |
correct_answer = num1 * num2 | |
elif operation == 'Divide': | |
correct_answer = num1 / num2 | |
# Check if the user's answer is correct | |
if user_answer == correct_answer: | |
result = "Correct!" | |
correct_tally += 1 | |
else: | |
result = f"Incorrect. The correct answer is {correct_answer}." | |
incorrect_tally += 1 | |
# Generate a new question for the next round | |
question_new, num1_new, num2_new = update_question(operation, min_value, max_value) | |
# Prepare the tally message | |
tally_message = f"Correct Answers: {correct_tally}\nIncorrect Answers: {incorrect_tally}" | |
# Return all updated values | |
return result, question_new, num1_new, num2_new, correct_tally, incorrect_tally, tally_message | |
def reset_tallies(correct_tally, incorrect_tally): | |
""" | |
Resets the correct and incorrect tallies to zero and updates the tally display. | |
""" | |
correct_tally = 0 | |
incorrect_tally = 0 | |
tally_message = f"Correct Answers: {correct_tally}\nIncorrect Answers: {incorrect_tally}" | |
return correct_tally, incorrect_tally, tally_message | |
with gr.Blocks() as demo: | |
gr.Markdown("## Math Quiz\nSelect an operation, set the range, solve the problem, and enter your answer.") | |
with gr.Row(): | |
# Operation selection | |
operation = gr.Radio(['Add', 'Subtract', 'Multiply', 'Divide'], label='Select Operation', value='Add') | |
# Range inputs | |
min_value = gr.Number(label='Minimum Value', value=-100) | |
max_value = gr.Number(label='Maximum Value', value=100) | |
# Question display | |
question_text = gr.Textbox(label='Question', interactive=False) | |
# User's answer input | |
answer = gr.Number(label='Your Answer') | |
# Result display | |
result = gr.Textbox(label='Result', interactive=False) | |
# Tally display | |
tally_display = gr.Textbox(label='Tally', value="Correct Answers: 0\nIncorrect Answers: 0", interactive=False) | |
with gr.Row(): | |
# Button to check the answer | |
check_button = gr.Button('Check Answer') | |
# Button to reset tallies | |
reset_button = gr.Button('Reset Tallies') | |
# Hidden states to store the current numbers and tallies | |
num1_state = gr.State() | |
num2_state = gr.State() | |
correct_tally = gr.State(0) | |
incorrect_tally = gr.State(0) | |
# Initialize the interface with the first question and tallies | |
def init_interface(): | |
question, num1, num2 = update_question(operation.value, min_value.value, max_value.value) | |
tally_message = f"Correct Answers: {correct_tally.value}\nIncorrect Answers: {incorrect_tally.value}" | |
return question, num1, num2, tally_message | |
# Set initial values for the question, numbers, and tally | |
init_question, init_num1, init_num2, init_tally_message = init_interface() | |
question_text.value = init_question | |
num1_state.value = init_num1 | |
num2_state.value = init_num2 | |
tally_display.value = init_tally_message | |
# Update the question when the operation or range changes | |
def on_operation_or_range_change(op, min_val, max_val, correct_tally, incorrect_tally): | |
question, num1, num2 = update_question(op, min_val, max_val) | |
tally_message = f"Correct Answers: {correct_tally}\nIncorrect Answers: {incorrect_tally}" | |
return question, num1, num2, tally_message | |
operation.change( | |
fn=on_operation_or_range_change, | |
inputs=[operation, min_value, max_value, correct_tally, incorrect_tally], | |
outputs=[question_text, num1_state, num2_state, tally_display] | |
) | |
min_value.change( | |
fn=on_operation_or_range_change, | |
inputs=[operation, min_value, max_value, correct_tally, incorrect_tally], | |
outputs=[question_text, num1_state, num2_state, tally_display] | |
) | |
max_value.change( | |
fn=on_operation_or_range_change, | |
inputs=[operation, min_value, max_value, correct_tally, incorrect_tally], | |
outputs=[question_text, num1_state, num2_state, tally_display] | |
) | |
# Check the user's answer when the button is clicked | |
def on_check_answer(operation, user_answer, num1, num2, min_value, max_value, correct_tally, incorrect_tally): | |
result_text, question_new, num1_new, num2_new, correct_tally_new, incorrect_tally_new, tally_message = check_answer( | |
operation, user_answer, num1, num2, min_value, max_value, correct_tally, incorrect_tally) | |
return result_text, question_new, num1_new, num2_new, correct_tally_new, incorrect_tally_new, tally_message | |
check_button.click( | |
fn=on_check_answer, | |
inputs=[operation, answer, num1_state, num2_state, min_value, max_value, correct_tally, incorrect_tally], | |
outputs=[result, question_text, num1_state, num2_state, correct_tally, incorrect_tally, tally_display] | |
) | |
# Reset the tallies when the reset button is clicked | |
def on_reset_tallies(correct_tally, incorrect_tally): | |
correct_tally_new, incorrect_tally_new, tally_message = reset_tallies(correct_tally, incorrect_tally) | |
return correct_tally_new, incorrect_tally_new, tally_message | |
reset_button.click( | |
fn=on_reset_tallies, | |
inputs=[correct_tally, incorrect_tally], | |
outputs=[correct_tally, incorrect_tally, tally_display] | |
) | |
demo.launch(share=True) |