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) |