ddooling's picture
added applicatoin file app.py and requiments.txt
3a3744e
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)