import os os.system("pip install gradio==3.47.1") import gradio as gr import pandas as pd import random import json import time USERS = ["June", "Sean", "Woojoo", "Taejoo", "Dummy"] QUESTION_TEMPLATE = {"question": "다음 포켓몬의 이름은 뭘까요?![]({img_url})", "answer": "{name}"} def get_question_answer(): a = random.randint(0, 5) b = random.randint(0, 6) c = a + b q = f"$${a} + {b} = \square$$" a = f"{c}" return q, a info = {u: {"done" : True, "score": 0, "count": 0, "best_score": 0, "best_time": float("inf"), "time": 0.0} for u in USERS} MD = """# 수학 퀴즈 ## 사용방법 1. 사용자를 선택하세요. 2. 총 퀴즈 개수를 선택하세요. ## 점수판 {content} """ with gr.Blocks() as demo: answer = gr.State(value="") with gr.Row(): with gr.Column(): markdown = gr.Markdown(MD.format(content='')) user = gr.Radio(USERS, value="Taejoo", label="사용자", info="당신은 누구신가요?") quiz_count = gr.Radio([10, 20, 30], value=10, label="총 퀴즈 개수", info="퀴즈를 몇 개 풀 예정인가요?") with gr.Column(): with gr.Row(): play = gr.Button(value="퀴즈 시작", label="퀴즈 시작") skip = gr.Button(value="문제 넘어가기", label="문제 스킵") stop = gr.Button(value="퀴즈 종료", label="퀴즈 종료") chatbot = gr.Chatbot(bubble_full_width=False, avatar_images=["https://huggingface.co/spaces/yoon-gu/pokemon/resolve/main/images/No_0001_이상해씨.png", "https://huggingface.co/spaces/yoon-gu/pokemon/resolve/main/images/No_0155_브케인.png"]) msg = gr.Textbox(placeholder="문제의 답을 입력하세요.", label="답") def respond(message, chat_history, user, quiz_count, request: gr.Request): message = message.strip() done = info[user]['done'] if done: if "퀴즈시작" == message.replace(" ", ""): q, a = get_question_answer() bot_message = f"퀴즈를 시작합니다. 빈칸에 들어갈 숫자를 맞춰주세요.\n{q}" answer.value = a info[user]['done'] = False info[user]['score'] = 0 info[user]['count'] = 0 info[user]['time'] = time.time() else: bot_message = "퀴즈를 시작하고 싶으시면, **퀴즈 시작** 버튼을 누르세요." else: if answer.value == message: q, a = get_question_answer() answer.value = a info[user]['score'] += 1 info[user]['count'] += 1 bot_message = f"🎉정답입니다! 다음 문제입니다.\n- 현재 점수: {info[user]['score']}점\n- 소요 시간: {time.time() - info[user]['time']:4.3f}초\n빈칸에 들어갈 숫자를 맞춰주세요.{q}" elif "퀴즈종료" == message.replace(" ", ""): bot_message = f"퀴즈를 강제 종료합니다." info[user]['done'] = True elif "문제 넘어가기" == message: info[user]['count'] += 1 q, a = get_question_answer() answer.value = a bot_message = f"문제를 넘어갑니다. 다음 문제입니다.\n{q}" else: bot_message = f"***{message}***!? 🧐 다시 한번 생각해보세요." info[user]['score'] -= 0.1 if quiz_count == info[user]['count']: bot_message = f"모든 퀴즈를 다 풀었습니다. 점수는 {info[user]['score']:3.1f}점 입니다." info[user]['done'] = True if info[user]['score'] >= info[user]['best_score']: info[user]['best_score'] = info[user]['score'] info[user]['best_time'] = min(time.time() - info[user]['time'], info[user]['best_time']) chat_history.append((message, bot_message)) leader_board = sorted(info.items(), key=lambda x: (x[1]['best_score'], -x[1]['best_time']), reverse=True) lbdf = pd.DataFrame([dict(**a[1], name=a[0]) for a in leader_board]) lbdf.index += 1 md = lbdf[['name', 'best_score', 'best_time']].to_markdown() return "", chat_history, MD.format(content=md) play.click(respond, inputs=[play, chatbot, user, quiz_count], outputs=[msg, chatbot, markdown]) skip.click(respond, inputs=[skip, chatbot, user, quiz_count], outputs=[msg, chatbot, markdown]) stop.click(respond, inputs=[stop, chatbot, user, quiz_count], outputs=[msg, chatbot, markdown]) def update_table(): leader_board = sorted(info.items(), key=lambda x: (x[1]['best_score'], -x[1]['best_time']), reverse=True) lbdf = pd.DataFrame([dict(**a[1], name=a[0]) for a in leader_board]) lbdf.index += 1 md = lbdf[['name', 'best_score', 'best_time']].to_markdown() return MD.format(content=md) demo.load(update_table, inputs=None, outputs=markdown) msg.submit(respond, [msg, chatbot, user, quiz_count], [msg, chatbot, markdown]) demo.queue(concurrency_count=1) demo.launch()